自己回帰とは、大規模モデルが文章を生成するときに使う基本的な方式のことです。すでに現れたトークンをもとに、次に来る可能性が最も高いトークンを予測し、新しく生成したトークンを入力の末尾に付け足して、さらに次を予測する、という循環を、終了マーカーが出るか長さの上限に達するまで繰り返します。チャットで回答が一語ずつ飛び出してくるのは、この一歩ずつのデコード過程が外に現れた姿であり、別に作られた演出ではありません。
トークンを一つずつ前に進める
ここでいうトークンは、モデルから見た文字の単位と大まかに理解できます。一文字の場合もあれば、単語の一部や句読点の組み合わせの場合もあります。各ステップでモデルが向き合うのは、その時点までの文脈全体であり、判断は一つだけです。次に来る可能性が最も高いトークンは何か、ということです。それが選ばれると文脈はその分だけ長くなり、次の判断はさらに長くなった新しい文脈の上に成り立ちます。前の文で一語変えるだけでも、その後の流れは変わることがあります。各ステップの根拠に、それまでのすべての選択が含まれているからです。
学習時は全文と照合でき、生成時は前に進むしかない
学習と生成は別のものです。学習時には完全な原文がすでにそこにあり、モデルは一文全体を同時に見て、各位置で次のトークンが何であるべきかを並行して練習できます。答えを見ながら対照するようなものです。生成時には出来合いの続きはありません。一つ生成して、つなげて、次を生成するしかなく、逐次的に進める必要があります。長い回答が遅い主な理由はここにあります。単に機械が速くないのではなく、この生成方式は構造上、後のトークンを先に計算できず、前の結果が確定するのを待たなければならないのです。
入力は一度に読み終えられ、出力は一歩ずつしか出せない
質問するとき、あなたが入力した長い文章はモデルが一度に読み終え、並行して処理できるため、長いプロンプトが通常、文字数に比例して待ち時間を増やすことはありません。回答は違います。出力にトークンが何個含まれるか、その個数分のデコードステップが必要で、各ステップで計算をやり直します。回答が長いほどステップが増え、当然時間もかかります。同じ質問でも、短い返答は素早く戻り、長文は書き終えるまで待たされる理由もここにあります。ボトルネックの多くは入力側ではなく出力側にあります。
すべての生成モデルがこうではなく、三つの誤解も分けておく
自己回帰は、現在の主流のチャット型大規模モデルが選んだ方式にすぎず、内容を生成する唯一の道ではありません。拡散型のテキストモデルはぼやけた状態から徐々にノイズを取り除き、全体を修正していきます。マスク型モデルは穴埋め問題のように、内容の一部を先に隠してから補います。どちらも左から右へ一つずつ絞り出す方法には頼りません。よくある誤解は三つあります。一つ目は、モデルが段落全体を考え終えてから打ち出していると思い込むこと。実際には全体の完成原稿はなく、後文は常に前文の影響を受けるため、書き進めるほどずれていく理由の一つにもなっています。二つ目は、一語ずつの出力をわざわざ作ったタイピング演出だと思うこと。実際には、画面上のストリーミング表示はデコード過程をそのまま同期して見せているだけです。三つ目は、サンプリングを別の生成方式だと思うこと。温度などのパラメータは、各ステップで候補のトークンのうちどれを選ぶかに影響するだけで、自己回帰そのものの循環を変えるものではありません。