ディープラーニングという言葉が一気に広まったのは2010年代の半ばでした。写真に何が写っているかを機械が言い当て、囲碁で人間の頂点に勝つ、といったニュースが立て続けに流れたころです。その勢いに、「なんだか急に難しそうな世界になったな」と距離を置いてしまった人は少なくないはずです。分厚い入門書を開いてはみたものの、最初の数十ページで数式と専門用語に力尽きた、という記憶を持つ人もいるかもしれません。
この連載「手で動かすAI」は、その距離をゼロから詰め直すために始めます。難しさから逃げるつもりはありません。数式もコードも、イメージがはっきりするところでは遠慮なく出します。大事にするのは順番のほうです。まずブラウザでその場で触れる小さなデモで、何が起きているのかを目で見て手で動かす。そのうえで、それを言い表す式やプログラムを見にいく。数式が先に立ちはだかって心が折れる、というありがちな挫折の順序を、ひっくり返すのが狙いです。行き先は、いま話題の大規模言語モデル、つまり ChatGPT のように文章を書くAIの仕組みまで。遠回りに見えても、土台からの一本道でそこまでたどり着きます。
その入り口として、この回では連載全体を貫くたったひとつの考え方をつかみます。AIが「学習する」とは、そもそも何をしていることなのか、です。
学習の正体は「つまみ回し」
先に結論を言ってしまうと、機械が学習するというのは、正解に近づくようにモデルのつまみを少しずつ回しているだけです。魔法でもなければ、機械が自分で意思を持って考えているのでもありません。
図の真ん中にある箱がモデルです。中身はデータに当てはめるための関数で、いくつものつまみを持っています。このつまみは、専門的にはパラメータと呼ばれる、モデルの振る舞いを決める調整ネジのことだと思ってください。左から入力データを入れると、つまみの今の位置に応じて、右から予測が出てきます。
その予測を正解と並べて、どれだけ外したかを一本の数字にまとめます。これが誤差です。あとはその誤差が小さくなる向きへ、つまみをほんの少しだけ回す。回してはもう一度予測し、また誤差を見て回す。この地味なくり返しこそ、私たちが学習と呼んでいるものの正体です。
つまみが2つなら単純な直線しか引けませんが、つまみを何百万、何十億と増やしていけば、複雑きわまりない関数も表せるようになります。いまのAIが桁外れに賢く見えるのは、このつまみの数と、回した回数がとほうもなく大きいからで、やっていること自体は最後までこの図のままです。
触って確かめる
言葉だけではピンと来ないので、実際に動かせるデモを用意しました。散らばった点に、1本の直線をできるだけうまく当てはめる遊びです。
うまく表示されないときは、デモを別タブで開く 。
つまみは2つ、直線の傾きと切片です。動かすと、点から直線へ伸びるオレンジの縦線が伸び縮みします。これが一点ごとの外し具合です。大きく外した点ほど強く効くように、この外し具合を二乗してならした一つの数字が、上に出ている誤差です。まずは手で2つのつまみを探って、誤差をできるだけ小さくしてみてください。
そのうえで「自動で学習する」を押すと、まったく同じことを機械がやります。誤差が減る向きを計算して、つまみを少しずつ回していく。数字がするすると下がり、直線が点の真ん中へ吸い付いていくはずです。人が勘で合わせても、機械が自動で合わせても、起きているのは同じつまみ回しなのだと腑に落ちれば、この回の目的は達成です。
「自動で学習」の中身をのぞく
そのボタンの裏で動いているのは、勾配降下法という短いプログラムです。名前だけで済ませず、せっかくなので中身をのぞいてみましょう。これは飾りのデモ用アルゴリズムではなく、いまのAIを訓練しているまさにその仕組みだからです。
やることは2段階だけです。まず今のつまみの位置で、各点をどれだけ外しているかを見て、「このつまみをほんの少し増やしたら、誤差は増えるのか減るのか」をつまみごとに求めます。これが勾配で、坂の傾きのようなもの、誤差の丘のどちらが下り坂かを教えてくれる値です。次に、その下り坂の向きへつまみを少しだけ動かす。これだけです。デモの「自動で学習する」は、次のコードをくり返しているだけです。
// 1. 今のつまみ a, b で、各点の外し具合から「勾配」を求める
let ga = 0, gb = 0;
for (const [x, y] of データ) {
const r = a * x + b - y; // 予測 − 正解(=どれだけ外したか)
ga += 2 * r * x; // つまみ a を動かしたときの誤差の傾き
gb += 2 * r; // つまみ b を動かしたときの誤差の傾き
}
ga /= n; gb /= n;
// 2. 誤差が減る向き(下り坂)へ、つまみを少しだけ動かす
a = a - 学習率 * ga;
b = b - 学習率 * gb;
肝は最後の2行です。勾配は「増やすと誤差が増える向き」を指しているので、マイナスを付けて逆向き、つまり下り坂へ動かします。動かす幅を決めるのが学習率で、大きすぎると行き過ぎて発散し、小さすぎると亀の歩みになります。この2段階を何百回とくり返すと、つまみは誤差がいちばん小さい谷へ落ち着きます。
そして肝心なのはここです。いま見た数行は、写真を見分けるAIも、文章を書く大規模言語モデルも、訓練しているまさに中核です。違うのは、つまみが2つではなく何億個もあること、そして膨大なつまみの勾配を効率よく求めるための誤差逆伝播という工夫が加わること。骨格はこのままです。だから「勾配なんとか法」は、AI開発に関係ないどころか、その心臓そのものだと言えます。連載では専用の回で、この勾配を数値微分から手で組み立て、逆伝播まで一段ずつ作っていきます。
この一点から、全部が伸びていく
これから先、話はニューロン、ニューラルネットワーク、画像認識、そして言葉を扱うAIへと広がっていきます。名前も見た目もどんどん複雑になりますが、根っこはずっと同じです。誤差を測り、それが減る向きへつまみを回す。大規模言語モデルがやっている「次の単語を当てる」学習も、突きつめればこの一点の変奏にすぎません。
次回は、いちばん小さなモデルであるニューロン1個を取り上げて、そのつまみが実際に何をしているのかを、もう一段だけ細かくのぞいてみます。
