# 最急降下法のアルゴリズム・Pythonでの実装方法を分かりやすく解説！

> 本記事では、関数の最小値を求めるための最適化アルゴリズムの一つである最急降下法について解説していきます！実際にPythonで実装して、理解を深めていきましょう！

- URL: https://toukei-lab.com/gradient-descent
- 公開: 2025.09.08 / 更新: 2025.09.28
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
本記事では、関数の最小値を求めるための最適化アルゴリズムの一つである最急降下法について解説していきます！実際にPythonで実装して、理解を深めていきましょう！
:::

こんにちは！スタビジ編集部です！

機械学習について学んだことがある方は、一度は耳にしたことがあるかもしれない「最急降下法」。

しかし、<mark>「聞いたことはあるけれど、実際にどういうアルゴリズムなのかはよく分からない…」</mark>という方も多いのではないでしょうか。

本記事では、そんな方に向けて、最急降下法の基本的な仕組みからPythonによる実装方法までをわかりやすく解説します。

以下のYouTubeでも解説していますので、あわせてチェックしてみてください！

::youtube{#EFsLNO4LxFc}

確率的勾配降下法については、以下の動画で数式を使わずに解説しています！

::youtube{#JREVKlB8_qk}

## 最急降下法とは？基本概念をわかりやすく解説

最急降下法とは、<mark>目的関数の最小値を求めるための最適化アルゴリズムです。</mark>

目的関数の勾配（傾き）計算と、関数の値が最も小さくなる方向、つまり「最急降下」方向への移動を繰り返すことで、最小値を見つけていきます。

このアルゴリズムは、特に[機械学習](/machine-learning-fresh)や[深層学習](/deep-learning)で、モデルのパラメータを最適化する際によく使われています。

:::talk{who="umatan"}
最も急な方向に移動（降下）するから最急降下法なんだね！
:::

![gradient-descent](/wp-content/uploads/2025/08/gradient-descent-overview.jpg)

## 最急降下法のアルゴリズム

最急降下法のアルゴリズムは次の4ステップで説明することができます。

:::box{title="最急降下法のアルゴリズム"}
**1. 初期位置の設定**\
**2. 勾配（傾き）の計算**\
**3. 位置の更新**\
**4. 終了条件を満たすまで2\~3の繰り返し**
:::

下記の目的関数を例として、各ステップについて詳しく見ていきましょう！

:::box
目的関数：$f(x)=(x-4)^{2}$
:::

### 1. 初期位置の設定

まずは初期位置の設定を行います。

多くの場合ランダムに設定しますが、ひとまず今回は$x_{0}=1$を初期位置としてみましょう。

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-exa_1_.jpg)

### 2. 勾配（傾き）の計算

続いて現在地における勾配（傾き）を計算します。

勾配は**目的関数を微分**すればOK！今回の場合、導関数は以下の式で表すことができます。

:::box
導関数：$f^{‘}(x)=2x-8$
:::

そのため、$x_{0}=1$における勾配は$f^{‘}(x_{0})=2\times1-8=-6$となります。

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-exa_2_.jpg)

### 3. 位置の更新

そして、位置を更新（移動）します。

<mark>ここで必要となるのがステップ幅$\eta$（イータ）です。</mark>

$\eta$は移動する幅を決めるパラメータです。<mark>小さすぎると「ちょっとずつ進む」ため収束に時間がかかってしまい、大きすぎると「飛びすぎる」ため発散してしまう可能性があります。</mark>

そのため、移動の様子を観察しながら適切な値を見つけていく必要があります。

今回は$\eta=0.25$として、位置を更新してみます。

現在地を$x_{k}$として位置の更新を式で表すと

:::box
位置の更新：$x_{k+1}=x_{k}-\eta\times f^{‘}(x_{k})$
:::

となるので、更新後の位置$x_{1}$は$x_{1}=1-0.25\times -6=2.5$となります。

このとき、目的関数の値は$f(2.5)=(2.5-4)^{2}=2.25$となります。

**![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-exa_3.jpg)**

:::talk{who="umatan"}
$\eta$は学習率とも呼ばれているよ！
:::

### 4. 終了条件を満たすまで2\~3の繰り返し

あとは2\~3を繰り返し、終了条件を満たせばアルゴリズムは終了し、最小値とそのときの$x$の値が求まるというわけです（今回の例だと$x=4$のとき最小値0）。

終了条件には、<mark>「勾配の大きさが十分に小さい」、「（更新回数が）最大反復数に達したとき」</mark>などがあります。

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-exa_4.jpg)

:::talk{who="umatan"}
「最大反復数に達したとき」は更新回数の条件であって、必ずしも収束しているとは限らないので注意！
:::

このように勾配を使ってパラメータを少しずつ直していくのが、AIの「学習」です。学習したモデルで答えを出す「推論」とのちがいは、以下の記事で解説しています。

<https://toukei-lab.com/training-inference>

## 最急降下法のメリット・デメリット

ここまで最急降下法の概要について解説してきましたが、メリットとデメリットの両方が存在します。

### メリット：計算がシンプルで汎用性が高い

先ほど述べたように、最急降下法は「最急降下方向への移動を繰り返すことで、最小値を見つけていく」という、シンプルなアルゴリズムです。

<mark>故に、実装が簡単で、理解しやすい点が大きな強みです。</mark>

[線形回帰](/回帰分析)・[ロジスティック回帰](/ロジスティック回帰)・[ニューラルネットワーク](/nn)など、多くの機械学習モデルに適用することができます。

:::talk{who="umatan"}
単純な最急降下法を適用することもあるけど、実際には派生系アルゴリズムを適用することのほうが多いかも！
:::

派生系アルゴリズムには以下のようなものがあります。

:::box{title="代表的な派生系アルゴリズム"}
・SGD（確率的勾配降下法）\
・モーメンタム法\
・RMSProp
:::

### デメリット：局所最適解に陥る可能性がある

最急降下法は、初期位置を決めてそこから逐次的に最適解を探していくアルゴリズムです。

そのため<mark>局所最適解に陥ってしまい、大域最適解に到達できなくなってしまう可能性があります。</mark>

:::talk{who="umatan"}
求めたい解が求まらなくなってしまうんだ！
:::

**![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-badpoint.jpg)**

## 最急降下法をPythonで実装

それでは実際に最急降下法をPythonで実装していきましょう！

アルゴリズムの説明で用いた目的関数を例に実装してみます（初期位置、ステップ幅も同様）。

:::box
目的関数：$f(x)=(x-4)^{2}$
:::

終了条件として、「勾配が十分小さい」または「更新回数が1,000回に達したとき」を設定しています。

```python
import numpy as np
import matplotlib.pyplot as plt

# 目的関数 f(x) = (x - 4)^2
def f(x):
    return (x - 4)**2

# 勾配（微分） f'(x) = 2(x - 4)
def df(x):
    return 2 * (x - 4)

# 最急降下法の実装
def gradient_descent(df, init_x, eta=0.1, max_iter=1000, tol=1e-6):
    x = init_x                    # 初期値を設定
    history = [x]                 # 更新の履歴を保存
    converged = False             # 収束フラグ

    for i in range(max_iter):     # 最大反復回数までループ
        grad = df(x)              # 現在の点での勾配を計算

        # 収束判定：勾配が十分小さければ終了
        if abs(grad) < tol:
            print(f"収束しました (step={i+1})")
            converged = True
            break

        new_x = x - eta * grad    # 勾配方向にステップ幅 eta で更新
        history.append(new_x)     # 新しい点を履歴に追加
        x = new_x                 # 更新した値を次のステップの初期値に

    # 収束しなかった場合の表示
    if not converged:
        print("収束しませんでした（最大反復回数に到達）")

    return x, history, converged

# ===== 実行部分 =====

# 初期値を設定
x0 = 1.0
# ステップ幅（学習率）
eta = 0.25

# 最急降下法を実行
xmin, history, converged = gradient_descent(df, init_x=x0, eta=eta)

# 収束したときのみ表示
if converged:
    print("推定された最小値のx:", xmin)
    print("そのときのf(x):", f(xmin))

# ===== 可視化 =====

# 描画範囲の設定
x_vals = np.linspace(-1, 8, 400)   # x軸の範囲
y_vals = f(x_vals)                 # f(x) の値を計算

plt.figure(figsize=(8, 6))
plt.plot(x_vals, y_vals, label="f(x)")  # 目的関数の曲線を描画

# 更新の履歴（赤い点と軌跡）
history = np.array(history)
plt.plot(history, f(history), color="red", linestyle="--", marker="o", label="更新の軌跡")

# 収束した場合のみ最小点を強調表示
if converged:
    plt.scatter(xmin, f(xmin), color="blue", s=100, label="最小値 (推定)")

# グラフの装飾
plt.title("最急降下法の収束過程（f(x) = (x-4)^2）", fontsize=14)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.legend()
plt.grid(True)
plt.show()
```

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-result1.jpg)

<mark>更新回数は24回で、最小値とその時の$x$もしっかりと求められています。</mark>

続いて、ステップ幅を小さくした場合（eta = 0.01）はどうなるでしょうか。

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-result2.jpg)

<mark>きちんと最小値を求められていますが、更新回数は774回と先ほどより大幅に増えていることがわかります。</mark>

今度はステップ幅を大きくした場合（eta = 1.0）についても見てみましょう。

![gradient-descent](/wp-content/uploads/2025/09/gradient-descent-result3.jpg)

<mark>更新回数が1000回を超えても収束しませんでした（この場合、赤点の部分を繰り返し行き来しているだけとなっています）。</mark>

このように、ステップ幅の値によって、収束するか否か、または収束する速さが決まってきます。

<mark>可能であれば上図のように可視化を行い、移動の様子を観察しながら適切な値を見つけていきましょう！</mark>

## 最急降下法　まとめ

ここまで、最急降下法の概要とPythonでの実装方法について解説してきました。

最急降下法は「最も急な方向へ移動する」という、シンプルな手法です。

<mark>シンプルだからこそ理解しやすく、他の発展的なアルゴリズムを学ぶための出発点としても非常に重要な手法です。</mark>

これをきっかけに派生系の手法も学び、実際の問題に応じて適切な手法を選択できるようになっていきましょう！

さらに詳しくAIやデータサイエンスの勉強がしたい！という方は当サイト「スタビジ」が提供する[スタビジアカデミー](https://toukei-lab.com/achademy/)というサービスで体系的に学ぶことが可能ですので是非参考にしてみてください！

:::box
**AIデータサイエンス特化スクール「スタアカ」**

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)
:::

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}