いきなり身も蓋もない話をします。
LLMがやっているのは、「次に来るトークンを予測する」ことだけです。
「今日はいい」まで入力されたら、次に来るのは「天気」かもしれないし「日」かもしれない。それぞれの確率を計算して、一番それっぽいものを選ぶ。選んだら、それを含めた文章をもう一度入力に戻して、また次を予測する。
これをひたすら繰り返しているだけです。スマホの予測変換の、とんでもなく賢いやつ。それがLLMの正体です。
じゃあ、なぜ「考えている」ように見えるのか
「次のトークンを予測する」というタスクを本気で極めようとすると、予測の精度を上げるために、世界の構造を理解せざるを得なくなるんです。
「日本の首都は」の次を当てるには、日本という国と首都という概念を知っている必要がある。「2+3=」の次を当てるには、足し算ができないといけない。「このコードのバグは」の次を当てるには、コードを読めないといけない。
つまり、次トークン予測は「知識と推論を身につけないと解けないタスク」です。膨大なテキストで訓練された結果、副産物として知識や推論能力が出てきた。少なくとも、そう見える振る舞いをするようになった。
ここは哲学的な議論があるところなので深入りしませんが、実装レベルでは「次のトークンを予測しているだけ」というのは動かしようのない事実です。
「1トークンずつ」が、この先すべての根っこになる
LLMは自分の出力を入力に戻しながら、1トークンずつ生成しています。これを自己回帰(autoregressive)と言います。
100トークンの文章を作るには、100回この処理を回す。1回で全部まとめて出てくるわけじゃない。
ここだけ覚えて次へ
この「1トークンずつ」という性質が、後に出てくる速度の話・メモリの話のすべての根っこになります。 なぜ生成が遅いのか、なぜメモリを食うのか、なぜバッチが効くのか ── 全部ここから説明がつきます。
