ChatGPT のような文章生成モデルの中身は、同じ形の「ブロック」を何十段も積み重ねたものです。この記事では、1 つのブロックが何でできているのか、なぜ深く積んでも学習が崩れにくいのか、モデル全体にパラメータが何個あるのかを、式と小さな数値例で確かめます。読み終えると、ブロックの図を自分で描け、パラメータ数を手計算で数えられるようになります。
Transformer ブロックは、自己注意と位置ごとの MLP という 2 つの部品を、それぞれ残差接続 x ↦ x + F ( x ) \boldsymbol{x} \mapsto \boldsymbol{x} + F(\boldsymbol{x}) x ↦ x + F ( x ) と層正規化で包んだものです。これを L L L 個重ね、前後に埋め込みと出力層を付けると、デコーダのみの Transformer になります。
層正規化は、入力の正の定数倍と全成分への定数の加算で出力が変わりません(命題 3.1 )。その微分形として、ヤコビ行列(出力の各成分が入力の各成分でどれだけ変わるかを並べた行列)は 1 \boldsymbol{1} 1 と x − μ 1 \boldsymbol{x} - \mu\boldsymbol{1} x − μ 1 の 2 方向を消し、大きさは 1 / σ ( x ) 1/\sigma(\boldsymbol{x}) 1/ σ ( x ) に比例します(命題 3.3 )。
Pre-LN の残差接続を重ねると、出力から各層へのヤコビ行列に恒等写像の項が必ず残ります(命題 4.1 )。どの配置が学習しやすいかは経験的な事柄で、定理ではありません。
パラメータ数は ∣ V ∣ d + L c t x d + L ( 4 d 2 + 4 d + 2 d d f f + d f f + d + 4 d ) + 2 d |V|d + L_{\mathrm{ctx}}d + L(4d^2 + 4d + 2d\,d_{\mathrm{ff}} + d_{\mathrm{ff}} + d + 4d) + 2d ∣ V ∣ d + L ctx d + L ( 4 d 2 + 4 d + 2 d d ff + d ff + d + 4 d ) + 2 d です(定理 5.1 )。12 層・d = 768 d = 768 d = 768 ・語彙 50,257・文脈長 1,024 では 124,439,808 になります。
1 層の乗算の回数は 12 n d 2 + 2 n 2 d 12nd^2 + 2n^2d 12 n d 2 + 2 n 2 d (d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d のとき)で、n < 6 d n < 6d n < 6 d では MLP と射影の項が注意の項より大きくなります(命題 6.1 )。
位置の間で情報を運ぶのは注意だけで、MLP と層正規化は行ごとに働きます。したがって前章の同変 性(入力の行を並べ替えると出力も同じように並べ替わる性質)と因果性(ある位置の出力が後ろの位置に依らない性質)は、ブロックとモデル全体に引き継がれます(命題 7.2 )。
この記事で使う事前知識
自己注意 : 各位置のベクトルを、ほかの位置のベクトルの重み付き平均で置き換える演算。→ 自己注意
同変 : 入力の行を並べ替えると、出力も同じ並べ替えになる性質。→ 同変
埋め込み行列 : トークンの番号を d d d 次元のベクトルに写す表。→ 埋め込み行列
多層パーセプトロン : 線形変換と成分ごとの非線形関数を交互に重ねた関数。→ 多層パーセプトロン
分散 : 平均からのずれの 2 乗の平均。→ 分散
正規直交基底 : 長さが 1 で互いに直交するベクトルからなる基底。→ 正規直交基底
前章 の自己注意は、各位置のベクトルをほかの位置のベクトルの凸結合で置き換える演算でした(命題 4.2[自己注意] )。これだけを重ねても、モデルとしては 3 つのものが足りません。
各位置での非線形な加工。 注意は位置の間で情報を混ぜますが、混ぜたあとの 1 本のベクトルを作り替える働きは、射影の線形変換しか持っていません。そこで行ごとに MLP を施します。
深く重ねても学習できる構造。 層を単純に合成すると、勾配は層ごとのヤコビ行列の積になり、その大きさの上界は層の数について指数的に小さくなりえます(命題 8.1[ニューラルネットワークと逆伝播] )。残差接続は、この積の中に恒等写像の経路を作ります。
値の大きさをそろえる仕組み。 残差接続で足し続けると、ベクトルの大きさが層ごとに変わっていきます。層正規化は、各行を平均 0・分散 1 に直します。
残差接続は He らが画像認識の深いネットワークのために導入し([3])、層正規化は Ba らが提案しました([2])。Vaswani らはこの 2 つで注意と MLP を包んで Transformer の層にしました([1])。この章では、これらの部品について厳密に言えることを命題にし、最後にモデル全体を NumPy で組んでパラメータ数と因果性を確かめます。
前章と同じく、X ∈ R n × d X \in \mathbb{R}^{n \times d} X ∈ R n × d の第 i i i 行を列ベクトルとみなしたものを x i \boldsymbol{x}_i x i と書きます。
定義 2.1 (層正規化 ) ↗
x ∈ R d \boldsymbol{x} \in \mathbb{R}^{d} x ∈ R d の成分の平均と分散を
μ ( x ) : = 1 d ∑ j = 1 d x j , σ 2 ( x ) : = 1 d ∑ j = 1 d ( x j − μ ( x ) ) 2 \mu(\boldsymbol{x}) := \frac{1}{d}\sum_{j=1}^{d} x_j, \qquad \sigma^2(\boldsymbol{x}) := \frac{1}{d}\sum_{j=1}^{d}\big(x_j - \mu(\boldsymbol{x})\big)^2 μ ( x ) := d 1 j = 1 ∑ d x j , σ 2 ( x ) := d 1 j = 1 ∑ d ( x j − μ ( x ) ) 2 とする。パラメータ γ , β ∈ R d \boldsymbol{\gamma}, \boldsymbol{\beta} \in \mathbb{R}^{d} γ , β ∈ R d と定数 ε ≥ 0 \varepsilon \ge 0 ε ≥ 0 に対し
L N ( x ) : = γ ⊙ x − μ ( x ) 1 σ 2 ( x ) + ε + β \mathrm{LN}(\boldsymbol{x}) := \boldsymbol{\gamma} \odot \frac{\boldsymbol{x} - \mu(\boldsymbol{x})\boldsymbol{1}}{\sqrt{\sigma^2(\boldsymbol{x}) + \varepsilon}} + \boldsymbol{\beta} LN ( x ) := γ ⊙ σ 2 ( x ) + ε x − μ ( x ) 1 + β を層正規化 という(⊙ \odot ⊙ は成分ごとの積)。ε = 0 \varepsilon = 0 ε = 0 のときは σ 2 ( x ) > 0 \sigma^2(\boldsymbol{x}) > 0 σ 2 ( x ) > 0 、すなわち x \boldsymbol{x} x の成分がすべて等しくはない場合に定義される。行列 X X X に対しては各行に施す。
ε \varepsilon ε は 0 で割ることを避けるための小さな正の数です(実装では 10 − 5 10^{-5} 1 0 − 5 程度)。以下の命題は、式が簡単になる ε = 0 \varepsilon = 0 ε = 0 の場合について述べます。
定義 2.2 (残差接続・位置ごとの MLP・ブロック ) ↗
(残差接続) 写像 F : R n × d → R n × d F : \mathbb{R}^{n\times d} \to \mathbb{R}^{n \times d} F : R n × d → R n × d に対し、X ↦ X + F ( X ) X \mapsto X + F(X) X ↦ X + F ( X ) を F F F の残差接続 という。
(位置ごとの MLP) パラメータ W 1 ∈ R d × d f f W_1 \in \mathbb{R}^{d \times d_{\mathrm{ff}}} W 1 ∈ R d × d ff 、b 1 ∈ R d f f \boldsymbol{b}_1 \in \mathbb{R}^{d_{\mathrm{ff}}} b 1 ∈ R d ff 、W 2 ∈ R d f f × d W_2 \in \mathbb{R}^{d_{\mathrm{ff}} \times d} W 2 ∈ R d ff × d 、b 2 ∈ R d \boldsymbol{b}_2 \in \mathbb{R}^{d} b 2 ∈ R d と活性化関数 ϕ : R → R \phi : \mathbb{R} \to \mathbb{R} ϕ : R → R に対し
M L P ( X ) : = ϕ ( X W 1 + 1 b 1 T ) W 2 + 1 b 2 T \mathrm{MLP}(X) := \phi\big(XW_1 + \boldsymbol{1}\boldsymbol{b}_1^{\mathsf{T}}\big)W_2 + \boldsymbol{1}\boldsymbol{b}_2^{\mathsf{T}} MLP ( X ) := ϕ ( X W 1 + 1 b 1 T ) W 2 + 1 b 2 T と定める(ϕ \phi ϕ は成分ごと)。第 i i i 行は g ( x i ) : = W 2 T ϕ ( W 1 T x i + b 1 ) + b 2 g(\boldsymbol{x}_i) := W_2^{\mathsf{T}}\phi(W_1^{\mathsf{T}}\boldsymbol{x}_i + \boldsymbol{b}_1) + \boldsymbol{b}_2 g ( x i ) := W 2 T ϕ ( W 1 T x i + b 1 ) + b 2 で、1 層の隠れ層を持つ多層パーセプトロン(定義 2.1[ニューラルネットワークと逆伝播] で層数を 2、2 層目の活性化関数を恒等写像としたもの。同定義は活性化関数を C 1 C^1 C 1 級と仮定しており、G E L U \mathrm{GELU} GELU はこれを満たすが、R e L U \mathrm{ReLU} ReLU は 0 で微分可能でないので満たさない)を各行に施したものである。d f f d_{\mathrm{ff}} d ff を MLP の幅 という。活性化関数は R e L U ( t ) : = max ( 0 , t ) \mathrm{ReLU}(t) := \max(0, t) ReLU ( t ) := max ( 0 , t ) か、標準正規分布の分布関数 Φ \Phi Φ を使った G E L U ( t ) : = t Φ ( t ) \mathrm{GELU}(t) := t\,\Phi(t) GELU ( t ) := t Φ ( t ) を取る。
(ブロック) マルチヘッド自己注意 M H A \mathrm{MHA} MHA (定義 4.1[自己注意] )、位置ごとの M L P \mathrm{MLP} MLP 、2 つの層正規化 L N 1 , L N 2 \mathrm{LN}_1, \mathrm{LN}_2 LN 1 , LN 2 から、次の 2 通りのブロックを定める。
Post-LN: Y = L N 1 ( X + M H A ( X ) ) , X ′ = L N 2 ( Y + M L P ( Y ) ) Pre-LN: Y = X + M H A ( L N 1 ( X ) ) , X ′ = Y + M L P ( L N 2 ( Y ) ) \begin{aligned}
\textbf{Post-LN:}\quad & Y = \mathrm{LN}_1\big(X + \mathrm{MHA}(X)\big), & X' &= \mathrm{LN}_2\big(Y + \mathrm{MLP}(Y)\big) \\
\textbf{Pre-LN:}\quad & Y = X + \mathrm{MHA}\big(\mathrm{LN}_1(X)\big), & X' &= Y + \mathrm{MLP}\big(\mathrm{LN}_2(Y)\big)
\end{aligned} Post-LN : Pre-LN : Y = LN 1 ( X + MHA ( X ) ) , Y = X + MHA ( LN 1 ( X ) ) , X ′ X ′ = LN 2 ( Y + MLP ( Y ) ) = Y + MLP ( LN 2 ( Y ) ) Pre-LN のブロックで、層から層へ足し込まれながら受け渡される X , Y , X ′ , … X, Y, X', \ldots X , Y , X ′ , … を残差流 という。
Post-LN は Vaswani らの配置で、各部品の出力を「残差に足してから正規化」します([1] 3.1 節)。Pre-LN は「正規化してから部品に入れ、残差に足す」配置で、Radford らは層正規化を各部品の入力側に移し、最後の自己注意ブロックのあとに正規化を 1 つ追加したと述べています([5] 2.3 節)。Vaswani らの MLP は ReLU で d = 512 d = 512 d = 512 、d f f = 2048 = 4 d d_{\mathrm{ff}} = 2048 = 4d d ff = 2048 = 4 d です([1] 3.3 節)。GELU は Hendrycks と Gimpel が提案した活性化関数です([7])。
Pre-LN のブロック。上の線が残差流で、注意と MLP の出力が順に足し込まれる。正規化は各部品の入口にあり、残差流そのものには掛からない。
定義 2.3 (デコーダのみの Transformer ) ↗
語彙 V V V 、次元 d d d 、層数 L L L 、MLP の幅 d f f d_{\mathrm{ff}} d ff 、文脈長 L c t x L_{\mathrm{ctx}} L ctx を定める。パラメータは、埋め込み行列 E ∈ R ∣ V ∣ × d E \in \mathbb{R}^{|V| \times d} E ∈ R ∣ V ∣ × d 、学習する位置埋め込み P ∈ R L c t x × d P \in \mathbb{R}^{L_{\mathrm{ctx}} \times d} P ∈ R L ctx × d (命題 4.6[埋め込みと位置符号化] )、L L L 個の Pre-LN ブロック(注意は因果マスクつき)のパラメータ、最後の層正規化 L N f \mathrm{LN}_f LN f のパラメータである。トークン列 ( t 1 , … , t n ) (t_1, \ldots, t_n) ( t 1 , … , t n ) (n ≤ L c t x n \le L_{\mathrm{ctx}} n ≤ L ctx )に対し
X ( 0 ) X^{(0)} X ( 0 ) を、第 i i i 行が E t i + P i E_{t_i} + P_i E t i + P i である n × d n \times d n × d 行列とする。
l = 1 , … , L l = 1, \ldots, L l = 1 , … , L の順に、X ( l ) X^{(l)} X ( l ) を X ( l − 1 ) X^{(l-1)} X ( l − 1 ) に第 l l l ブロックを施したものとする。
Z : = L N f ( X ( L ) ) E T ∈ R n × ∣ V ∣ Z := \mathrm{LN}_f\big(X^{(L)}\big)\,E^{\mathsf{T}} \in \mathbb{R}^{n \times |V|} Z := LN f ( X ( L ) ) E T ∈ R n × ∣ V ∣ とする。
Z Z Z の第 i i i 行 z i \boldsymbol{z}_i z i を位置 i i i のロジット といい、σ ( z i ) \sigma(\boldsymbol{z}_i) σ ( z i ) (softmax)を、t 1 , … , t i t_1, \ldots, t_i t 1 , … , t i の次に来るトークンの予測分布とする。この写像を(入出力の重み共有ありの)デコーダのみの Transformer という。
手順 3 で出力側の行列に E E E そのものを使っているのが重み共有です(定義 2.1[埋め込みと位置符号化] )。Z i v = ⟨ L N f ( x i ( L ) ) , E v ⟩ Z_{iv} = \langle \mathrm{LN}_f(\boldsymbol{x}^{(L)}_i), E_v\rangle Z i v = ⟨ LN f ( x i ( L ) ) , E v ⟩ なので、ロジットは「最後のベクトルと各トークンの埋め込みの内積」です。ロジットは softmax にかける前の、各トークンの得点にあたります。入力側と出力側で同じ表 E E E を使うので、出力側のために新しく ∣ V ∣ d |V|\,d ∣ V ∣ d 個のパラメータを持たずに済みます。位置の与え方を RoPE(クエリとキーを位置に応じた角度で回す方式。第 2 章で扱いました)にする場合は、P P P を無くし、各層の注意の中でクエリとキーを回します。
命題 3.1 (層正規化はスケールと平行移動に不変 ) ✓
ε = 0 \varepsilon = 0 ε = 0 とし、x ∈ R d \boldsymbol{x} \in \mathbb{R}^d x ∈ R d は成分がすべて等しくはないとする。
任意の a > 0 a > 0 a > 0 と b ∈ R b \in \mathbb{R} b ∈ R について L N ( a x + b 1 ) = L N ( x ) \mathrm{LN}(a\boldsymbol{x} + b\boldsymbol{1}) = \mathrm{LN}(\boldsymbol{x}) LN ( a x + b 1 ) = LN ( x ) 。
γ = 1 \boldsymbol{\gamma} = \boldsymbol{1} γ = 1 、β = 0 \boldsymbol{\beta} = \boldsymbol{0} β = 0 のとき、y : = L N ( x ) \boldsymbol{y} := \mathrm{LN}(\boldsymbol{x}) y := LN ( x ) は μ ( y ) = 0 \mu(\boldsymbol{y}) = 0 μ ( y ) = 0 、σ 2 ( y ) = 1 \sigma^2(\boldsymbol{y}) = 1 σ 2 ( y ) = 1 、∥ y ∥ = d \|\boldsymbol{y}\| = \sqrt{d} ∥ y ∥ = d を満たす。
証明(命題 3.1) μ : = μ ( x ) \mu := \mu(\boldsymbol{x}) μ := μ ( x ) 、σ : = σ 2 ( x ) > 0 \sigma := \sqrt{\sigma^2(\boldsymbol{x})} > 0 σ := σ 2 ( x ) > 0 と書きます。
x ′ : = a x + b 1 \boldsymbol{x}' := a\boldsymbol{x} + b\boldsymbol{1} x ′ := a x + b 1 について、μ ( x ′ ) = 1 d ∑ j ( a x j + b ) = a μ + b \mu(\boldsymbol{x}') = \frac1d\sum_j(ax_j + b) = a\mu + b μ ( x ′ ) = d 1 ∑ j ( a x j + b ) = a μ + b 。よって x j ′ − μ ( x ′ ) = a ( x j − μ ) x'_j - \mu(\boldsymbol{x}') = a(x_j - \mu) x j ′ − μ ( x ′ ) = a ( x j − μ ) で、σ 2 ( x ′ ) = 1 d ∑ j a 2 ( x j − μ ) 2 = a 2 σ 2 \sigma^2(\boldsymbol{x}') = \frac1d\sum_j a^2(x_j - \mu)^2 = a^2\sigma^2 σ 2 ( x ′ ) = d 1 ∑ j a 2 ( x j − μ ) 2 = a 2 σ 2 。a > 0 a > 0 a > 0 なので σ 2 ( x ′ ) = a σ \sqrt{\sigma^2(\boldsymbol{x}')} = a\sigma σ 2 ( x ′ ) = aσ 。したがって
x ′ − μ ( x ′ ) 1 σ 2 ( x ′ ) = a ( x − μ 1 ) a σ = x − μ 1 σ \frac{\boldsymbol{x}' - \mu(\boldsymbol{x}')\boldsymbol{1}}{\sqrt{\sigma^2(\boldsymbol{x}')}} = \frac{a(\boldsymbol{x} - \mu\boldsymbol{1})}{a\sigma} = \frac{\boldsymbol{x} - \mu\boldsymbol{1}}{\sigma} σ 2 ( x ′ ) x ′ − μ ( x ′ ) 1 = aσ a ( x − μ 1 ) = σ x − μ 1 で、これに γ ⊙ \boldsymbol{\gamma}\odot γ ⊙ と + β +\boldsymbol{\beta} + β を施したものが L N \mathrm{LN} LN なので、両者は等しくなります。
y j = ( x j − μ ) / σ y_j = (x_j - \mu)/\sigma y j = ( x j − μ ) / σ です。∑ j y j = 1 σ ( ∑ j x j − d μ ) = 0 \sum_j y_j = \frac1\sigma\big(\sum_j x_j - d\mu\big) = 0 ∑ j y j = σ 1 ( ∑ j x j − d μ ) = 0 より μ ( y ) = 0 \mu(\boldsymbol{y}) = 0 μ ( y ) = 0 。σ 2 ( y ) = 1 d ∑ j y j 2 = 1 d σ 2 ∑ j ( x j − μ ) 2 = d σ 2 d σ 2 = 1 \sigma^2(\boldsymbol{y}) = \frac1d\sum_j y_j^2 = \frac{1}{d\sigma^2}\sum_j(x_j - \mu)^2 = \frac{d\sigma^2}{d\sigma^2} = 1 σ 2 ( y ) = d 1 ∑ j y j 2 = d σ 2 1 ∑ j ( x j − μ ) 2 = d σ 2 d σ 2 = 1 。∥ y ∥ 2 = ∑ j y j 2 = d σ 2 ( y ) = d \|\boldsymbol{y}\|^2 = \sum_j y_j^2 = d\,\sigma^2(\boldsymbol{y}) = d ∥ y ∥ 2 = ∑ j y j 2 = d σ 2 ( y ) = d 。
∎
2 は、層正規化の出力が「1 \boldsymbol{1} 1 に直交する、半径 d \sqrt{d} d の球面」の上にあることを言っています。入力の大きさの情報は捨てられ、向きだけが残ります。γ , β \boldsymbol{\gamma}, \boldsymbol{\beta} γ , β は、そのあとで成分ごとの倍率とずれを学習で付け直すためのパラメータです。
例 3.2 (3 倍しても出力は変わらない )
x = ( 1 , 2 , 3 , 6 ) \boldsymbol{x} = (1, 2, 3, 6) x = ( 1 , 2 , 3 , 6 ) とします。μ = 3 \mu = 3 μ = 3 、σ 2 = 1 4 ( 4 + 1 + 0 + 9 ) = 3.5 \sigma^2 = \frac14(4 + 1 + 0 + 9) = 3.5 σ 2 = 4 1 ( 4 + 1 + 0 + 9 ) = 3.5 、σ = 1.8708 \sigma = 1.8708 σ = 1.8708 なので、γ = 1 \boldsymbol{\gamma} = \boldsymbol{1} γ = 1 、β = 0 \boldsymbol{\beta} = \boldsymbol{0} β = 0 、ε = 0 \varepsilon = 0 ε = 0 で
L N ( x ) = ( − 2 , − 1 , 0 , 3 ) 1.8708 = ( − 1.0690 , − 0.5345 , 0 , 1.6036 ) \mathrm{LN}(\boldsymbol{x}) = \frac{(-2, -1, 0, 3)}{1.8708} = (-1.0690,\ -0.5345,\ 0,\ 1.6036) LN ( x ) = 1.8708 ( − 2 , − 1 , 0 , 3 ) = ( − 1.0690 , − 0.5345 , 0 , 1.6036 ) です。3 x + 5 ⋅ 1 = ( 8 , 11 , 14 , 23 ) 3\boldsymbol{x} + 5\cdot\boldsymbol{1} = (8, 11, 14, 23) 3 x + 5 ⋅ 1 = ( 8 , 11 , 14 , 23 ) では μ = 14 \mu = 14 μ = 14 、σ 2 = 1 4 ( 36 + 9 + 0 + 81 ) = 31.5 = 9 × 3.5 \sigma^2 = \frac14(36 + 9 + 0 + 81) = 31.5 = 9 \times 3.5 σ 2 = 4 1 ( 36 + 9 + 0 + 81 ) = 31.5 = 9 × 3.5 、σ = 5.6125 \sigma = 5.6125 σ = 5.6125 で、( − 6 , − 3 , 0 , 9 ) / 5.6125 (-6, -3, 0, 9)/5.6125 ( − 6 , − 3 , 0 , 9 ) /5.6125 は同じベクトルになります。ノルムは 1.1428 + 0.2857 + 0 + 2.5714 = 4 = 2 = d \sqrt{1.1428 + 0.2857 + 0 + 2.5714} = \sqrt{4} = 2 = \sqrt{d} 1.1428 + 0.2857 + 0 + 2.5714 = 4 = 2 = d です。
次の命題は、層正規化を通して勾配がどう戻るかを調べます。入力に定数を足しても定数倍しても出力は変わらないので、その 2 方向への変化率は 0 になるはずです。証明の要は、ヤコビ行列を「その 2 方向の成分を取り除く操作(直交射影)の 1 / σ 1/\sigma 1/ σ 倍」と読み替えることで、そのために 1 \boldsymbol{1} 1 と y \boldsymbol{y} y から正規直交基底を作ります。
命題 3.3 (層正規化のヤコビ行列 ) ✓
ε = 0 \varepsilon = 0 ε = 0 、γ = 1 \boldsymbol{\gamma} = \boldsymbol{1} γ = 1 、β = 0 \boldsymbol{\beta} = \boldsymbol{0} β = 0 とし、x ∈ R d \boldsymbol{x} \in \mathbb{R}^d x ∈ R d は成分がすべて等しくはないとする。σ : = σ 2 ( x ) \sigma := \sqrt{\sigma^2(\boldsymbol{x})} σ := σ 2 ( x ) 、y : = L N ( x ) \boldsymbol{y} := \mathrm{LN}(\boldsymbol{x}) y := LN ( x ) と書くと、L N \mathrm{LN} LN は x \boldsymbol{x} x で微分可能で、ヤコビ行列は
J ( x ) = 1 σ ( I − 1 d 1 1 T − 1 d y y T ) J(\boldsymbol{x}) = \frac{1}{\sigma}\Big( I - \frac{1}{d}\boldsymbol{1}\boldsymbol{1}^{\mathsf{T}} - \frac{1}{d}\boldsymbol{y}\boldsymbol{y}^{\mathsf{T}} \Big) J ( x ) = σ 1 ( I − d 1 1 1 T − d 1 y y T ) である。さらに次が成り立つ。
J ( x ) 1 = 0 J(\boldsymbol{x})\boldsymbol{1} = \boldsymbol{0} J ( x ) 1 = 0 、J ( x ) ( x − μ ( x ) 1 ) = 0 J(\boldsymbol{x})\big(\boldsymbol{x} - \mu(\boldsymbol{x})\boldsymbol{1}\big) = \boldsymbol{0} J ( x ) ( x − μ ( x ) 1 ) = 0 。
W : = s p a n { 1 , x − μ ( x ) 1 } W := \mathrm{span}\{\boldsymbol{1},\ \boldsymbol{x} - \mu(\boldsymbol{x})\boldsymbol{1}\} W := span { 1 , x − μ ( x ) 1 } とすると、σ J ( x ) \sigma J(\boldsymbol{x}) σ J ( x ) は W W W の直交補空間 W ⊥ W^{\perp} W ⊥ への直交射影である。すなわち v ∈ W ⊥ \boldsymbol{v} \in W^{\perp} v ∈ W ⊥ ならば J ( x ) v = v / σ J(\boldsymbol{x})\boldsymbol{v} = \boldsymbol{v}/\sigma J ( x ) v = v / σ 。
任意の a > 0 a > 0 a > 0 について J ( a x ) = J ( x ) / a J(a\boldsymbol{x}) = J(\boldsymbol{x})/a J ( a x ) = J ( x ) / a 。
証明(命題 3.3) c i : = x i − μ ( x ) c_i := x_i - \mu(\boldsymbol{x}) c i := x i − μ ( x ) と置きます。∂ μ / ∂ x j = 1 / d \partial\mu/\partial x_j = 1/d ∂ μ / ∂ x j = 1/ d なので ∂ c i / ∂ x j = δ i j − 1 / d \partial c_i/\partial x_j = \delta_{ij} - 1/d ∂ c i / ∂ x j = δ ij − 1/ d です。σ 2 = 1 d ∑ i c i 2 \sigma^2 = \frac1d\sum_i c_i^2 σ 2 = d 1 ∑ i c i 2 を微分すると
∂ σ 2 ∂ x j = 2 d ∑ i c i ( δ i j − 1 d ) = 2 d ( c j − 1 d ∑ i c i ) = 2 d c j \frac{\partial \sigma^2}{\partial x_j} = \frac{2}{d}\sum_i c_i\Big(\delta_{ij} - \frac1d\Big) = \frac2d\Big(c_j - \frac1d\sum_i c_i\Big) = \frac{2}{d}c_j ∂ x j ∂ σ 2 = d 2 i ∑ c i ( δ ij − d 1 ) = d 2 ( c j − d 1 i ∑ c i ) = d 2 c j (∑ i c i = 0 \sum_i c_i = 0 ∑ i c i = 0 を使いました)。σ = σ 2 \sigma = \sqrt{\sigma^2} σ = σ 2 、σ > 0 \sigma > 0 σ > 0 なので ∂ σ / ∂ x j = 1 2 σ ⋅ 2 d c j = c j d σ \partial\sigma/\partial x_j = \dfrac{1}{2\sigma}\cdot\dfrac{2}{d}c_j = \dfrac{c_j}{d\sigma} ∂ σ / ∂ x j = 2 σ 1 ⋅ d 2 c j = d σ c j 。y i = c i / σ y_i = c_i/\sigma y i = c i / σ に商の微分を使うと
∂ y i ∂ x j = 1 σ ( δ i j − 1 d ) − c i σ 2 ⋅ c j d σ = 1 σ ( δ i j − 1 d − 1 d y i y j ) \frac{\partial y_i}{\partial x_j} = \frac{1}{\sigma}\Big(\delta_{ij} - \frac1d\Big) - \frac{c_i}{\sigma^2}\cdot\frac{c_j}{d\sigma}
= \frac{1}{\sigma}\Big(\delta_{ij} - \frac1d - \frac{1}{d}\,y_iy_j\Big) ∂ x j ∂ y i = σ 1 ( δ ij − d 1 ) − σ 2 c i ⋅ d σ c j = σ 1 ( δ ij − d 1 − d 1 y i y j ) で、これが主張の行列の ( i , j ) (i, j) ( i , j ) 成分です。偏導関数が連続なので微分可能です。
2 を先に示します。u : = 1 / d \boldsymbol{u} := \boldsymbol{1}/\sqrt{d} u := 1 / d 、w : = y / d \boldsymbol{w} := \boldsymbol{y}/\sqrt{d} w := y / d と置くと、∥ u ∥ = 1 \|\boldsymbol{u}\| = 1 ∥ u ∥ = 1 、命題 3.1 の 2 より ∥ w ∥ = ∥ y ∥ / d = 1 \|\boldsymbol{w}\| = \|\boldsymbol{y}\|/\sqrt{d} = 1 ∥ w ∥ = ∥ y ∥/ d = 1 、⟨ u , w ⟩ = 1 d ∑ j y j = 0 \langle\boldsymbol{u}, \boldsymbol{w}\rangle = \frac1d\sum_j y_j = 0 ⟨ u , w ⟩ = d 1 ∑ j y j = 0 です。つまり u , w \boldsymbol{u}, \boldsymbol{w} u , w は W = s p a n { 1 , y } = s p a n { 1 , x − μ 1 } W = \mathrm{span}\{\boldsymbol{1}, \boldsymbol{y}\} = \mathrm{span}\{\boldsymbol{1}, \boldsymbol{x} - \mu\boldsymbol{1}\} W = span { 1 , y } = span { 1 , x − μ 1 } の正規直交基底で、
σ J ( x ) = I − u u T − w w T \sigma J(\boldsymbol{x}) = I - \boldsymbol{u}\boldsymbol{u}^{\mathsf{T}} - \boldsymbol{w}\boldsymbol{w}^{\mathsf{T}} σ J ( x ) = I − u u T − w w T です。直交分解定理(定理 7.1[内積空間とグラム・シュミット直交化] の 2)より、W W W への直交射影は P W v = ⟨ v , u ⟩ u + ⟨ v , w ⟩ w = ( u u T + w w T ) v P_W\boldsymbol{v} = \langle\boldsymbol{v},\boldsymbol{u}\rangle\boldsymbol{u} + \langle\boldsymbol{v},\boldsymbol{w}\rangle\boldsymbol{w} = (\boldsymbol{u}\boldsymbol{u}^{\mathsf{T}} + \boldsymbol{w}\boldsymbol{w}^{\mathsf{T}})\boldsymbol{v} P W v = ⟨ v , u ⟩ u + ⟨ v , w ⟩ w = ( u u T + w w T ) v なので、σ J ( x ) = I − P W \sigma J(\boldsymbol{x}) = I - P_W σ J ( x ) = I − P W です。同じ定理の 1 より任意の v \boldsymbol{v} v は v = P W v + v ′ \boldsymbol{v} = P_W\boldsymbol{v} + \boldsymbol{v}' v = P W v + v ′ (v ′ ∈ W ⊥ \boldsymbol{v}' \in W^{\perp} v ′ ∈ W ⊥ )と一意に書けるので、I − P W I - P_W I − P W は W ⊥ W^{\perp} W ⊥ への直交射影です。v ∈ W ⊥ \boldsymbol{v} \in W^{\perp} v ∈ W ⊥ なら P W v = 0 P_W\boldsymbol{v} = \boldsymbol{0} P W v = 0 で、J ( x ) v = v / σ J(\boldsymbol{x})\boldsymbol{v} = \boldsymbol{v}/\sigma J ( x ) v = v / σ です。
1 \boldsymbol{1} 1 と x − μ 1 \boldsymbol{x} - \mu\boldsymbol{1} x − μ 1 は W W W の元なので、( I − P W ) (I - P_W) ( I − P W ) で 0 \boldsymbol{0} 0 に写ります。
命題 3.1 の 1 より L N ( a x ) = y \mathrm{LN}(a\boldsymbol{x}) = \boldsymbol{y} LN ( a x ) = y で、その証明より σ 2 ( a x ) = a σ \sqrt{\sigma^2(a\boldsymbol{x})} = a\sigma σ 2 ( a x ) = aσ 。ヤコビ行列の式で y \boldsymbol{y} y は同じ、σ \sigma σ が a σ a\sigma aσ に替わるので J ( a x ) = J ( x ) / a J(a\boldsymbol{x}) = J(\boldsymbol{x})/a J ( a x ) = J ( x ) / a です。
∎
1 は 命題 3.1 の微分形です。1 \boldsymbol{1} 1 の向き(全成分に同じ数を足す)と x − μ 1 \boldsymbol{x} - \mu\boldsymbol{1} x − μ 1 の向き(平均からのずれを定数倍する)に動かしても出力が変わらないので、その 2 方向の微分が 0 になります。3 は、層正規化の手前の値が大きいほど、そこを通って戻る勾配が小さくなることを言っています。入力を a a a 倍すると勾配は 1 / a 1/a 1/ a 倍です。なお d = 2 d = 2 d = 2 では W = R 2 W = \mathbb{R}^2 W = R 2 となって J = O J = O J = O です。実際、d = 2 d = 2 d = 2 の層正規化の出力は ( 1 , − 1 ) (1, -1) ( 1 , − 1 ) か ( − 1 , 1 ) (-1, 1) ( − 1 , 1 ) のどちらかしか取りません。
この節では、n × d n \times d n × d 行列を n d nd n d 次元のベクトルとみなし、ブロックの中の部品(注意と MLP)を区別せずに通し番号 l = 1 , … , M l = 1, \ldots, M l = 1 , … , M を付けます(L L L ブロックなら M = 2 L M = 2L M = 2 L )。
次の命題のねらいは、残差接続があると勾配に「層を通らない道」が必ず残ることを、式で示すことです。Pre-LN では各部品が前の値に変化分を足すだけなので、1 段のヤコビ行列は I + J l I + J_l I + J l の形になります。この積を展開すると、各段で「迂回する(I I I を選ぶ)」か「通る(J l J_l J l を選ぶ)」かの 2 択の組み合わせになり、3 段なら下の図のように 8 通りです。Post-LN では足したあとに正規化が掛かるので、1 段が K l ( I + D l ) K_l(I + D_l) K l ( I + D l ) の形になります。K l K_l K l は正規化のヤコビ行列、D l D_l D l は部品 F l F_l F l のヤコビ行列で、どの段でも K l K_l K l が掛かるため、単独の I I I の項は現れません。
I J₃ I J₂ I J₂ I J₁ I J₁ I J₁ I J₁ I(恒等経路) J₁ J₂ J₂J₁ J₃ J₃J₁ J₃J₂ J₃J₂J₁ 3 段の Pre-LN で、積 (I + J₃)(I + J₂)(I + J₁) を展開したときの 8 つの項。各段で I(迂回)か J(通る)を選ぶ。すべて I を選ぶ道(太線)が恒等経路で、残差接続が無ければ一番下の J₃J₂J₁ だけが残る。
命題 4.1 (残差接続の恒等経路 ) ✓
F 1 , … , F M F_1, \ldots, F_M F 1 , … , F M と正規化 N 1 , … , N M N_1, \ldots, N_M N 1 , … , N M を R n d \mathbb{R}^{nd} R n d から R n d \mathbb{R}^{nd} R n d への微分可能な写像とする。
(Pre-LN) x l : = x l − 1 + F l ( N l ( x l − 1 ) ) \boldsymbol{x}_l := \boldsymbol{x}_{l-1} + F_l\big(N_l(\boldsymbol{x}_{l-1})\big) x l := x l − 1 + F l ( N l ( x l − 1 ) ) (l = 1 , … , M l = 1, \ldots, M l = 1 , … , M )とする。G l : = F l ∘ N l G_l := F_l \circ N_l G l := F l ∘ N l 、J l : = J_l := J l := (G l G_l G l の x l − 1 \boldsymbol{x}_{l-1} x l − 1 でのヤコビ行列)と書くと
x M = x 0 + ∑ l = 1 M G l ( x l − 1 ) , ∂ x M ∂ x l = ( I + J M ) ( I + J M − 1 ) ⋯ ( I + J l + 1 ) = I + ∑ ∅ ≠ S ⊂ { l + 1 , … , M } ∏ k ∈ S ← J k \boldsymbol{x}_M = \boldsymbol{x}_0 + \sum_{l=1}^{M} G_l(\boldsymbol{x}_{l-1}), \qquad
\frac{\partial \boldsymbol{x}_M}{\partial \boldsymbol{x}_l} = (I + J_M)(I + J_{M-1})\cdots(I + J_{l+1}) = I + \sum_{\emptyset \ne S \subset \{l+1, \ldots, M\}} \ \prod_{k \in S}^{\leftarrow} J_k x M = x 0 + l = 1 ∑ M G l ( x l − 1 ) , ∂ x l ∂ x M = ( I + J M ) ( I + J M − 1 ) ⋯ ( I + J l + 1 ) = I + ∅ = S ⊂ { l + 1 , … , M } ∑ k ∈ S ∏ ← J k が成り立つ。ここで ∏ ← \prod^{\leftarrow} ∏ ← は添字の大きい順に左から並べた積である。とくに右辺には、どの J k J_k J k も含まない項として恒等行列 I I I がちょうど 1 つある。
(Post-LN) x l : = N l ( x l − 1 + F l ( x l − 1 ) ) \boldsymbol{x}_l := N_l\big(\boldsymbol{x}_{l-1} + F_l(\boldsymbol{x}_{l-1})\big) x l := N l ( x l − 1 + F l ( x l − 1 ) ) とする。D l : = D_l := D l := (F l F_l F l の x l − 1 \boldsymbol{x}_{l-1} x l − 1 でのヤコビ行列)、K l : = K_l := K l := (N l N_l N l の x l − 1 + F l ( x l − 1 ) \boldsymbol{x}_{l-1} + F_l(\boldsymbol{x}_{l-1}) x l − 1 + F l ( x l − 1 ) でのヤコビ行列)と書くと
∂ x M ∂ x l = K M ( I + D M ) K M − 1 ( I + D M − 1 ) ⋯ K l + 1 ( I + D l + 1 ) \frac{\partial \boldsymbol{x}_M}{\partial \boldsymbol{x}_l} = K_M(I + D_M)\,K_{M-1}(I + D_{M-1})\cdots K_{l+1}(I + D_{l+1}) ∂ x l ∂ x M = K M ( I + D M ) K M − 1 ( I + D M − 1 ) ⋯ K l + 1 ( I + D l + 1 ) で、どの D k D_k D k も含まない項は K M K M − 1 ⋯ K l + 1 K_M K_{M-1}\cdots K_{l+1} K M K M − 1 ⋯ K l + 1 である。
証明(命題 4.1) Pre-LN。 定義より x l − x l − 1 = G l ( x l − 1 ) \boldsymbol{x}_l - \boldsymbol{x}_{l-1} = G_l(\boldsymbol{x}_{l-1}) x l − x l − 1 = G l ( x l − 1 ) で、l = 1 , … , M l = 1, \ldots, M l = 1 , … , M について足すと左辺は x M − x 0 \boldsymbol{x}_M - \boldsymbol{x}_0 x M − x 0 になり、1 つ目の式を得ます。
写像 x k − 1 ↦ x k = x k − 1 + G k ( x k − 1 ) \boldsymbol{x}_{k-1} \mapsto \boldsymbol{x}_k = \boldsymbol{x}_{k-1} + G_k(\boldsymbol{x}_{k-1}) x k − 1 ↦ x k = x k − 1 + G k ( x k − 1 ) のヤコビ行列は I + J k I + J_k I + J k です。x M \boldsymbol{x}_M x M は x l \boldsymbol{x}_l x l にこの写像を k = l + 1 , … , M k = l+1, \ldots, M k = l + 1 , … , M の順に施したものなので、連鎖律(定理 3.1[ニューラルネットワークと逆伝播] )を繰り返し使って、ヤコビ行列はあとから施す写像のものを左に置いた積 ( I + J M ) ⋯ ( I + J l + 1 ) (I + J_M)\cdots(I + J_{l+1}) ( I + J M ) ⋯ ( I + J l + 1 ) です。
この積を展開します。各因子 ( I + J k ) (I + J_k) ( I + J k ) から I I I か J k J_k J k のどちらかを選んで掛け合わせた項が、選び方の数 2 M − l 2^{M-l} 2 M − l だけ出ます。J k J_k J k を選んだ添字の集合を S S S とすると、その項は ∏ k ∈ S ← J k \prod^{\leftarrow}_{k\in S}J_k ∏ k ∈ S ← J k です(I I I は積の中で消えます)。S = ∅ S = \emptyset S = ∅ の項が I I I で、これは 1 つだけです。
Post-LN。 写像 x k − 1 ↦ x k − 1 + F k ( x k − 1 ) \boldsymbol{x}_{k-1} \mapsto \boldsymbol{x}_{k-1} + F_k(\boldsymbol{x}_{k-1}) x k − 1 ↦ x k − 1 + F k ( x k − 1 ) のヤコビ行列は I + D k I + D_k I + D k 、それに N k N_k N k を合成した写像のヤコビ行列は連鎖律より K k ( I + D k ) K_k(I + D_k) K k ( I + D k ) です。これを k = l + 1 , … , M k = l+1, \ldots, M k = l + 1 , … , M について左に掛けていけば主張の式になります。各 ( I + D k ) (I + D_k) ( I + D k ) から I I I を選んだ項が K M ⋯ K l + 1 K_M\cdots K_{l+1} K M ⋯ K l + 1 です。
∎
損失 L \mathcal{L} L が x M \boldsymbol{x}_M x M の関数のとき、連鎖律より ∇ x l L = ( ∂ x M / ∂ x l ) T ∇ x M L \nabla_{\boldsymbol{x}_l}\mathcal{L} = \big(\partial\boldsymbol{x}_M/\partial\boldsymbol{x}_l\big)^{\mathsf{T}}\nabla_{\boldsymbol{x}_M}\mathcal{L} ∇ x l L = ( ∂ x M / ∂ x l ) T ∇ x M L です。Pre-LN では、右辺に ∇ x M L \nabla_{\boldsymbol{x}_M}\mathcal{L} ∇ x M L そのもの(I I I の項)が、途中の層を 1 つも通らずに含まれます。残差接続のない合成では、勾配は層ごとのヤコビ行列の積 1 つだけで、その大きさの上界は因子の数だけ掛け合わさって指数的に小さくなりえました(命題 8.1[ニューラルネットワークと逆伝播] )。恒等経路は、その積を経由しない道を 1 本用意します。
Post-LN では、同じ位置にある項が層正規化のヤコビ行列の積 K M ⋯ K l + 1 K_M\cdots K_{l+1} K M ⋯ K l + 1 になります。命題 3.3 より各 K k K_k K k は、行ごとに 2 方向を消して 1 / σ 1/\sigma 1/ σ 倍する行列なので、この項は恒等行列ではありません。
定理 5.1 (デコーダのみの Transformer のパラメータ数 ) ✓
定義 2.3 のモデル(語彙 ∣ V ∣ |V| ∣ V ∣ 、次元 d d d 、層数 L L L 、MLP の幅 d f f d_{\mathrm{ff}} d ff 、長さ L c t x L_{\mathrm{ctx}} L ctx の学習する位置埋め込み、入出力の重み共有あり、注意・MLP にバイアスあり)のパラメータ数は
∣ V ∣ d + L c t x d + L ( 4 d 2 + 4 d ⏟ 注意 + 2 d d f f + d f f + d ⏟ MLP + 4 d ⏟ 層正規化 2 つ ) + 2 d ⏟ 最後の層正規化 |V|\,d + L_{\mathrm{ctx}}\,d + L\big(\underbrace{4d^2 + 4d}_{\text{注意}} + \underbrace{2d\,d_{\mathrm{ff}} + d_{\mathrm{ff}} + d}_{\text{MLP}} + \underbrace{4d}_{\text{層正規化 2 つ}}\big) + \underbrace{2d}_{\text{最後の層正規化}} ∣ V ∣ d + L ctx d + L ( 注意 4 d 2 + 4 d + MLP 2 d d ff + d ff + d + 層正規化 2 つ 4 d ) + 最後の層正規化 2 d である。d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d のとき、1 層あたりは 12 d 2 + 13 d 12d^2 + 13d 12 d 2 + 13 d である。位置を RoPE や正弦波で与える場合は L c t x d L_{\mathrm{ctx}}\,d L ctx d の項が無くなり、重み共有をしない場合は出力側の行列の ∣ V ∣ d |V|\,d ∣ V ∣ d が加わる。
証明(定理 5.1) 構成要素ごとに成分の個数を数えます。
埋め込み行列 E ∈ R ∣ V ∣ × d E \in \mathbb{R}^{|V|\times d} E ∈ R ∣ V ∣ × d :∣ V ∣ d |V|\,d ∣ V ∣ d 個。出力層は同じ E E E を使うので、新しいパラメータはありません。
位置埋め込み P ∈ R L c t x × d P \in \mathbb{R}^{L_{\mathrm{ctx}} \times d} P ∈ R L ctx × d :L c t x d L_{\mathrm{ctx}}\,d L ctx d 個(命題 4.6[埋め込みと位置符号化] )。
各ブロックのマルチヘッド自己注意:4 d 2 + 4 d 4d^2 + 4d 4 d 2 + 4 d 個(命題 7.1[自己注意] )。
各ブロックの MLP:W 1 W_1 W 1 が d d f f d\,d_{\mathrm{ff}} d d ff 、b 1 \boldsymbol{b}_1 b 1 が d f f d_{\mathrm{ff}} d ff 、W 2 W_2 W 2 が d f f d d_{\mathrm{ff}}\,d d ff d 、b 2 \boldsymbol{b}_2 b 2 が d d d で、計 2 d d f f + d f f + d 2d\,d_{\mathrm{ff}} + d_{\mathrm{ff}} + d 2 d d ff + d ff + d 個。
各ブロックの層正規化 2 つ:それぞれ γ , β ∈ R d \boldsymbol{\gamma}, \boldsymbol{\beta} \in \mathbb{R}^d γ , β ∈ R d で 2 d 2d 2 d 個、計 4 d 4d 4 d 個。
最後の層正規化:2 d 2d 2 d 個。
ブロックは L L L 個あるので、合計が主張の式です。d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d を代入すると、1 層あたり 4 d 2 + 4 d + 8 d 2 + 4 d + d + 4 d = 12 d 2 + 13 d 4d^2 + 4d + 8d^2 + 4d + d + 4d = 12d^2 + 13d 4 d 2 + 4 d + 8 d 2 + 4 d + d + 4 d = 12 d 2 + 13 d です。RoPE と正弦波はパラメータを持たないので P P P の分が無くなります。重み共有をしなければ、出力側に別の ∣ V ∣ × d |V| \times d ∣ V ∣ × d 行列が要ります。
∎
例 5.2 (小さなモデルで数える )
∣ V ∣ = 10 |V| = 10 ∣ V ∣ = 10 、d = 4 d = 4 d = 4 、d f f = 16 d_{\mathrm{ff}} = 16 d ff = 16 、L = 2 L = 2 L = 2 、L c t x = 8 L_{\mathrm{ctx}} = 8 L ctx = 8 とします。
埋め込み:10 × 4 = 40 10 \times 4 = 40 10 × 4 = 40 。位置:8 × 4 = 32 8 \times 4 = 32 8 × 4 = 32 。
1 層の注意:4 × 16 + 4 × 4 = 80 4\times16 + 4\times4 = 80 4 × 16 + 4 × 4 = 80 。MLP:2 × 4 × 16 + 16 + 4 = 148 2\times4\times16 + 16 + 4 = 148 2 × 4 × 16 + 16 + 4 = 148 。層正規化:16 16 16 。1 層で 244 244 244 (12 d 2 + 13 d = 192 + 52 = 244 12d^2 + 13d = 192 + 52 = 244 12 d 2 + 13 d = 192 + 52 = 244 とも合います)。
最後の層正規化:8 8 8 。
合計は 40 + 32 + 2 × 244 + 8 = 568 40 + 32 + 2\times244 + 8 = 568 40 + 32 + 2 × 244 + 8 = 568 です。9 節の実装で配列の成分を数えると、同じ 568 になります。
例 5.3 (12 層・d = 768 の構成での検算 )
Radford らの最小の構成は 12 層・d = 768 d = 768 d = 768 で、語彙は 50,257、文脈長は 1,024 です([5] 表 2、2.3 節)。層正規化の配置は Pre-LN で、最後に正規化が 1 つあります(同 2.3 節)。この値を 定理 5.1 の式に入れます。MLP の幅は d f f = 4 d = 3072 d_{\mathrm{ff}} = 4d = 3072 d ff = 4 d = 3072 とします。
構成要素 式 個数 埋め込み 50257 × 768 50257 \times 768 50257 × 768 38,597,376 位置埋め込み 1024 × 768 1024 \times 768 1024 × 768 786,432 ブロック 1 つ 12 × 768 2 + 13 × 768 12\times768^2 + 13\times768 12 × 76 8 2 + 13 × 768 7,087,872 ブロック 12 個 12 × 7,087,872 12 \times 7{,}087{,}872 12 × 7 , 087 , 872 85,054,464 最後の層正規化 2 × 768 2\times768 2 × 768 1,536 合計 124,439,808
パラメータ数の式から読み取れることを 2 つ挙げます。1 つ目に、ブロックの部分は d d d の 2 乗と L L L に比例し、語彙や文脈長には依りません。2 つ目に、小さいモデルでは埋め込みの占める割合が大きくなります。上の構成では 38,597,376 / 124,439,808 ≈ 31 % 38{,}597{,}376 / 124{,}439{,}808 \approx 31\% 38 , 597 , 376/124 , 439 , 808 ≈ 31% が埋め込みです。語彙の大きさ ∣ V ∣ |V| ∣ V ∣ は第 1 章のマージ回数で決まるので、トークン化の設計がモデルの大きさに直接効きます。
命題 6.1 (1 層の順伝播の計算量 ) ✓
長さ n n n の列に対する Pre-LN(または Post-LN)のブロック 1 つの順伝播で、スカラーの乗算の回数は
4 n d 2 + 2 n 2 d ⏟ 注意 + 2 n d d f f ⏟ MLP + O ( n d ) \underbrace{4nd^2 + 2n^2 d}_{\text{注意}} + \underbrace{2nd\,d_{\mathrm{ff}}}_{\text{MLP}} + O(nd) 注意 4 n d 2 + 2 n 2 d + MLP 2 n d d ff + O ( n d ) である。d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d のとき 12 n d 2 + 2 n 2 d + O ( n d ) 12nd^2 + 2n^2d + O(nd) 12 n d 2 + 2 n 2 d + O ( n d ) で、時間計算量は O ( n d 2 + n 2 d ) O(nd^2 + n^2d) O ( n d 2 + n 2 d ) である。n < 6 d n < 6d n < 6 d のとき、n n n について 1 次の項 12 n d 2 12nd^2 12 n d 2 が 2 次の項 2 n 2 d 2n^2d 2 n 2 d より大きい。モデル全体では、これが L L L 層分と、出力層の n d ∣ V ∣ nd\,|V| n d ∣ V ∣ 回になる。
証明(命題 6.1) 注意の 4 n d 2 + 2 n 2 d 4nd^2 + 2n^2d 4 n d 2 + 2 n 2 d は 命題 7.2[自己注意] です。MLP は、X W 1 XW_1 X W 1 (n × d n \times d n × d と d × d f f d \times d_{\mathrm{ff}} d × d ff の積)が n d d f f nd\,d_{\mathrm{ff}} n d d ff 回、その結果に W 2 W_2 W 2 を掛けるのが n d f f d n\,d_{\mathrm{ff}}\,d n d ff d 回で、計 2 n d d f f 2nd\,d_{\mathrm{ff}} 2 n d d ff 回です。層正規化は 1 行につき平均・分散・除算・γ \boldsymbol{\gamma} γ との積で d d d の定数倍、残差の加算は乗算なしなので、合わせて O ( n d ) O(nd) O ( n d ) です。活性化関数と softmax の評価は乗算とは別に数えますが、回数は O ( n d f f + h n 2 ) O(n\,d_{\mathrm{ff}} + hn^2) O ( n d ff + h n 2 ) で、上の主要項を超えません。
d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d なら 4 n d 2 + 8 n d 2 = 12 n d 2 4nd^2 + 8nd^2 = 12nd^2 4 n d 2 + 8 n d 2 = 12 n d 2 です。O O O 記法の定義(定義 3.1[計算量と O 記法] )より全体は O ( n d 2 + n 2 d ) O(nd^2 + n^2d) O ( n d 2 + n 2 d ) 。12 n d 2 > 2 n 2 d 12nd^2 > 2n^2d 12 n d 2 > 2 n 2 d は、両辺を 2 n d > 0 2nd > 0 2 n d > 0 で割ると 6 d > n 6d > n 6 d > n と同値です。出力層 L N f ( X ( L ) ) E T \mathrm{LN}_f(X^{(L)})E^{\mathsf{T}} LN f ( X ( L ) ) E T は n × d n \times d n × d と d × ∣ V ∣ d \times |V| d × ∣ V ∣ の積で n d ∣ V ∣ nd\,|V| n d ∣ V ∣ 回です。
これは 1 回の順伝播についての評価です。勾配の計算(逆伝播)は順伝播の定数倍の演算で済みます(命題 6.1[ニューラルネットワークと逆伝播] )。
∎
たとえば d = 768 d = 768 d = 768 、n = 1024 n = 1024 n = 1024 では、12 n d 2 = 7,247,757,312 12nd^2 = 7{,}247{,}757{,}312 12 n d 2 = 7 , 247 , 757 , 312 、2 n 2 d = 1,610,612,736 2n^2d = 1{,}610{,}612{,}736 2 n 2 d = 1 , 610 , 612 , 736 で、注意の 2 次の項は MLP と射影の項の 0.222 0.222 0.222 倍(= n / ( 6 d ) = n/(6d) = n / ( 6 d ) )です。「注意は列の長さの 2 乗で重くなる」のはそのとおりですが、列が 6 d 6d 6 d より短いあいだは、計算の大半は n n n に比例する部分です。2 乗の項が支配的になるのは n n n が 6 d = 4608 6d = 4608 6 d = 4608 を超えてからで、長い文脈を扱うときの工夫は第 7 章で扱います。
命題 7.1 (MLP と層正規化は位置の間で情報を混ぜない ) ✓
位置ごとの MLP と層正規化は行ごとに働く写像である。すなわち出力の第 i i i 行は入力の第 i i i 行だけの関数で、i ≠ j i \ne j i = j のとき、出力の第 i i i 行を入力の第 j j j 行で微分したヤコビ行列は 0 である。したがって、自己注意を含まず、行ごとに働く写像・位置ベクトルの加算・それらの合成と和(残差接続)だけからなるモデルでは、位置 i i i の出力は位置 i i i のトークンと i i i だけで決まる。
証明(命題 7.1) 定義 2.2 より M L P ( X ) \mathrm{MLP}(X) MLP ( X ) の第 i i i 行は g ( x i ) g(\boldsymbol{x}_i) g ( x i ) 、定義 2.1 より L N ( X ) \mathrm{LN}(X) LN ( X ) の第 i i i 行は L N ( x i ) \mathrm{LN}(\boldsymbol{x}_i) LN ( x i ) で、どちらも x i \boldsymbol{x}_i x i だけの関数です。x j \boldsymbol{x}_j x j (j ≠ i j \ne i j = i )を含まない式を x j \boldsymbol{x}_j x j で微分すれば 0 です。
後半は組み立ての段数についての帰納法です。「第 i i i 行が、入力の第 i i i 行と i i i だけの関数である」という性質は、入力の埋め込み(第 i i i 行は E t i + P i E_{t_i} + P_i E t i + P i )で成り立ち、行ごとに働く写像との合成、2 つのそのような写像の和で保たれます(合成 g ( f i ( x i ) ) g(f_i(\boldsymbol{x}_i)) g ( f i ( x i )) も和 f i ( x i ) + f i ′ ( x i ) f_i(\boldsymbol{x}_i) + f'_i(\boldsymbol{x}_i) f i ( x i ) + f i ′ ( x i ) も、x i \boldsymbol{x}_i x i と i i i だけの関数)。
∎
つまり、ある位置の予測が別の位置のトークンに依存できるのは、注意があるからです。ブロックの中での役割分担は、「注意がほかの位置から情報を集め、MLP が集めた結果をその位置の中で加工する」と整理できます。
命題 7.2 (ブロックとモデル全体の同変性・因果性 ) ✓
マスクのない注意を使った Pre-LN・Post-LN のブロックは置換同変である。
因果マスクつきの注意を使った Pre-LN・Post-LN のブロックは因果的(定義 6.1[自己注意] )である。
定義 2.3 のモデルについて、埋め込み後の行列 X ( 0 ) X^{(0)} X ( 0 ) からロジット Z Z Z への写像は因果的である。したがって位置 i i i のロジット z i \boldsymbol{z}_i z i は t 1 , … , t i t_1, \ldots, t_i t 1 , … , t i だけで決まり、長さ n n n の列を入力したときの z i \boldsymbol{z}_i z i は、接頭辞 ( t 1 , … , t i ) (t_1, \ldots, t_i) ( t 1 , … , t i ) だけを入力したときの最後の位置のロジットに等しい。
証明(命題 7.2) 層正規化と MLP は行ごとに働く写像です(命題 7.1 )。Pre-LN のブロックは X ↦ X + M H A ( L N 1 ( X ) ) X \mapsto X + \mathrm{MHA}(\mathrm{LN}_1(X)) X ↦ X + MHA ( LN 1 ( X )) と Y ↦ Y + M L P ( L N 2 ( Y ) ) Y \mapsto Y + \mathrm{MLP}(\mathrm{LN}_2(Y)) Y ↦ Y + MLP ( LN 2 ( Y )) の合成、Post-LN のブロックは X ↦ L N 1 ( X + M H A ( X ) ) X \mapsto \mathrm{LN}_1(X + \mathrm{MHA}(X)) X ↦ LN 1 ( X + MHA ( X )) と Y ↦ L N 2 ( Y + M L P ( Y ) ) Y \mapsto \mathrm{LN}_2(Y + \mathrm{MLP}(Y)) Y ↦ LN 2 ( Y + MLP ( Y )) の合成で、どちらも、自己注意・行ごとに働く写像・合成・和だけからできています。
マスクのない自己注意は置換同変で、行ごとに働く写像との合成と和で同変性は保たれます(定理 5.2[自己注意] )。
因果マスクつきの自己注意は因果的で、行ごとに働く写像との合成と和で因果性は保たれます(定理 6.3[自己注意] )。
X ( 0 ) ↦ X ( L ) X^{(0)} \mapsto X^{(L)} X ( 0 ) ↦ X ( L ) は因果的なブロック L L L 個の合成、X ( L ) ↦ L N f ( X ( L ) ) E T X^{(L)} \mapsto \mathrm{LN}_f(X^{(L)})E^{\mathsf{T}} X ( L ) ↦ LN f ( X ( L ) ) E T は行ごとに働く写像(第 i i i 行は E L N f ( x i ( L ) ) E\,\mathrm{LN}_f(\boldsymbol{x}^{(L)}_i) E LN f ( x i ( L ) ) )なので、定理 6.3[自己注意] より全体は因果的です。X ( 0 ) X^{(0)} X ( 0 ) の最初の i i i 行は t 1 , … , t i t_1, \ldots, t_i t 1 , … , t i だけで決まり(第 j j j 行は E t j + P j E_{t_j} + P_j E t j + P j )、接頭辞 ( t 1 , … , t i ) (t_1, \ldots, t_i) ( t 1 , … , t i ) の埋め込みは X 1 : i ( 0 ) X^{(0)}_{1:i} X 1 : i ( 0 ) そのものなので、後半の主張は因果的であることの定義と 系 6.4[自己注意] です。
∎
3 のモデルは位置埋め込み P i P_i P i を足しているので、置換同変ではありません。トークンを並べ替えると、同じトークンに違う位置ベクトルが足されるからです。これが、語順を区別できるようにするという位置埋め込みの目的でした。
この節では、MLP が入力空間をどう切り分けるかを見ます。ReLU は負の値を 0 にし、正の値はそのまま通す関数です。MLP の隠れ層の各成分は、入力がある境目より大きいか小さいかで「効いている」か「0 になっている」かが決まります。どの成分が効いているかの組(活性パターン)が同じ領域の中では、MLP 全体が 1 次式になります。これが次の命題の 1 です。2 は、GELU には同じ性質が無いことを確かめます。
命題 8.1 (ReLU の MLP は区分線形 ) ✓
g ( x ) = W 2 T R e L U ( W 1 T x + b 1 ) + b 2 g(\boldsymbol{x}) = W_2^{\mathsf{T}}\,\mathrm{ReLU}(W_1^{\mathsf{T}}\boldsymbol{x} + \boldsymbol{b}_1) + \boldsymbol{b}_2 g ( x ) = W 2 T ReLU ( W 1 T x + b 1 ) + b 2 (x ∈ R d \boldsymbol{x} \in \mathbb{R}^d x ∈ R d 、幅 d f f d_{\mathrm{ff}} d ff )とする。
R d \mathbb{R}^d R d は、高々 2 d f f 2^{d_{\mathrm{ff}}} 2 d ff 個の互いに交わらない凸集合に分かれ、そのそれぞれの上で g g g は 1 次式(アフィン写像)に一致する。
G E L U ( t ) = t Φ ( t ) \mathrm{GELU}(t) = t\,\Phi(t) GELU ( t ) = t Φ ( t ) は R \mathbb{R} R 上で何回でも微分可能で、どの開区間の上でも 1 次式に一致しない。
証明(命題 8.1)
a ( x ) : = W 1 T x + b 1 ∈ R d f f \boldsymbol{a}(\boldsymbol{x}) := W_1^{\mathsf{T}}\boldsymbol{x} + \boldsymbol{b}_1 \in \mathbb{R}^{d_{\mathrm{ff}}} a ( x ) := W 1 T x + b 1 ∈ R d ff と置きます。s ∈ { 0 , 1 } d f f \boldsymbol{s} \in \{0, 1\}^{d_{\mathrm{ff}}} s ∈ { 0 , 1 } d ff (活性パターン )ごとに
R s : = { x ∈ R d : s k = 1 なら a k ( x ) > 0 , s k = 0 なら a k ( x ) ≤ 0 ( k = 1 , … , d f f ) } R_{\boldsymbol{s}} := \big\{\boldsymbol{x} \in \mathbb{R}^d : s_k = 1 \text{ なら } a_k(\boldsymbol{x}) > 0,\ s_k = 0 \text{ なら } a_k(\boldsymbol{x}) \le 0 \quad (k = 1, \ldots, d_{\mathrm{ff}})\big\} R s := { x ∈ R d : s k = 1 なら a k ( x ) > 0 , s k = 0 なら a k ( x ) ≤ 0 ( k = 1 , … , d ff ) } と定めます。各 x \boldsymbol{x} x について、a k ( x ) > 0 a_k(\boldsymbol{x}) > 0 a k ( x ) > 0 かどうかで s \boldsymbol{s} s がちょうど 1 つ決まるので、R s R_{\boldsymbol{s}} R s は互いに交わらず、合わせると R d \mathbb{R}^d R d 全体です。パターンは 2 d f f 2^{d_{\mathrm{ff}}} 2 d ff 通りなので、空でない R s R_{\boldsymbol{s}} R s は高々 2 d f f 2^{d_{\mathrm{ff}}} 2 d ff 個です。a k a_k a k は 1 次式なので、{ a k > 0 } \{a_k > 0\} { a k > 0 } と { a k ≤ 0 } \{a_k \le 0\} { a k ≤ 0 } は半空間で凸、その共通部分 R s R_{\boldsymbol{s}} R s も凸です。
x ∈ R s \boldsymbol{x} \in R_{\boldsymbol{s}} x ∈ R s のとき、R e L U ( a k ( x ) ) = s k a k ( x ) \mathrm{ReLU}(a_k(\boldsymbol{x})) = s_k a_k(\boldsymbol{x}) ReLU ( a k ( x )) = s k a k ( x ) です(s k = 1 s_k = 1 s k = 1 なら a k > 0 a_k > 0 a k > 0 でそのまま、s k = 0 s_k = 0 s k = 0 なら a k ≤ 0 a_k \le 0 a k ≤ 0 で 0)。D s : = d i a g ( s ) D_{\boldsymbol{s}} := \mathrm{diag}(\boldsymbol{s}) D s := diag ( s ) と書けば
g ( x ) = W 2 T D s ( W 1 T x + b 1 ) + b 2 ( x ∈ R s ) g(\boldsymbol{x}) = W_2^{\mathsf{T}} D_{\boldsymbol{s}}\big(W_1^{\mathsf{T}}\boldsymbol{x} + \boldsymbol{b}_1\big) + \boldsymbol{b}_2 \qquad (\boldsymbol{x} \in R_{\boldsymbol{s}}) g ( x ) = W 2 T D s ( W 1 T x + b 1 ) + b 2 ( x ∈ R s ) で、右辺は x \boldsymbol{x} x の 1 次式です。
標準正規分布の密度を φ ( t ) = 1 2 π e − t 2 / 2 \varphi(t) = \frac{1}{\sqrt{2\pi}}e^{-t^2/2} φ ( t ) = 2 π 1 e − t 2 /2 とすると、Φ ( t ) = ∫ − ∞ t φ ( u ) d u \Phi(t) = \int_{-\infty}^{t}\varphi(u)\,du Φ ( t ) = ∫ − ∞ t φ ( u ) d u で、φ \varphi φ は連続なので Φ ′ = φ \Phi' = \varphi Φ ′ = φ です(任意の a < t a < t a < t について Φ ( t ) = Φ ( a ) + ∫ a t φ ( u ) d u \Phi(t) = \Phi(a) + \int_a^t \varphi(u)\,du Φ ( t ) = Φ ( a ) + ∫ a t φ ( u ) d u と書き、有界閉区間の上で 定理 5.2[積分の基本定理と定積分] の (2) を使う)。φ ′ ( t ) = − t φ ( t ) \varphi'(t) = -t\,\varphi(t) φ ′ ( t ) = − t φ ( t ) で、φ \varphi φ は何回でも微分可能なので、Φ \Phi Φ も G E L U \mathrm{GELU} GELU もそうです。微分すると
G E L U ′ ( t ) = Φ ( t ) + t φ ( t ) , G E L U ′ ′ ( t ) = φ ( t ) + φ ( t ) + t φ ′ ( t ) = ( 2 − t 2 ) φ ( t ) \mathrm{GELU}'(t) = \Phi(t) + t\,\varphi(t), \qquad \mathrm{GELU}''(t) = \varphi(t) + \varphi(t) + t\,\varphi'(t) = (2 - t^2)\,\varphi(t) GELU ′ ( t ) = Φ ( t ) + t φ ( t ) , GELU ′′ ( t ) = φ ( t ) + φ ( t ) + t φ ′ ( t ) = ( 2 − t 2 ) φ ( t ) です。φ ( t ) > 0 \varphi(t) > 0 φ ( t ) > 0 なので、G E L U ′ ′ ( t ) = 0 \mathrm{GELU}''(t) = 0 GELU ′′ ( t ) = 0 となるのは t = ± 2 t = \pm\sqrt2 t = ± 2 の 2 点だけです。ある開区間の上で G E L U \mathrm{GELU} GELU が 1 次式に一致すれば、その区間の上で 2 階微分は恒等的に 0 ですが、開区間は無限個の点を含むので矛盾します。
∎
2 d f f 2^{d_{\mathrm{ff}}} 2 d ff は上界で、実際の個数はもっと少なくなります。たとえば入力が 2 次元で幅が 3 のとき、境界は平面上の 3 本の直線で、直線 3 本が平面を分ける領域は多くても 7 個です。9 節の実験でも、8 通りのパターンのうち現れるのは 7 通りでした。それでも幅を増やせば領域は増え、区分線形な関数で複雑な関数を細かく近似できるようになります。
デコーダのみの Transformer の順伝播を NumPy で実装します。自己注意は前章の attention.py の self_attention をそのまま使います。
# Python 3.12.14, NumPy 2.5.2。attention.py は第 3 章のコード
from attention import init_params, self_attention
def layer_norm ( X , gamma , beta , eps= 1e-5 ) :
mu = X. mean ( axis =- 1 , keepdims = True )
var = X. var ( axis =- 1 , keepdims = True ) # 成分の分散(d で割る)
return gamma * (X - mu) / np. sqrt ( var + eps ) + beta
return X * 0.5 * ( 1.0 + np. vectorize ( math.erf )( X / math. sqrt ( 2.0 )))
def init_model ( V , d , L , dff , Lctx , h , rng ) :
model = { " wte " : 0.5 * rng. standard_normal ( (V, d) ), # トークンの埋め込み(出力層と共有)
" wpe " : 0.5 * rng. standard_normal ( (Lctx, d) ), # 学習する位置埋め込み
" blocks " : [] , " lnf " : [ np. ones ( d ), np. zeros ( d ) ] }
" ln1 " : [ np. ones ( d ) , np. zeros ( d ) ] , " attn " : init_params ( d , h , rng ) ,
" ln2 " : [ np. ones ( d ) , np. zeros ( d ) ] ,
" W1 " : rng. standard_normal ( (d, dff) ) / np. sqrt ( d ) , " b1 " : 0.1 * rng. standard_normal ( dff ) ,
" W2 " : rng. standard_normal ( (dff, d) ) / np. sqrt ( dff ) , " b2 " : 0.1 * rng. standard_normal ( d ) } )
def forward ( tokens , model ) :
""" トークン id の列(長さ n)からロジット (n, V) を返す。Pre-LN、因果マスクつき。 """
X = model[ " wte " ] [ tokens ] + model[ " wpe " ] [ :n ]
for b in model[ " blocks " ]:
X = X + self_attention ( layer_norm ( X , * b [ " ln1 " ]) , b [ " attn " ] , causal = True ) [ 0 ]
X = X + gelu ( layer_norm ( X , * b [ " ln2 " ]) @ b [ " W1 " ] + b [ " b1 " ]) @ b[ " W2 " ] + b[ " b2 " ]
return layer_norm ( X , * model [ " lnf " ]) @ model[ " wte " ].T
if isinstance ( obj , np.ndarray ):
return sum ( count ( v ) for v in (obj. values () if isinstance ( obj , dict ) else obj) )
def formula ( V , d , L , dff , Lctx ) :
per_layer = ( 4 * d * d + 4 * d) + ( 2 * d * dff + dff + d) + 4 * d
return V * d + Lctx * d + L * per_layer + 2 * d
if __name__ == " __main__ " :
rng = np.random. default_rng ( 0 )
V, d, L, dff, Lctx, h = 10 , 4 , 2 , 16 , 8 , 2
model = init_model ( V , d , L , dff , Lctx , h , rng )
print ( " count: " , count ( model ) , " formula: " , formula ( V , d , L , dff , Lctx ))
tokens = np. array ( [ 3 , 1 , 4 , 1 , 5 , 9 ] )
logits = forward ( tokens , model )
changed = tokens. copy (); changed[ 4 :] = [ 2 , 6 ] # 5・6 番目のトークンを変える
logits2 = forward ( changed , model )
print ( " logits shape: " , logits.shape )
print ( " rows 1-4 change: %.1e rows 5-6 change: %.1e "
% (np. abs ( logits2 [ : 4 ] - logits [ : 4 ]) . max () , np. abs ( logits2 [ 4 : ] - logits [ 4 : ]) . max () ) )
pre = max ( np. abs ( forward ( tokens [ :t ] , model ) [ - 1 ] - logits [ t - 1 ]) . max () for t in range ( 1 , 7 ))
print ( " prefix consistency: %.1e " % pre )
V, d, L, Lctx = 50257 , 768 , 12 , 1024
per_layer = 12 * d * d + 13 * d
print ( " embeddings: " , V * d , " positions: " , Lctx * d , " per layer: " , per_layer ,
" layers: " , L * per_layer , " final LN: " , 2 * d )
print ( " total: " , formula ( V , d , L , 4 * d , Lctx ))
rows 1-4 change: 0.0e+00 rows 5-6 change: 1.4e+00
prefix consistency: 4.4e-16
embeddings: 38597376 positions: 786432 per layer: 7087872 layers: 85054464 final LN: 1536
1 行目:実装の配列の成分の総数と 定理 5.1 の式が、例 5.2 の 568 で一致します。
3 行目:5・6 番目のトークンを変えても、1〜4 番目の位置のロジットはまったく変わりません(命題 7.2 の 3)。
4 行目:接頭辞だけを入力したときの最後の位置のロジットが、全体を入力したときの対応する位置のロジットに丸め誤差の範囲で一致します。
5・6 行目:例 5.3 の表の値です。この構成は配列を実際には確保せず、式で数えています。
次に、層正規化の命題と、ReLU の活性パターンの個数、6 節の数値を確かめます。
# Python 3.12.14, NumPy 2.5.2。transformer.py は前のコード
from transformer import layer_norm
np. set_printoptions ( precision = 4 , suppress = True )
one, zero = np. ones ( 4 ), np. zeros ( 4 )
x = np. array ( [ 1.0 , 2.0 , 3.0 , 6.0 ] )
y = layer_norm ( x , one , zero , eps = 0.0 )
print ( " LN(x) = " , y , " mean %.1e var %.4f norm %.4f " % (y. mean () , y. var () , np.linalg. norm ( y ) ) )
print ( " LN(3x + 5) = " , layer_norm ( 3 * x + 5 , one , zero , eps = 0.0 ))
d, sigma = len ( x ), x. std ()
y = (x - x. mean ()) / sigma
return (np. eye ( d ) - np. ones ( (d, d) ) / d - np. outer ( y , y ) / d) / sigma
rng = np.random. default_rng ( 0 )
x = rng. standard_normal ( 6 )
one, zero = np. ones ( 6 ), np. zeros ( 6 )
Jnum = np. stack ( [ ( layer_norm ( x + h * e , one , zero , 0.0 ) - layer_norm ( x - h * e , one , zero , 0.0 ) ) / ( 2 * h)
for e in np. eye ( 6 ) ], axis = 1 )
print ( " formula vs finite difference: %.1e " % np. abs ( J - Jnum ) . max ())
print ( " |J 1| = %.1e |J (x - mu)| = %.1e " % (np. abs ( J @ one ) . max () , np. abs ( J @ (x - x. mean () ) ) . max () ) )
print ( " singular values * sigma: " , np.linalg. svd ( J , compute_uv = False ) * x. std ())
print ( " |J(3x) - J(x)/3| = %.1e " % np. abs ( jacobian ( 3 * x ) - J / 3 ) . max ())
# ReLU の MLP の線形領域:入力 2 次元・幅 3 で、活性パターンを数える
W1 = np. array ( [[ 1.0 , 0.0 ] , [ 0.0 , 1.0 ] , [ 1.0 , 1.0 ]] ); b1 = np. array ( [ 0.0 , 0.0 , - 1.0 ] )
g = np. linspace ( - 3 , 3 , 601 )
pts = np. stack ( np. meshgrid ( g , g ) , axis =- 1 ). reshape ( - 1 , 2 )
patterns = { "" . join ( map ( str , row )) for row in (pts @ W1.T + b1 > 0 ). astype ( int )}
print ( " activation patterns: " , len ( patterns ) , " of " , 2 ** 3 , sorted ( patterns ))
print ( " MLP+proj 12nd^2 = %d attention 2n^2d = %d ratio = %.3f n/(6d) = %.3f "
% ( 12 * n * d * d, 2 * n * n * d, 2 * n * n * d / ( 12 * n * d * d), n / ( 6 * d)) )
LN(x) = [-1.069 -0.5345 0. 1.6036] mean 0.0e+00 var 1.0000 norm 2.0000
LN(3x + 5) = [-1.069 -0.5345 0. 1.6036]
formula vs finite difference: 2.2e-10
|J 1| = 4.4e-16 |J (x - mu)| = 2.2e-16
singular values * sigma: [1. 1. 1. 1. 0. 0.]
|J(3x) - J(x)/3| = 1.9e-16
activation patterns: 7 of 8 ['000', '010', '011', '100', '101', '110', '111']
MLP+proj 12nd^2 = 7247757312 attention 2n^2d = 1610612736 ratio = 0.222 n/(6d) = 0.222
最初の 2 行が 例 3.2 、3〜6 行目が 命題 3.3 です。ヤコビ行列の式は中心差分と一致し、1 \boldsymbol{1} 1 と x − μ 1 \boldsymbol{x} - \mu\boldsymbol{1} x − μ 1 を 0 に写します。σ J \sigma J σ J の特異値は 1 が 4 個、0 が 2 個で、d = 6 d = 6 d = 6 次元のうち 2 方向を消す直交射影であることが見えています。7 行目では、3 つの境界 x 1 = 0 x_1 = 0 x 1 = 0 、x 2 = 0 x_2 = 0 x 2 = 0 、x 1 + x 2 = 1 x_1 + x_2 = 1 x 1 + x 2 = 1 に対し、「x 1 ≤ 0 x_1 \le 0 x 1 ≤ 0 かつ x 2 ≤ 0 x_2 \le 0 x 2 ≤ 0 かつ x 1 + x 2 > 1 x_1 + x_2 > 1 x 1 + x 2 > 1 」にあたるパターン 001 だけが現れません。
この章で、トークン id の列からロジットまでの関数が 1 つ定まりました。パラメータは 定理 5.1 の個数だけあり、まだ乱数で初期化しただけです。次章では、このパラメータを「次のトークンの予測」の損失で学習します。そこでは、命題 7.2 の 3 によって 1 本の列から n n n 個の予測の損失が同時に得られることと、命題 6.1 の計算量が、学習の 1 ステップの費用を決めます。第 6 章の生成では、同じ因果性から、すでに計算した位置の結果を使い回せることを示します。
演習 11.2 標準
ε = 0 \varepsilon = 0 ε = 0 とし、γ = g 1 \boldsymbol{\gamma} = g\boldsymbol{1} γ = g 1 (g > 0 g > 0 g > 0 は定数)、β = b 1 \boldsymbol{\beta} = b\boldsymbol{1} β = b 1 の層正規化を考える。出力の成分の平均、分散、ノルムを求めよ。また、γ \boldsymbol{\gamma} γ が一般のベクトルのとき、命題 3.1 の 1 は成り立つか。
解答 y ^ : = ( x − μ 1 ) / σ \hat{\boldsymbol{y}} := (\boldsymbol{x} - \mu\boldsymbol{1})/\sigma y ^ := ( x − μ 1 ) / σ と書くと、出力は g y ^ + b 1 g\hat{\boldsymbol{y}} + b\boldsymbol{1} g y ^ + b 1 です。命題 3.1 の 2 より μ ( y ^ ) = 0 \mu(\hat{\boldsymbol{y}}) = 0 μ ( y ^ ) = 0 、σ 2 ( y ^ ) = 1 \sigma^2(\hat{\boldsymbol{y}}) = 1 σ 2 ( y ^ ) = 1 なので、同じ命題の 1 の証明の計算(a = g a = g a = g )から、平均は g ⋅ 0 + b = b g\cdot0 + b = b g ⋅ 0 + b = b 、分散は g 2 g^2 g 2 です。ノルムの 2 乗は ∑ j ( g y ^ j + b ) 2 = g 2 ∑ j y ^ j 2 + 2 g b ∑ j y ^ j + d b 2 = g 2 d + d b 2 \sum_j (g\hat y_j + b)^2 = g^2\sum_j\hat y_j^2 + 2gb\sum_j\hat y_j + db^2 = g^2d + db^2 ∑ j ( g y ^ j + b ) 2 = g 2 ∑ j y ^ j 2 + 2 g b ∑ j y ^ j + d b 2 = g 2 d + d b 2 なので、ノルムは d ( g 2 + b 2 ) \sqrt{d(g^2 + b^2)} d ( g 2 + b 2 ) です。
1 は一般の γ , β \boldsymbol{\gamma}, \boldsymbol{\beta} γ , β でも成り立ちます。証明で示したのは y ^ \hat{\boldsymbol{y}} y ^ が a x + b ′ 1 a\boldsymbol{x} + b'\boldsymbol{1} a x + b ′ 1 に対しても同じになることで、そのあとに施す γ ⊙ \boldsymbol{\gamma}\odot γ ⊙ と + β +\boldsymbol{\beta} + β は入力に依らない同じ操作だからです。成り立たなくなるのは 2 のほうで、γ \boldsymbol{\gamma} γ が一般のとき出力の平均が 0、分散が 1 とは限りません。
演習 11.3 標準
命題 4.1 の Pre-LN の場合で M = 3 M = 3 M = 3 、l = 0 l = 0 l = 0 とする。∂ x 3 / ∂ x 0 \partial\boldsymbol{x}_3/\partial\boldsymbol{x}_0 ∂ x 3 / ∂ x 0 を展開した 8 個の項をすべて書け。残差接続が無い(x l = G l ( x l − 1 ) \boldsymbol{x}_l = G_l(\boldsymbol{x}_{l-1}) x l = G l ( x l − 1 ) )場合には、このうちどの項だけが残るか。
解答 ( I + J 3 ) ( I + J 2 ) ( I + J 1 ) (I + J_3)(I + J_2)(I + J_1) ( I + J 3 ) ( I + J 2 ) ( I + J 1 ) を展開すると
I + J 1 + J 2 + J 3 + J 2 J 1 + J 3 J 1 + J 3 J 2 + J 3 J 2 J 1 I + J_1 + J_2 + J_3 + J_2J_1 + J_3J_1 + J_3J_2 + J_3J_2J_1 I + J 1 + J 2 + J 3 + J 2 J 1 + J 3 J 1 + J 3 J 2 + J 3 J 2 J 1 の 8 項です(S S S が ∅ \emptyset ∅ 、1 元集合 3 つ、2 元集合 3 つ、全体)。各項は「どの層を通り、どの層を迂回したか」に対応します。残差接続が無い場合のヤコビ行列は連鎖律より J 3 J 2 J 1 J_3J_2J_1 J 3 J 2 J 1 で、すべての層を通る最後の 1 項だけです(この場合の J l J_l J l は G l G_l G l の x l − 1 \boldsymbol{x}_{l-1} x l − 1 でのヤコビ行列で、x l \boldsymbol{x}_l x l の値そのものも残差ありの場合とは違います)。
演習 11.4 易
d f f = 4 d d_{\mathrm{ff}} = 4d d ff = 4 d のブロックで、乗算の回数の主要項 12 n d 2 + 2 n 2 d 12nd^2 + 2n^2d 12 n d 2 + 2 n 2 d について、n n n を 2 倍にしたときの比を n = d n = d n = d 、n = 6 d n = 6d n = 6 d 、n = 60 d n = 60d n = 60 d のそれぞれで求めよ。
解答 T ( n ) = 12 n d 2 + 2 n 2 d T(n) = 12nd^2 + 2n^2d T ( n ) = 12 n d 2 + 2 n 2 d とすると T ( 2 n ) / T ( n ) = ( 24 n d 2 + 8 n 2 d ) / ( 12 n d 2 + 2 n 2 d ) = ( 12 d + 4 n ) / ( 6 d + n ) T(2n)/T(n) = (24nd^2 + 8n^2d)/(12nd^2 + 2n^2d) = (12d + 4n)/(6d + n) T ( 2 n ) / T ( n ) = ( 24 n d 2 + 8 n 2 d ) / ( 12 n d 2 + 2 n 2 d ) = ( 12 d + 4 n ) / ( 6 d + n ) です。
n = d n = d n = d :16 d / 7 d ≈ 2.29 16d/7d \approx 2.29 16 d /7 d ≈ 2.29 。
n = 6 d n = 6d n = 6 d :36 d / 12 d = 3 36d/12d = 3 36 d /12 d = 3 。
n = 60 d n = 60d n = 60 d :252 d / 66 d ≈ 3.82 252d/66d \approx 3.82 252 d /66 d ≈ 3.82 。
列が短いあいだは 2 倍に近く(n n n に比例する項が支配的)、長くなるにつれて 4 倍に近づきます(n 2 n^2 n 2 に比例する項が支配的)。命題 6.1 の n = 6 d n = 6d n = 6 d がちょうどその中間です。
[1] A. Vaswani, N. Shazeer, N. Parmar, J. Uszkoreit, L. Jones, A. N. Gomez, Ł. Kaiser, I. Polosukhin, “Attention Is All You Need”, 2017. arXiv:1706.03762 — 3 節(モデルの構成。3.1 節が残差接続と層正規化の配置、3.3 節が位置ごとの MLP)。
[2] J. L. Ba, J. R. Kiros, G. E. Hinton, “Layer Normalization”, 2016. arXiv:1607.06450 — 層正規化の提案。
[3] K. He, X. Zhang, S. Ren, J. Sun, “Deep Residual Learning for Image Recognition”, 2015. arXiv:1512.03385 — 残差接続の提案。
[4] K. He, X. Zhang, S. Ren, J. Sun, “Identity Mappings in Deep Residual Networks”, ECCV 2016. arXiv:1603.05027 — 残差の経路を恒等写像に保つ配置。
[5] A. Radford, J. Wu, R. Child, D. Luan, D. Amodei, I. Sutskever, “Language Models are Unsupervised Multitask Learners”, OpenAI, 2019 — 2.3 節(層正規化の配置、語彙の大きさ、文脈長)、表 2(4 つの大きさの構成)。
[6] R. Xiong, Y. Yang, D. He, K. Zheng, S. Zheng, C. Xing, H. Zhang, Y. Lan, L. Wang, T.-Y. Liu, “On Layer Normalization in the Transformer Architecture”, ICML 2020. arXiv:2002.04745 — Pre-LN と Post-LN の比較。
[7] D. Hendrycks, K. Gimpel, “Gaussian Error Linear Units (GELUs)”, 2016. arXiv:1606.08415 — GELU の定義。
[8] OpenAI, “gpt-2”([5] のコードと学習済みモデルの公開リポジトリ). https://github.com/openai/gpt-2 — README のパラメータ数についての注記と、src/model.py のモデルの定義。
執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12