微分と勾配降下法

回 7-1 分野 7 微分と積分

勾配降下法は、いまの場所の傾き (勾配) を計算し、傾きと逆の向きに「学習率 × 傾き」だけ動く操作を繰り返して、関数が一番小さくなる所に近づく方法です。式は x ← x − 学習率 × f′(x) です。y = (x − 3)² を x = 0 から学習率 0.1 で 20 歩動かすと、x は約 2.965 まで 3 に近づきます。学習率が大きすぎると、行き過ぎて発散します。

微分を「少し動かしたときの変化の割合」として数で求め、それを使った勾配降下法を、標準の Python だけで 1 歩ずつ動かして確かめます。

機械学習の「学習」は、何をしているのか

機械学習の模型が学習するとき、中では「誤差を表す関数の値が小さくなる向きに、数を少しだけ動かす」ことを何万回も繰り返しています。この方法が勾配降下法です。

どちらに動けば値が下がるかは、その場所の傾きで分かります。傾きを求める道具が微分です。傾きが正なら右上がりなので左へ、負なら右下がりなので右へ動けば、値は下がります。

この回では、微分を数で求めるところから始め、勾配降下法を標準の Python だけで 1 歩ずつ動かして確かめます。学習率の大きさで、近づくか、揺れるか、離れていくかが分かれる様子も見ます。

傾き、微分、勾配

傾きは「少し動かしたときの変化の割合」

関数 f(x) で、x を h だけ動かしたときの変化の割合は、(f(x + h) − f(x)) ÷ h です。h を 0 に近づけたときの値を、x での微分 (微分係数) と呼び、f′(x) と書きます。グラフで見ると、その点での接線の傾きです。

f(x) = (x − 3)² の微分は f′(x) = 2(x − 3) です。x = 0 なら傾きは −6 で、右へ動けば値が下がります。x = 3 では傾きが 0 で、ここが一番低い所です。

式が分からなくても、h を小さな数 (たとえば 0.00001) にして、(f(x + h) − f(x − h)) ÷ 2h を計算すれば、傾きのよい近似が出ます。これを数値微分と呼びます。

偏微分と勾配

変数が 2 つ以上ある関数 f(a, b) では、1 つの変数だけを動かし、ほかを止めたときの傾きを偏微分と呼びます。a で偏微分した値を ∂f/∂a と書きます。

全部の変数の偏微分を並べたベクトル (∂f/∂a, ∂f/∂b) を勾配と呼びます。ベクトルは数の並びのことで、6-1 ベクトルと内積の回で扱いました。勾配は、その場所で値が一番急に増える向きを指します。だから、勾配と逆の向きに動けば、値は一番急に減ります。

勾配降下法の更新の式

勾配降下法は、次の 1 歩を繰り返します。

x ← x − η × f′(x)

η (イータ) は学習率で、1 歩の大きさを決める数です。変数が何個あっても、全部の変数を「学習率 × その変数の偏微分」だけ同時に動かします。

手順

勾配降下法の手順は、次の通りです。

  1. 変数の初めの値を決める
  2. いまの値で、損失の勾配を計算する
  3. 変数を「学習率 × 勾配」だけ、勾配と逆の向きに動かす
  4. 損失の減り方が十分小さくなるか、決めた回数に達したら止める。そうでなければ 2 に戻る

損失関数

機械学習では、小さくしたい関数を損失関数と呼びます。たとえば、予想の値と正解の差を 2 乗して平均した平均二乗誤差です。模型の重みを変数にして、損失関数を勾配降下法で小さくするのが「学習」です。

学習率の大きさで、動き方が変わる

f(x) = (x − 3)² では、1 歩ごとに「3 からのずれ」が (1 − 2η) 倍になります。この倍率で動き方が決まります。

学習率 η1 歩ごとのずれの倍率動き方
0.010.98近づくが、とても遅い
0.10.8着実に近づく
0.501 歩でちょうど 3 に着く
0.9−0.83 の左右を行き来しながら近づく
1.1−1.2行き来するたびに離れ、発散する

η = 0.5 でちょうど着くのは、この関数だけの特別な事情です。関数が違えば、ちょうどよい学習率も違います。

動かして確かめる

1 本目は、数値微分で傾きを求め、式で出した傾き 2(x − 3) と比べます。

動かす 数値微分と式の傾き

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

0 -6.0 -6
1 -4.0 -4
3 0.0 0
5 4.0 4

どの x でも、数値微分と式の傾きが小数第 6 位まで一致しました。x = 0 と 1 では傾きが負なので、右 (x を増やす向き) へ動けば値が下がります。x = 5 では正なので左へ動きます。x = 3 では 0 です。

2 本目は、y = (x − 3)² を x = 0 から学習率 0.1 で 20 歩動かします。

動かす 勾配降下法で 20 歩

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

1 0.6 5.76
2 1.08 3.6864
5 2.017 0.966368
10 2.6779 0.103763
20 2.9654 0.001196
式 2.9654

1 歩目で x は 0 から 0.6 へ動きました。傾き −6 に学習率 0.1 を掛けた −0.6 を引いたからです。20 歩で x は約 2.965 まで 3 に近づき、y は約 0.0012 まで下がりました。3 からのずれが毎歩 0.8 倍になるので、20 歩後のずれは 3 × 0.8²⁰ で、式の値とも一致します。

3 本目は、学習率だけを変えて 20 歩動かし、最後の x を並べます。

動かす 学習率で収束と発散が分かれる

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

0.01 0.9972
0.1 2.9654
0.5 3.0
0.9 2.9654
1.1 -112.0128

0.01 では 20 歩で 1 にも届かず、遅すぎます。0.1 は約 2.965、0.5 はちょうど 3 です。0.9 は 3 の左右を行き来しながら、2.965 まで近づきました。1.1 は行き来するたびに離れ、20 歩で x は −112 になりました。3 から 100 以上離れています。学習率が大きすぎると、勾配降下法は答えに近づきません。

4 本目は、変数が 2 つの場合です。5 つの点に直線 y = a x + b を当てはめ、平均二乗誤差を a と b の偏微分で小さくします。

動かす 偏微分で直線を当てはめる

python実行可能
出力

▶ 実行ボタンを押すと結果がここに表示されます

実行すると、次の通りに出ます

1 0.882 0.241 12.303
10 1.866 0.484 0.056
100 1.925 0.286 0.0316
3000 1.99 0.05 0.0214

1 歩目から損失が下がり始め、3,000 歩で傾き a は約 1.99、切片 b は約 0.05 に落ち着きました。損失は約 0.021 で、点がもともと直線から少しずれている分は 0 になりません。a の偏微分は「誤差 × x の平均の 2 倍」、b の偏微分は「誤差の平均の 2 倍」で、両方を同時に動かしています。

この 5 点に誤差の 2 乗の和が一番小さい直線を式で求める方法 (最小二乗法) では、傾き 1.99、切片 0.05 です。勾配降下法は、同じ答えに歩いて近づいています。

勾配降下法が外れる所

一番低い所ではない谷で止まることがある

関数に谷がいくつもあると、勾配降下法は初めの場所に近い谷に下り、そこで傾きが 0 になって止まります。これを局所解と呼びます。変数が多いと、ある向きには谷で別の向きには山になっている、馬の鞍のような所 (鞍点) でも傾きが 0 に近くなり、動きが遅くなります。(x − 3)² のような谷が 1 つの関数では起きません。ニューラルネットの損失は谷がたくさんある形なので、初めの値や学習率によって、たどり着く谷が変わります。

変数ごとに大きさが違うと、遅くなる

一方の変数は 0.001 単位、もう一方は 1,000 単位というように大きさが大きく違うと、1 つの学習率が、片方には大きすぎ、片方には小さすぎになりやすくなります。学習の前に、特徴量を平均 0、標準偏差 1 にそろえる (標準化) と、勾配降下法が速く安定します。

止めどきは、数で決めておく

勾配降下法はいつまでも少しずつ動き続けるので、止める条件を決めます。よく使うのは、決めた回数に達した、損失の減り方が決めた値より小さくなった、勾配の大きさが十分小さくなった、の 3 つです。機械学習では、学習に使っていない検証用のデータで損失が下がらなくなったら止める方法もあります。

仕事でどう使うか

勾配降下法と微分を使う場面は、次の通りです。

  • 機械学習の学習。PyTorch のような道具は、損失の勾配を自動で計算 (自動微分) し、勾配降下法の仲間で重みを動かす。中でやっていることは、この頁の 4 本目と同じ形
  • 学習のログを読む。損失が下がらない、揺れる、急に大きくなるときは、学習率が小さすぎるか大きすぎることが多い。3 本目の表と照らす
  • 生成 AI の微調整。手元のデータで模型を少し学習させるときも、学習率と歩数を決めて勾配降下法で動かす
  • 数値微分でのテスト。自分で書いた勾配の式が正しいかを、1 本目の数値微分と比べて確かめる (勾配チェック)
  • 最適化の問題。広告の予算配分、価格、設定の値など、数で表せる良さを最大や最小にする値を探す

よくある問い

確率的勾配降下法 (SGD) やミニバッチとは何ですか

全部のデータで勾配を計算して 1 歩動く方法をバッチ勾配降下法、1 件だけで計算して動く方法を確率的勾配降下法 (SGD)、1 件より多く全部より少ない件数ずつ (数十から数百件がよく使われます) で計算して動く方法をミニバッチ勾配降下法と呼びます。データが多いと全部で計算するのは重いので、少しずつ取って何度も動くミニバッチがよく使われます。1 歩ごとの向きは揺れますが、データを偏りなく取り出していれば、その勾配の期待値 (4-2) は全部のデータの勾配と同じです。

学習率はどう決めればよいですか

決まった正解はなく、いくつかの値を試して損失の下がり方を見て決めます。初めは大きめにして、学習が進んだら小さくしていく方法 (学習率スケジューラー) もよく使います。損失が揺れたり大きくなったりしたら、学習率を下げます。

モメンタムや Adam は何が違いますか

どちらも勾配降下法の仲間です。モメンタムは、前の歩の動きを少し残して、同じ向きが続くと加速し、揺れを打ち消します。Adam は、モメンタムの考えに加えて、変数ごとに勾配の大きさの記録から 1 歩の大きさを自動で調整します。深層学習の多くの場面で、まず試される方法です。

微分の式が分からない関数でも使えますか

使えます。1 本目の数値微分で傾きを近似できます。ただし、変数が 100 万個あると、1 つずつ少し動かして計算するのは重すぎます。機械学習の道具は、計算の手順から勾配を正確に、速く求める自動微分を使っています。

確認クイズ

答えだと思う選択肢を押すと、その場で正誤と理由が開きます。3 問すべてに正しく答えると、この回は修了で、石が緑に変わります (この端末のブラウザに残ります)。間違えた問いは、あとから解き直せます。

1 問目

f(x) = (x − 3)² で、x = 1、学習率 0.25 のとき、勾配降下法の 1 歩のあとの x はいくつですか。

2 問目

勾配降下法で、損失が 1 歩ごとに大きくなり、値が行き来しながら離れていきました。最初に疑うのはどれですか。

3 問目

このコードを動かすと何が出ますか。

x = 0.0
for _ in range(2):
    x = x - 0.1 * 2 * (x - 3)
print(round(x, 2))

説明課題

「勾配降下法の 1 歩で、なぜ勾配を引く (勾配と逆の向きに動く) と損失が下がるのか」と「学習率が大きすぎると何が起きるか」を、傾きの言葉を使って 3 文で説明してください。書いたら、下の模範解答を開いて比べてください。

模範解答

自分の説明を書いてから開いて、比べてください。

この回の先の一歩

機械学習の学習が「損失の勾配を求めて少し動く」の繰り返しだと数で分かると、学習率を変えたときに何が起きるかを、ログの数から読めるようになります。いまの自分が転職までの道のどの段にいるかは、転職診断で確かめられます。

もっと深く

この回の続きを、ゆめさくのコースの章や道具で深められます。頁の中の確認クイズに答えたあと、手を動かす量を増やしたいときに使ってください。

一次資料

どれも 2026年10月30日に開いて、題と中身を確かめました。

次へ

分野 7 微分と積分の回

  1. 7-1微分と勾配傾き、偏微分、勾配降下法この回
  2. 7-2積分の考え細かく分けて足す、モンテカルロ法頁で読む

分野 7 の頁へ戻るほかの分野を見る