Up アルゴリズムと<処理> 作成: 2025-09-03
更新: 2025-09-03


    Transformer のテクスト生成は,テクストへのトークン追加の繰り返しである。

    トークン追加は,つぎのアルゴリズムになっている:
    (1) つぎのアルゴリズムを1層として,これを多層に積む:

      x = [ x_1, ‥‥, x_m ] (トークンベクトル列)
        │
        │← 位置エンコーディングを加算
        │
        ├───────────┐
        │           ↓
        │         ( Self-Attention )
        │           z_i
        │           │← LayerNorm
        │← 加算 ──────┘
        │
        ├───────────┐
        │           ↓
        │          ( FFN )
        │           z'_i
        │           │← LayerNorm
        │← 加算 ──────┘
        ↓ 
      x’ = [ x’_1, ‥‥, x’_m ] (つぎの層の入力)

    ここで,
     Self-Attention:
        ├───────────┐
        │    ┌──────┼──────┐
        │    ↓線型変換  ↓      ↓
        │ Q_i = x_i W_Q  K_i = x_i W_K  V_i = x_i W_V
        │    └──┬───┘      │
        │       ↓          │
        │ α_i = sim( Q_i ; K_1, ‥‥, K_m )  │
        │       │          │
        │       └───┬──────┘
        │          z_i = α_i V

     FFN:
        ├───────────┐
        │           ↓
        │    z'_i = σ( x_i W_1 + b_1) W_2 + b2


    (2) 第1層に入力したテクスト (トークンベクトル列)
       x = [ x_1, ‥‥, x_m ]
    に対し,上のループの最終出力が
       o = [ o_1, ‥‥, o_m ] 
    であるとき,
       logits_i = o_i W_O^T
       p_i = softmax( logits_i ) 

    (3) p_m が指すトークンベクトル x_(m+1) を,x に追加する:
      [ x_1, ‥‥, x_m ] → [ x_1, ‥‥, x_m, x_(m+1) ]


    以上のアルゴリズムを, 「トークン追加処理」と呼ぶ。
    また,本体の多層構造ユニットを,「処理ユニット」と呼ぶことにする。


    処理ユニットに入力されたトークンベクトル列は,追加トークンがコード <eos> ("end-of-sentense") になるまで,トークン追加処理が繰り返される。
    そして,この結果のテクストが,処理ユニットの出力になる。
    処理ユニットにおける入力から出力までのプロセスを,「<処理>」と呼ぶ。

    このことを,つぎの図に表すことにする:

      テクスト  トークン トークン ‥‥ トークン <eos>
             ↑    ↑ ‥‥‥‥‥ ↑    ↑
        │ 処理 │ 処理 │ ‥‥‥‥‥ │ 処理 │
        └────┴────┴ ‥‥‥‥‥ ┴────┘
                <処理>        

    ここで「テクスト」 は開始テクスト,「トークン」は追加されたトークン (サブワード),「処理」はトークン追加処理。
    処理を区分する縦線は,トークン追加のタイミングも表している。


    ChatGPT にユーザが入力するテクストQと,これに対して ChatGPT が出力するテクストAの対応は,つぎのようになっている:
    1. Qをトークンベクトル列にエンコードする。
    2. このトークンベクトル列を<処理>する。。
    3. <処理>の出力をテクストにデコードして,Aとする。