前回の宿題を、今日開けます
埋め込みの回で、単語の置き場所(意味のベクトル)は使われ方から学習で決まる、という話をしました。そしてその回は「では、その置き場所をどう調整していくのか。それはまた別の回に」と言って終わっていました。
三つの顔の回もそうです。同じ単語が Query・Key・Value の三役を演じ分けられるのは $W_Q, W_K, W_V$ という三つの行列のおかげ、と書きました。でも締めくくりで残した問いがありました。その三つの行列は、どうやって振り分け方を覚えたのか、と。
別々の記事で残した、別々の宿題に見えます。ところがこの二つ、実は同じ一つの仕組みの答えなんです。今日はその仕組みを開けていきます。


AI は無数のつまみでできている
埋め込みベクトルの中身は、0.21 とか −0.83 とか、そういう数字の並びでした。$W_Q, W_K, W_V$ の中身も、一つひとつは数字です。呼び名こそ違いますが、正体はどちらも同じで、あとから調整できる数、つまり「つまみ」です。
AI というのは、この調整できるつまみが無数に並んだ機械だと思ってください。学習とは、そのつまみを一つひとつ良い位置へ合わせていく作業です。
では「良い位置」を、機械はどうやって知るのでしょう。頼りは答え合わせです。埋め込みの回でいう「周りに出てくる単語を当てる練習」なら、当てが外れた分が、そのまま間違いの大きさになります。この答え合わせの結果を一つの数にまとめたものを、誤差(損失)と呼びます。機械にとっての、味見です。
料理でいえば、つまみが調味料のダイヤルで、味見が「一口食べて、目指す味からどれだけずれているか」を確かめること。学習は、味見しながらつまみを合わせていく作業に翻訳できます。
つまみが1個なら簡単です
いきなり無数のつまみだと話が大きすぎるので、まずはつまみが1個だけの、小さな機械で考えます。
この小さな機械にも、目指す正解があります。味見とは、いまの出力がその正解からどれだけずれているかを確かめること。そのずれの大きさが、さっきの誤差です。
つまみを少し回して、味見してみます。ずれが広がった、つまり誤差が増えました。なら、回すべきは逆です。このとき知りたいのは一つだけ。このつまみを少し動かすと、誤差はどっちに、どれだけ変わるのか。これを傾きと呼びます。
数式ではこの傾きを $\dfrac{\partial L}{\partial w}$ と書きます。$w$ がつまみ、$L$ が誤差です。記号 $\partial$ は、ほかのつまみは全部止めておいて、この $w$ だけを少し動かしたときに $L$ がどう変わるか、という意味の圧縮表記だと思ってください。「$w$ を少し動かしたときの、$L$ の変わり具合」。それだけです。
傾きが分かれば、つまみの動かし方はこう書けます。
$$ w \leftarrow w – \eta\,\dfrac{\partial L}{\partial w} $$
設計図を読むように、右から順に見ていきます。$\dfrac{\partial L}{\partial w}$ は傾き、つまり「動かすと誤差が増える向き」。その前にマイナスが付いているので、増える向きの逆、つまり誤差が減る向きへ動かします。$\eta$ は「少しだけ」の幅です。大きすぎると、勢い余って谷を飛び越えてしまいます。この一歩を計算して、いまのつまみの値を新しい値に置き換える。矢印 $\leftarrow$ はその置き換えを表しています。

これを何度も繰り返して、誤差の谷を少しずつ下っていく。傾き(勾配)を下っていくので、勾配降下と呼びます。
つまみが百万個あると、味見が破産します
さて、本物の AI に戻ります。つまみは百万個、いまどきのモデルなら数十億個あります(「百万個」はあくまで規模のイメージだと思ってください)。
さっきの手順を、そのまま素直に当てはめるとどうなるか。つまみ1番を少し動かして味見、元に戻して、次は2番を動かして味見、また戻して3番、と続けることになります。つまみの数だけ味見が要ります。百万個なら、味見が百万回。
しかも、この味見1回がそもそも軽くありません。GPU の回で見たとおり、AI の一回の計算は巨大な行列のかけ算の山です。その山を、つまみ1個の傾きを知るためだけに、まるごと一回登り直す。それを百万回。いくら GPU が速くても、学習の一歩ごとにこれを繰り返すのは、現実の時間では終わりません。ここで行き詰まります。

誤差から逆向きに、1回たどるだけ
行き詰まりの抜け道は、つまみたちが一列につながっている、という事実の中にあります。
入力があって、つまみ群を通って中間結果ができ、それがまたつまみ群を通って出力になり、最後に誤差が出る。手前のつまみは、中間結果を経由して誤差に効いています。直接ではなく、間に一段はさんで効いている。
ということは、影響は掛け算の鎖になります。
$$ \dfrac{\partial L}{\partial w} = \dfrac{\partial L}{\partial y}\cdot\dfrac{\partial y}{\partial w} $$
$y$ が中間結果です。$w$ を動かすと $y$ が動き($\dfrac{\partial y}{\partial w}$)、$y$ が動くと誤差 $L$ が動く($\dfrac{\partial L}{\partial y}$)。この二つを掛け合わせれば、$w$ から $L$ までの傾きが出ます。段が増えれば、鎖がその分だけ伸びるだけです。
ここが今日の山場です。誤差に近い側から順に計算していくと、「$y$ から誤差までの傾き」$\dfrac{\partial L}{\partial y}$ という途中結果が手に入ります。そしてこの途中結果は、$y$ より手前にあるつまみ全部で使い回せるんです。手前のつまみの傾きは、どれも「$y$ から誤差までの傾き」に、それぞれの「自分から $y$ までの分」を掛けるだけで出るからです。
だから、前向きに一回計算して(味見)、誤差から逆向きに一回たどる。それだけで、百万個のつまみの傾きが全部同時に出そろいます。一個ずつ百万回味見していたのに比べれば、味見一回分ほどの手間で全部の動かし方が分かってしまう。正確に言えば、前向き一回と、それと同じくらいの手間の逆向き一回、あわせて二回分です(タダになるわけではありません)。
誤差の情報が、出力側から入力側へ逆向きに伝わっていく。だからこの仕組みを、誤差逆伝播と呼びます。間違いの責任を、効いた分に応じて手前へ配って歩く、と言ってもいいかもしれません。

一つ、混ぜてはいけない区別があります。逆向きにたどるのは、あくまで傾きを計算するところまでです。つまみを実際に動かすのは、さっきの更新式のほう。逆伝播は動かし方(傾き)を配るだけで、動かすのは別の仕事です。そして全部のつまみは、傾きが出そろってから、いっせいに少しずつ動きます。一個直してから次、ではありません。
これが「学習で決まる」の中身でした
埋め込みの置き場所も、三つの顔の振り分け($W_Q, W_K, W_V$)も、この「前向きに味見して、逆向きに責任を配って、全部のつまみを少しだけ動かす」の繰り返しで決まってきました。これまで何度も「学習で決まる」と書いてきた、その中身がこれです。
最後にもう一段だけ。前向きの味見も、逆向きの責任配りも、中身はどちらも行列の計算です。だから GPU の回で見た「独立しているから並列にできる」が、この両方に効いています。学習が現実の時間で終わるのは、逆向き一回で済ませる発明と、それを一気にさばく GPU の、合わせ技なんです。
百万個のつまみを、自分たちはもう1個ずつ動かしてはいません。間違いが逆向きに流れて、どのつまみをどっちへどれだけ動かすべきかを、全部いっぺんに教えてくれる。埋め込みの置き場所も、三つの顔の振り分けも、そうやって少しずつ決まってきたものでした。
