「AIが学習する」「モデルを訓練する」——こうした言葉を、私たちは毎日のように見聞きします。しかし、AIが学習しているとき、その内部では具体的に何が起きているのでしょうか。先生が答えを教えているわけでも、AIが本を読んで暗記しているわけでもありません。実際に行われているのは、膨大な数の「重み」と呼ばれるつまみを、ほんの少しずつ回して調整し続ける という、ひたすら地道な作業です。
その調整を、的確に・効率よく行うための仕組みが、この記事の主役である バックプロパゲーション(backpropagation、誤差逆伝播法) と 勾配降下法(gradient descent) です。この2つは、現代のディープラーニング——画像認識から大規模言語モデルまで——のほぼすべてを動かしている、いわば「学習のエンジン」です。
ニューラルネットワークとはの記事では、AIが多数のユニット(ニューロン)の繋がりでできていることを説明しました。この記事はその続編にあたります。ニューラルネットワークが「重みを調整して学ぶ」と言うとき、その**「どうやって」**の中身を、損失関数・勾配降下法・誤差逆伝播という3つの道具立てに分けて、数式を最小限に掘り下げます。
学習とは「重みを少しずつ調整する」こと
ニューラルネットワークは、入力(たとえば手書き数字の画像)を受け取り、たくさんのユニットを通して計算し、出力(「これは7です」といった答え)を返します。各ユニットの繋がりには、それぞれ 重み(weight) という数値がついています。重みは「この信号をどれくらい重視するか」を決めるつまみで、大きなネットワークでは数十億個にもなります。これがパラメータの正体です。
学習を始めたばかりのネットワークは、重みがでたらめな初期値になっているので、答えもでたらめです。「7」の画像を見せても「これは2です」と自信満々に間違える。学習とは、こうした間違いを材料にして、重みのつまみを「正解に近づく方向」へ少しずつ回していく 作業のことです。問題は、数十億個もあるつまみを、どちらに、どれだけ回せばよいかをどうやって知るのか、という点にあります。それを解くのが、これから見る3つの道具です。
道具①:損失関数 ——「どれだけ間違えたか」を1つの数字にする
つまみを回す方向を知るには、まず「いまどれくらい間違えているか」を測らなければなりません。その物差しが 損失関数(loss function) です。損失は、ネットワークの出した答えと、本来の正解との「ズレ」を1つの数値にまとめたもので、完璧に正解していれば0、外れているほど大きくなります。
たとえば「7」の画像に対して、ネットワークが「7である確率20%、2である確率70%」と答えたなら、正解からのズレは大きく、損失は高くなります。学習が進んで「7である確率95%」と答えられるようになれば、損失は小さくなります。つまり学習のゴールは、すべての訓練データにわたって、この損失をできるだけ小さくする重みの組み合わせを見つけること に言い換えられます。こうして「賢くする」という曖昧な目標が、「損失という数字を最小化する」という、数学で扱える問題に変換されるのです。
道具②:勾配降下法 —— 霧の山を下りるように損失を減らす
損失を最小化する、と言っても、数十億個の重みの組み合わせは天文学的で、すべて試すことは到底できません。そこで使われるのが 勾配降下法 です。
Wikipediaは勾配降下法を「微分可能な多変数関数を最小化するための、一次の反復アルゴリズム」3と定義します。仕組みは、ある地点から「その点での負の勾配(−∇f)の方向」3、つまり最も急に下る方向へ少しずつ進む、というものです。これはよく 「霧の山を下りる」比喩 で説明されます。Wikipediaも、濃霧で全体が見えない山にいる人が下山するには「いまいる場所の傾きを調べ、最も急に下っている方向へ進む」3ほかない、と述べています。
損失(高さ)
\ ← いまここ(重みの現在値)
●
\ ↓ 傾きが急な方向へ一歩
\●
\ ↓ また傾きを測って一歩
\●____
\●___ ← 谷底(損失が最小=学習のゴール)
─────────────────────────► 重みの値
足元の傾き(勾配)を測り、最も急な下り方向へ一歩進む。進んだ先でまた傾きを測り、また一歩進む。これを繰り返せば、いつか谷底(損失が最小になる重み)にたどり着ける——これが勾配降下法の発想です。
ここで一歩の大きさを決めるのが 学習率(learning rate) という設定値です。Wikipediaは、学習率が「小さすぎると収束が遅くなり、大きすぎると行き過ぎて発散する」3と指摘します。歩幅が小さすぎれば谷底まで永遠にかかり、大きすぎれば谷を飛び越えて反対側の斜面に乗り上げてしまう。この学習率の調整は、AI開発で最も基本的かつ重要なチューニングのひとつです。
| 学習率 | 比喩 | 結果 |
|---|---|---|
| 小さすぎる | そろそろと小股で歩く | 谷底まで時間がかかりすぎる |
| 適切 | ほどよい歩幅で下る | 効率よく谷底に近づく |
| 大きすぎる | 大股で飛び跳ねる | 谷を飛び越えて発散・不安定 |
道具③:バックプロパゲーション ——「誰がどれだけ悪かったか」を逆向きに配分する
勾配降下法は「傾きの方向へ進めばよい」と教えてくれます。しかし残る難問があります。数十億個の重み一つひとつについて、「それを少し動かしたら損失がどう変わるか(=傾き)」を、どうやって効率よく計算するのか。一つずつ「この重みを動かしてみて損失を測る」を繰り返していたら、現実的な時間では到底終わりません。
この問題をエレガントに解くのが、バックプロパゲーション(誤差逆伝播法)です。Wikipediaの定義では「(単一の入出力例について)損失の、ネットワークの重みに関する勾配を効率的に計算する手法」2です。鍵となるのは、その計算を 出力側から入力側へ、一層ずつ逆向きに 進める点にあります。原理的には「出力層から入力層へ、一層ずつ微分を逆向きに伝播させる」2もので、その正体は高校数学にも出てくる 連鎖律(chain rule、合成関数の微分)をニューラルネットワークに効率よく当てはめたもの 2です。
直感的には、こう考えると分かりやすいでしょう。まず入力から出力へ計算を進め(順伝播)、出た答えと正解のズレ=誤差を求めます。次に、その誤差を出力側から入力側へ逆向きにたどりながら、「最終的な間違いに、各重みがどれだけ責任があったか」を割り振っていきます。
【順伝播】入力 → 隠れ層 → 出力 → 損失(誤差)を計算
●──►●──►●──►● 「7を2と答えた。誤差はこれだけ」
【逆伝播】損失 ← 隠れ層 ← 出力 誤差の責任を逆向きに配分
●◄──●◄──●◄──● 「この重みが誤差にどれだけ効いたか」を各層で算出
↓
各重みを「責任の分だけ」勾配降下法で少し調整
たとえるなら、チームで失敗したプロジェクトの反省会です。最終的な失敗(出力の誤差)から逆算して、「この判断がどれだけ結果に響いたか」を工程の後ろから前へ順にたどり、各メンバー(各重み)の貢献度(責任)を割り出していく。バックプロパゲーションが優れているのは、この責任の割り出しを、無駄な計算を省いて一気に行える点です。Wikipediaも、素朴なやり方に比べて「不要な中間値を計算しない」2ことで効率を稼ぐと説明します。こうして全重みの勾配が分かれば、あとは勾配降下法で各重みを責任の分だけ調整する——順伝播・逆伝播・重み更新の繰り返しが、ニューラルネットワークの学習そのものです。
「計算」と「更新」は別の仕事
ここで一点、混同しやすい区別を押さえておきます。バックプロパゲーションと勾配降下法は、しばしばひとまとめに語られますが、役割が違います。Wikipediaは「厳密には、バックプロパゲーションという用語は勾配を効率的に計算するアルゴリズムだけを指し、その勾配をどう使うかは含まない」2と注意を促します。
つまり、バックプロパゲーションは「各重みの傾き(勾配)を計算する」係、勾配降下法はその「勾配を使って重みを更新する」係 です。前者が地図上で「どちらが下り坂か」を割り出し、後者が実際にその方向へ一歩を踏み出す。2つは分業しながら、学習というひとつの動作を成り立たせています。
実務の工夫:ミニバッチとエポック
理屈のうえでは、損失は「すべての訓練データ」にわたって計算するのが正確です。しかし数百万、数十億という規模のデータで毎回これをやると、一歩進むだけで膨大な計算がかかります。そこで実務では 確率的勾配降下法(SGD, stochastic gradient descent) が使われます。
Wikipediaの定義では、SGDは「全データから計算する真の勾配を、ランダムに選んだ部分集合から計算した推定値で置き換える」4手法です。全部を見て正確な一歩を選ぶ代わりに、一部のデータだけを見て「だいたいこっちが下り」と見当をつけて素早く一歩を踏み出す。Wikipediaはこれを「収束率は下がるが、反復は速くなる」4トレードオフだと述べます。
実際には、データを1件ずつではなく、数十〜数百件の小さなまとまりで処理する ミニバッチ(mini-batch) が一般的です4。そして、訓練データを 1周 することを エポック(epoch) と呼びます。学習では、データをシャッフルしながらこのエポックを何度も繰り返し、損失が十分小さくなる(収束する)まで重みを磨き続けます。「3エポック学習させた」といった表現は、訓練データを3周分使ってつまみを調整した、という意味なのです。
| 用語 | 意味 |
|---|---|
| バッチ(全データ) | すべての訓練データで勾配を計算(正確だが重い) |
| ミニバッチ | 数十〜数百件のまとまりで勾配を計算(実務の標準)4 |
| エポック | 訓練データを1周すること |
| 学習率 | 一歩の大きさ。小さすぎると遅く、大きすぎると発散3 |
なぜこの仕組みが「AIの土台」なのか
バックプロパゲーションは、決して新しいアイデアではありません。これを広く知らしめたのは、David Rumelhart、Geoffrey Hinton、Ronald Williamsが1986年に学術誌Natureに発表した論文「Learning representations by back-propagating errors(誤差逆伝播による表現の学習)」1でした。原典は、この手続きが「ネットワークの実際の出力と望ましい出力との差を最小化するよう、接続の重みを繰り返し調整する」1ものだと述べています。まさにこの記事で見てきた通りの説明です。
この論文が画期的だったのは、もう一つの指摘にあります。重みを調整していくと「入出力に属さない内部の『隠れ』ユニットが、タスク領域の重要な特徴を表現するようになる」1というのです。人間が「これは目、これは輪郭」と教え込まなくても、学習を通じてネットワークが自分で意味のある特徴を獲得していく——この「表現の自動獲得」こそ、後のディープラーニングの核心となりました。Wikipediaも、この1986年の研究が「広く引用され、バックプロパゲーションの普及に貢献し、1980年代のニューラルネットワーク研究の再興と時期を同じくした」2と評価しています(なお、ここで共著者として名を連ねるGeoffrey Hintonは、後にYoshua Bengio、Yann LeCunとともに「AIのゴッドファーザー(Godfather of AI)」と呼ばれる研究者の一人です)。
今日のGPTやClaudeのような巨大モデルも、画像を見分けるAIも、その学習の根っこでは、この記事で見た「損失を測り、勾配を逆伝播で求め、重みを少しずつ更新する」というサイクルを、想像を絶する回数だけ繰り返しています。派手な能力の裏側で黙々と回り続けているのは、霧の山を一歩ずつ下りるような、地道な計算の積み重ねなのです。
学習の仕組みをさらに知りたい方は、土台となるニューラルネットワークとはを、学習がうまくいきすぎて起きる失敗については過学習(オーバーフィッティング)とはを、学習済みモデルを後から目的に合わせ込む方法はファインチューニングとはを読み進めると、「AIが学ぶ」という言葉の中身がより立体的に見えてきます。
Sources
- Learning representations by back-propagating errors - David Rumelhart, Geoffrey Hinton, Ronald Williams、Nature 323巻 533–536頁、1986年。誤差逆伝播法を広めた原典論文
- Backpropagation - Wikipedia(誤差逆伝播の定義・連鎖律・勾配計算と更新の区別・歴史)
- Gradient descent - Wikipedia(勾配降下法の定義・負の勾配・学習率・霧の山の比喩)
- Stochastic gradient descent - Wikipedia(SGD・ミニバッチ・エポックの定義)