Up 応答生成アルゴリズム 作成: 2023-06-16
更新: 2025-06-18


    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 = arg⁡max_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 )
      ⭕:文全体の意味を見た出力になる
      ❌:計算が重い、過剰確定的になる