Transformer には,「応答生成」はなかった。
ChatGPT の応答生成は,Transformer に「応答生成」の "外部" アルゴリズムを加える格好になる。
そのアルゴリズムは,オートレグレッシブ生成(autoregressive generation)とよばれる形式:
|
入力系列 (プロンプト) : [ x_1, ‥‥, x_m ]
↓
Transformer で処理 → 出力ベクトル列 [ z_1, ‥‥, z_m ]
↓
z_m から softmax → 次トークン y_1 をサンプリング
↓
系列に追加して再帰的に入力: [ x_1, ‥‥, x_m, y_1 ]
↓
再び Transformer へ入力 → 次のトークン y_2 生成
↓
…… (この繰り返し)
|
Step 1:初期化(プロンプト入力)
与えられたプロンプト(ユーザー入力や過去履歴)をトークン化
例:[user : ] こんにちは! [assistant : ] → [ x_1, ‥‥, x_m ]
Step 2:Transformerで出力ベクトルを得る
入力系列を Transformer に通す
出力ベクトル列 [ z_1, ‥‥, z_m ] を得る
Step 3:語彙分布を計算
最後の位置 z_m に線形層(LM Head) + softmax を適用
語彙全体への確率分布:
P( s_j | x_1, ..., x_m ) = softmax(logits)
Step 4:次のトークンを選択
温度・トップp・トップk 等の 生成戦略(decoding strategy) を用いて
次のトークン y_1 を選択(または確率的にサンプリング)
Step 5:y_1 を系列に追加し、再帰処理
新しい系列 [ x_1, ‥‥, x_m, y_1 ] を入力として、Step 2 へ戻る
終了条件(EOSトークン, 長さ, etc)まで繰り返す
毎回 [ x_1, ‥‥, x_m, y_1, ‥‥, y_k ] すべてを入力し直す。
生成済みのトークンも含めて再計算することは,「左側すべてを文脈として見る」という Transformer の構造と整合的である(因果的 Attention Mask 使用)。
「外部のサンプリング戦略(decoding algorithm)」とは?
実際の Transformerベースの LLM(ChatGPT含む)は、TV(Transformer)本体を使って<次のトークン>の条件付き確率分布を得たあと、
そこから「どれを出力トークンとするか」を外部のアルゴリズムで決定しています。
全体の流れ(応答生成時)
以下、1トークンを生成する際の処理をステップで追ってみる:
### Step 1. 入力系列を渡す(プロンプト)
系列
x = ["あなた", "は", "だれ", "で", "す", "か", "?"]
が,埋め込み(embedding)+位置情報 などを付加されて,TVに送られる。
### Step 2. Transformer(TV)が出力分布を返す
Transformerの出力は、以下のような確率分布(softmax後):
P( s_j | x_1, ..., x_m ) = softmax(logits)
たとえば次のような(簡略化した)分布だとする:
トークン候補 |
確率 |
s_1「私は」 |
0.55 |
s_2「AI」 |
0.20 |
s_3「ChatGPT」 |
0.15 |
s_4「人間」 |
0.05
|
s_5「GPT」 |
0.05 |
### Step 3. 外部のDecoding Algorithmが「選ぶ」
この 分布をどう扱うか が「サンプリング戦略(Decoding)」。
代表的な Decoding 戦略
以下に代表的なものを挙げ、構造と数式的意味を明示する:
1. Greedy decoding(貪欲法)
最も単純な方式で、最大確率のトークンをそのまま出す:
y_1 = argmax_j P( s_j | x_1, ‥‥, x_m )
例上では,s_1「私は」(0.55)が選ばれる。
⭕:確定的で高速
❌:多様性がない、反復や文の破綻が起きやすい
2. Sampling(単純サンプリング)
確率分布に基づいてランダムに1つを選ぶ:
y_1 ∼ P( s_j | x_1, ‥‥, x_m )
例:乱数によって「AI」や「GPT」が選ばれる可能性もある。
⭕:多様性あり
❌:品質が不安定、文脈破綻のリスク
3. Top-k Sampling
確率が高い上位k個のみを候補にしてサンプリング:
候補 = Top-k(P), y_1 ∼ 候補
例:k=3 なら, s_1「私は」, s_2「AI」, s_3「ChatGPT」からランダムに選ばれる。
4. Top-p Sampling(nucleus sampling)
確率の累積がp(例: 0.9)に達するまで上位トークンを候補とし、そこからサンプリング:
候補 = { s_j : ∑_(t=1, ... , j) P( s_t ) ≤ p }, y_1 ∼ 候補
p=0.9 で、s_1「私は」, s_2「AI」, s_3「ChatGPT」が候補
確率が小さい語は切り捨てる(文の破綻防止)
5. Beam Search(ビーム探索)
複数の候補文(ビーム)を並列で生成し、最も高確率な系列全体を選ぶ:
探索幅=k,各系列の確率 = ∏_(t=1, ... ,T) P( s_t | y < t )
⭕:文全体の意味を見た出力になる
❌:計算が重い、過剰確定的になる
|