Up | アルゴリズムと<処理> | 作成: 2025-09-03 更新: 2025-09-03 |
トークン追加は,つぎのアルゴリズムになっている: x = [ x_1, ‥‥, x_m ] (トークンベクトル列) │ │← 位置エンコーディングを加算 │ ├───────────┐ │ ↓ │ ( Self-Attention ) │ z_i │ │← LayerNorm │← 加算 ──────┘ │ ├───────────┐ │ ↓ │ ( FFN ) │ z'_i │ │← LayerNorm │← 加算 ──────┘ ↓ x’ = [ x’_1, ‥‥, x’_m ] (つぎの層の入力) ここで, │ ┌──────┼──────┐ │ ↓線型変換 ↓ ↓ │ 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の対応は,つぎのようになっている: |