Insights·2026-09-01

推論はどのように起きるのか — トランスフォーマーとアテンション

推論は、すでに出来上がったモデルを使う作業だ。入力した文章はトークンIDに変わり、数値ベクトルとして埋め込まれたあと、何重にも重なった層を通過する。各層で行われる中心的な処理は、トークン同士がどれだけ関連しているかを測るアテンションだ。その結果として、次に来るトークンの候補が点数付けされる。この過程でモデル内部の値は一つも変わらない。

前の記事の続きベースモデルはなぜそのまま使えないのか — 事前学習と事後学習
트랜스포머와 어텐션으로 다음 토큰을 추론하는 흐름 — 임베딩에서 레이어 N겹을 지나 로짓과 소프트맥스에 이르는 요약 도식

ここからは別の話だ

前の三編はモデルを作る話だった。ここからは、出来上がったモデルが私たちの質問に答えを作り出す話、つまり推論だ。

この二つを分けておくことが重要だ。学習はモデル内部の値を変える作業であり、推論は一度も変わっていないモデルをただ使う作業だ。実務の会話で最も頻繁に食い違うのがこの点である。

チャット欄に文章を入れて送信を押した瞬間から、答えが一文字ずつ出てくるまで、内部で何が起きているのかを順番に追ってみよう。

まず数字になる

入力した文章は、第1編で見たとおりトークンに分割される。そしてすべてのトークンには固有の番号が付いている。語彙表が20万個なら、0番から20万番まで番号が振られていることになる。

そのため文章はまず番号の並びに変わる。ところが番号だけでは足りない。17番と18番の意味が近いという保証はないからだ。番号は単なる名札にすぎない。

そこで各番号を、意味を含んだ数字の束に変換する。この変換を埋め込みと呼ぶ。埋め込みを経ると、意味の近いトークン同士が数値のうえでも近い位置に置かれる。

埋め込みという言葉に馴染みがあるとすれば、RAGですでに聞いたからだろう。文書をベクトルに変えてベクトルデータベースに入れる、というときのあの埋め込みと同じ概念だ。最終編で再び登場する。

推論器は何重にも重なっている

埋め込みまで終わると、いよいよ本格的な推論が始まる。推論器は層と呼ばれるものが何重にも積み重なった構造だ。

層1を通過した結果が層2に入り、それが層3に入る、という形でN重を通り抜ける。そして各層の中で起きることは事実上同じである。

なぜ同じことを何度も繰り返すのか。一度では関係を十分につかめないからだ。層を通るほど候補が精緻になる。そのため層の数が多いほど、一回の推論にかかる計算が増える。

この構造を指す名前がトランスフォーマーだ。LLMは、トランスフォーマーという方式で次のトークンを推論する仕組みである。

アテンション — 関係を測る作業

最後の文のロイが前に出た猫・うちにを参照し、関係の強弱が異なることを示す図。

層の中で行われる中心的な処理がアテンションだ。やっていることは一文で要約できる。トークン同士がどれだけ関連しているかを測ることである。

例を挙げてみよう。「うちの猫の名前はロイです。品種はベンガルです。ロイはうちに住んでいる猫です。」

ここで最後の文の「ロイ」は、前の文の「猫」と非常に強い関係を持つ。「うちに」ともある程度の関係はあるが、それよりは弱い。アテンションはこの強弱をすべて数値として計算する。トークンごとに、前に出てきたすべてのトークンに対して。

そして計算した値をそのままにしておくと特徴がぼやける。そこで後処理を一度かけて、目立つものをさらに目立たせる。この後処理の部分をMLPと呼ぶ。

このアテンション計算自体も、層の中で複数の系統に分かれて同時に行われる。その系統の一つをアテンションヘッドと呼ぶ。つまり層がN重あり、各層の中にヘッドがさらに複数ある。繰り返しの繰り返しなので、実際の計算回数は非常に大きくなる。

なぜこの方式が流れを変えたのか

アテンション以前の逐次処理とアテンション方式を並べて比較した図。

アテンションが登場する前の自然言語処理は、文を先頭から順に読んでいく方式が主流だった。一つの単語を処理し、その結果を持って次の単語に移る、という形である。

この方式には構造的な弱点があった。後ろに進むほど前の内容が薄れていくことだ。短い文では問題にならないが、小説のような長い文章で、前に出た名前を後ろで「それ」と受けると、何を指しているのか見失った。

アテンションは順番に読む代わりに、すべてのトークンが互いを直接参照できるようにする。十文前の単語でも直前の単語でも、関係を測る方式は同じだ。距離のせいで忘れられる構造ではない。

このアイデアを示したのが、2017年のGoogle研究陣による論文「Attention Is All You Need」だ。今使われているほとんどすべてのLLMがここから枝分かれした。発表当時は研究陣自身も、これほどの波及を予想していなかった。

送信を押したあと少し止まる理由

チャット欄に長い文章を貼り付けて送ると、少し止まってから答えが出始める。そのあとは文字が速く続いていく。

最初に止まっている間に行われているのが、先ほど見たアテンション計算だ。入力全体について関係をすべて測る段階であり、この区間をプリフィルと呼ぶ。

ここで見落としやすいことがある。計算の対象は私たちが入力した文章だけではない。目に見えないシステムプロンプト、それまでの会話履歴、各種の設定値が一緒に入る。画面に見えているものがすべてではない。

そのため入力が長くなると、この待ち時間は目に見えて増える。会話が長引くほど最初の応答が遅くなるのも同じ理由だ。毎回それまでの履歴を計算に入れ直すからである。

候補に点数が付けられる

層をすべて通過すると、次に来るトークンの候補が点数とともに出てくる。学習を終えたモデルなので、「昼食のメニューは」の次に自動車が1位で来ることはない。食べ物の名前が上位に並ぶ。

このとき出てくる値は確率ではなく、ただの点数だ。4.3、1.7、0.4のような数字であり、負の数も出る。この生の点数をロジットと呼ぶ。

そのままでは扱いにくいので、全部を足すと1になるように変換する。すると各候補が何パーセントなのかとして読める。この変換をソフトマックスという。

こうして「次に来るトークンの候補とそれぞれの確率」が出来上がった。ここまでが、一つのトークンを選ぶための準備である。

推論の最中にモデルは変わらない

ここで必ず押さえておくべきことがある。ここまで見てきた推論の過程で、モデルのパラメータは一つも変わらない。

第2編で見た調整つまみは、学習のときに合わせられたまま固定されている。推論は、その固定された設定で計算を流していく作業だ。つまみを動かすのは学習だけであり、それは計算コストがまったく別の次元なので、会話の最中に起こることはない。

そのため「昨日教えたのに今日はまた知らない」という現象が生じる。会話で伝えた内容は、その会話の入力に入っていただけで、モデルに刻まれたことは一度もない。新しい会話を開けば、その入力は消える。

同じ質問に対して昨日と今日で答えが違うのも、学習のせいではない。その理由は次の編で見る。

まだ一文字も出ていない

ここまでで候補の一覧と確率が出てきた。ところが答えはまだ一文字も出ていない。この中から実際に何を選ぶかが残っているからだ。

1位を常に選べばよさそうだが、そうはしない。そしてその選び方が、私たちがAPIで触るtemperature、top-k、top-pという値である。

次の編では、その選ぶ段階を見る。同じ質問に対して答えが毎回少しずつ変わる理由はそこにある。