概要
LLM は入力として C 個のトークン ID 列を受け取り、入力と同じ C 個の(語彙数の次元数を持つ)確率分布を出力します。
C の各行の確率分布は、その位置の次にくるトークンの予想を表します。
説明は以下のシェイプを仮定します。
- $C$:コンテキスト長
- $E$:埋め込みベクトル次元数
- $D$:クエリ、キー次元数
- Embedding レイヤ:トークン ID 列を埋め込みベクトルに変換します
- Embedding レイヤの重み行列は、語彙数 $V$ 、埋め込みベクトルの次元数 $E$ の行列 $(V, E)$です
- Positional Encoding:各トークンの位置情報を埋め込みベクトルに加算します
- Attention 自体は入力の並び順を区別できない(順列不変)ため、位置情報を別途加算する必要があります
- Attention と FFN ( Feed-Forward Network )による変換が繰り返し実行されます
- Attention と FFN を合わせて Transformer ブロックと呼びます
- 各サブレイヤ(Attention、FFN)は残差接続と LayerNorm(Add & Norm)とセットで使われます
- Linear (線形変換): 各トークンの埋め込みベクトルを語彙サイズと同じ次元数に変換します(出力をスコアと呼びます)
- Softmax 関数: スコアから次に出現するトークンの確率分布を生成します
Transformer ブロック( Attention と FFN )を通過するデータは、一貫して同じ形状を維持します。
例では $(C, E)$ になります。
この一貫性により Transforer ブロックによる複数回の処理が可能となります。
Embedding レイヤ
Embedding レイヤ(埋め込み層)は、トークン ID(入力)に対応する重み行列に格納された分散表現ベクトルを出力します。
重み行列
順伝播
- 入力:トークン ID(整数)、例えば id = 42
- 出力:
W[42]、つまり 42 行目のベクトル(分散表現ベクトルの次元数 $E$ ) - 実装上は(入力トークンの) one-hot ベクトルとの行列積と数学的に等価ですが、実際は単なるテーブルルックアップ(行の抜き出し)として実装されます
学習との関係
この重み行列 $W$ は学習によって更新されます。
結果として、意味的・文法的に近いトークンが空間上で近くなるよう分散表現が形成されます。
補足:バッチ処理の場合
入力が (バッチサイズ $B$, コンテキスト長 $C$) なら出力は (バッチサイズ, コンテキスト長, $E$ ) のテンソルになります。
Positional Encoding
Self-Attention の計算($Softmax(Q\cdot K^\top/\sqrt{D})\cdot V$)は、トークンの並び順を入れ替えても演算結果が入れ替わるだけで、計算そのものは変わりません(順列不変性)。
NOTE
RNN は $h_t$ が $h_{t-1}$ に依存する再帰構造そのものが「順序」を表現していました。
Attention にはこの再帰構造がないため、「これは何番目のトークンか」という情報を Embedding レイヤの出力に明示的に加算する必要があります。
Embedding レイヤの出力 $x$(shape: $(C, E)$)に、同じ shape の位置埋め込み $PE$ を加算してから Transformer ブロックへ渡します。
\[x' = x + PE \quad \text{shape: } (C, E)\]- 連結(concat)ではなく加算である点に注意(次元数 $E$ を増やさずに位置情報を混ぜ込む)
代表的な方式
| 方式 | 学習 | 仕組み | 代表モデル |
|---|---|---|---|
| Sinusoidal | しない(数式で決定) | $PE_{(pos,2i)}=\sin(pos/10000^{2i/E})$、$PE_{(pos,2i+1)}=\cos(pos/10000^{2i/E})$ を加算 | 元祖Transformer(Vaswani et al., 2017) |
| Learned | する | Embedding レイヤと同様の重み行列 $(C_{\max}, E)$ から位置 $pos$ の行をルックアップして加算 | BERT, GPT-2 |
| RoPE(Rotary Position Embedding) | しない(数式) | 加算ではなく、Attention 計算直前に $Q,K$ を位置に応じて回転 | LLaMA, GPT-NeoX 系 |
NOTE
Sinusoidal は三角関数の加法定理により $PE_{pos+k}$ が $PE_{pos}$ の線形結合で表せるため相対位置を学習しやすく、訓練時より長い系列にもある程度外挿できます。
RoPE は $Q\cdot K^\top$ の内積が2トークンの絶対位置ではなく相対位置($pos_i-pos_j$)にのみ依存するという性質を持ち、近年の主要LLMで採用が進んでいます。
Attention と FFN (Transformer ブロック)
Attention と FFN を合わせて Transformer ブロックと呼びます。
Transformer ブロックを通過するテンソルの形状は一貫しています($(C, E)$)。
そのため Transformer ブロックを複数回適用することができます。
詳細は Attention を参照。
FFN(Feed-Forward Network)
Attention が「トークン同士の関係性(文脈)」を混ぜ合わせる層であるのに対し、FFN は各トークンを独立に(他のトークンを見ずに)変換する層です。Attention ブロックの出力(shape: $(C, E)$)の各行(各トークンのベクトル)に対して、同じ重みを使った同一の変換を並列に適用します。
\[\text{FFN}(x) = \text{activation}(x\cdot W_1+b_1)\cdot W_2+b_2\]| 記号 | shape | 役割 |
|---|---|---|
| $x$ | $(C, E)$ | Attention ブロックの出力 |
| $W_1, b_1$ | $(E, E_{ff}), (E_{ff},)$ | 次元を一度拡張($E_{ff}$ は通常 $E$ の4倍程度) |
| activation | — | 非線形変換(元祖Transformerは ReLU、BERT/GPT/ViT は GELU |
| $W_2, b_2$ | $(E_{ff}, E), (E,)$ | 元の次元 $E$ に戻す |
NOTE
Attention は「トークン間($C$方向)」で情報を混ぜ、FFN は「1トークン内($E$方向)」で情報を加工します。この役割分担を Transformer ブロックの中で交互に繰り返すことで、文脈の混合と非線形な特徴抽出の両方を実現しています。
残差接続(Residual Connection)
Transformer ブロック内の各サブレイヤ(Attention、FFN)は、入力をそのまま出力に足し合わせる残差接続を持ちます。
\[\text{output} = x + \text{Sublayer}(x)\]NOTE
ResNet(画像認識)と同じ発想です。Sublayer が「何もしない($\text{Sublayer}(x)\approx0$)」ことを学習すれば恒等写像に近づけるため、層を深く積んでも生じやすい勾配消失を緩和できます。
LayerNorm(Layer Normalization)
\[\text{LN}(x) = \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}\odot\gamma+\beta\]BatchNorm がバッチ方向に統計量を取るのに対し、LayerNorm は特徴量方向($E$ 次元)に統計量を取るため、系列長やバッチサイズが可変な NLP と相性が良く標準的に使われます。
Post-LN と Pre-LN
残差接続と LayerNorm を組み合わせる順序に2つの流儀があります。
| 数式 | 特徴 | |
|---|---|---|
| Post-LN(元祖Transformer) | $\text{LN}(x+\text{Sublayer}(x))$ | 層を深く積むと学習が不安定になりやすく、学習率のウォームアップが事実上必須 |
| Pre-LN(GPT-2以降の主流) | $x+\text{Sublayer}(\text{LN}(x))$ | 恒等写像の経路に LayerNorm が挟まらないため勾配が素直に流れ、深い層でも学習が安定しやすい |
Linear と Softmax
形状が $(C, E)$ のテンソルは、線形変換によって $(C, V)$ の形状に変換されます。
$V$ はトークンの語彙サイズを表します。
Softmax 関数によって C 個の確率分布が得られます。 各位置の確率分布は、その位置の次にくるトークンの予想を表します。
NOTE
末尾の単語の次にくるトークンは、学習データ的には多くの場合文末トークン(EOS)やパディングトークンになります。
推論時においては、次の新しい文章の始まりの単語を予測する挙動になります。
以下の解釈は Attention にマスクが設定(つまり未来を考慮しない)されている場合に限ります。
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 . の次にくるトークンの確率分布を表します
※ . の次にくるトークンは、学習データ的には多くの場合文末トークン(EOS)やパディングトークンになります。推論時においては、次の新しい文章の始まりの単語を予測する挙動になります。