シェイプ

  • $B$:バッチ数
  • $C$:コンテキスト長
  • $E$:埋め込みベクトル次元数
  • $D$:クエリ、キー次元数

概要

LLM の流れは C 個のトークン ID 列を入力すると、入力と同じ C 個の確率分布が得られます。 C の各行の確率分布は、その位置の次に来るトークンの予想を表します。

  1. Embed:トークン ID 列は、 Embed (埋め込み)によって埋め込みベクトルに変換されます
  2. Attention と FFN ( Feed-Forward Network )による変換が繰り返し実行されます
    • Attention と FFN を合わせて Transformer ブロックと呼びます
  3. Linear (線形変換): 各トークンの埋め込みベクトルを語彙サイズと同じ次元数に変換します(出力をスコアと呼びます)
  4. Softmax 関数: スコアから次に出現するトークンの確率分布を生成します

Transformer ブロック( Attention と FFN )を通過するデータは、一貫して同じ形状を維持します。
例では $(C, E)$ になります。
この一貫性により Transforer ブロックによる複数回の処理が可能となります。

Embed

Embeding レイヤー(埋め込み層)は、トークン ID(入力)に対応する重み行列に格納された分散表現ベクトルを出力します。

重み行列

  • 重み行列のシェイプ( $W$ ): (語彙数 $V$, 埋め込み次元 $D$)
  • 各行がトークンの分散表現ベクトルに対応

順伝播

  • 入力:トークン ID(整数)、例えば id = 42
  • 出力: W[42]、つまり 42 行目のベクトル(分散表現ベクトルの次元数 $D$ )
  • 実装上は(入力トークンの) one-hot ベクトルとの行列積と数学的に等価ですが、実際は単なるテーブルルックアップ(行の抜き出し)として実装されます

学習との関係

この重み行列 $W$ は学習によって更新されます。
結果として、意味的・文法的に近いトークンが空間上で近くなるよう分散表現が形成されます。

補足:バッチ処理の場合

入力が (バッチサイズ, コンテキスト長) なら出力は (バッチサイズ, コンテキスト長, $D$ ) のテンソルになります。

Attention と FFN

Attention と FFN を合わせて Transformer ブロックと呼びます。 Transformer ブロックを通過するテンソルの形状は一貫しています( $(C, E)$ )。
そのため Transformer ブロックを複数回適用することができます。

詳細は Attention を参照。

Linear と Softmax

形状が $(C, E)$ のテンソルは、線形変換によって $(C, V)$ の形状に変換されます。
$V$ はトークンの語彙サイズを表します。

Softmax 関数によって C 個の確確分布が得られます。 各位置の確率分布は、その位置の次に来るトークンの予想を表します。

C = 5 ( This is a pen .) 
V = 1000
         0     1             999  
This [0.001, 0.021, ......, 0.002]
is   [0.020, 0.001, ......, 0.060]
a    [0.020, 0.001, ......, 0.060]
pen  [0.100, 0.001, ......, 0.001]
.    [0.034, 0.021, ......, 0.071]

This の確率分布 [0.001, 0.021, ......, 0.002] は This の次にくるトークンの確率分布を表します
is の確率分布 [0.020, 0.001, ......, 0.060] は This is の次にくるトークンの確率を表します
a の確率分布 [0.020, 0.001, ......, 0.060] は This is a の次にくるトークンの確率分布を表す
pen の確率分布 [0.100, 0.001, ......, 0.001] は This is a pen の次にくるトークンの確率分布を表します
. の確率分布 [0.034, 0.021, ......, 0.071] は This is a pen . の次にくるトークンの確率分布を表します