文章を機械に読ませるとき、単語に振った番号をそのまま計算に使うことはできません。番号の大小に意味が無いからです。さらに、「犬が猫を追う」と「猫が犬を追う」では、同じ単語が並んでいても意味が逆になります。この章では、番号を計算に使える数の組に置き換える方法と、語順を数の中に書き込む方法を説明します。読み終えると、位置を「足す」やり方と「回す」やり方で何が違うのかを、式で説明できるようになります。
トークン id は名前にすぎないので、モデルに入れる前に d d d 次元のベクトルに置き換えます。これは ∣ V ∣ × d |V| \times d ∣ V ∣ × d の行列 E E E の行を取り出す操作で、one-hot ベクトル(1 か所だけ 1 で残りが 0 のベクトル)を掛けることと同じです(命題 2.2 )。
次章で示すとおり、自己注意(文中の各語が他の語をどれだけ見るかを決める仕組み)は入力の並べ替えを区別できません。語順を伝えるには、位置の情報を外から与える必要があります。この章ではその与え方を 2 通り用意します。
正弦波位置符号化 P E ( p ) \mathrm{PE}(p) PE ( p ) は、位置を k k k ずらすと、p p p に依らない直交行列 M k M_k M k を掛けたものになります(定理 4.2 )。内積 ⟨ P E ( p ) , P E ( q ) ⟩ \langle \mathrm{PE}(p), \mathrm{PE}(q)\rangle ⟨ PE ( p ) , PE ( q )⟩ は p − q p - q p − q だけの関数です(命題 4.3 )。
ただし位置ベクトルを入力に足す 方式では、内容と位置の交差項が残り、内積は相対位置だけの関数になりません(命題 5.1 )。
回転位置埋め込み(RoPE)は、内積を取る直前にクエリとキーを位置に応じて回します 。このとき内積は内容と相対位置 n − m n - m n − m だけで決まり、ノルムは変わりません(定理 6.3 )。
証明はすべて、2 次の回転行列の性質 R ( α ) R ( β ) = R ( α + β ) R(\alpha)R(\beta) = R(\alpha + \beta) R ( α ) R ( β ) = R ( α + β ) 、つまり加法定理に帰着します。
この記事で使う事前知識
内積とノルム : 2 つのベクトルの対応する成分の積の和が内積で、自分自身との内積の平方根が長さ(ノルム)です。→ 内積空間
直交行列 : かけてもベクトルの長さと内積が変わらない行列のこと。回転はその例です。→ 内積空間
三角関数の加法定理 : sin ( x + y ) \sin(x+y) sin ( x + y ) や cos ( x + y ) \cos(x+y) cos ( x + y ) を、x x x と y y y それぞれの sin \sin sin 、cos \cos cos で表す公式です。→ 指数・対数・三角関数
トークンと語彙 : 文字列を区切った単位がトークンで、その全体の集合が語彙です。→ トークン化
前章 で、文字列はトークン id の列 ( t 1 , … , t n ) (t_1, \ldots, t_n) ( t 1 , … , t n ) 、t i ∈ V t_i \in V t i ∈ V になりました。id は整数ですが、その大小や差に意味はありません。id が 300 のトークンと 301 のトークンが似ているわけではないからです。ニューラルネットワークは実数のベクトルに対する関数なので、まず各 id を「学習で調整できるベクトル」に置き換えます。これが埋め込みです。
埋め込みだけでは足りないものがあります。同じトークンは列のどこにあっても同じベクトルになるので、ベクトルの列を見ても、もとの順番は「何番目の行か」という添字にしか残っていません。次章の 定理 5.2[自己注意] は、自己注意がこの添字を使わない(行を並べ替えると出力も同じように並べ替わるだけである)ことを示します。そこで、位置の情報をベクトルの値そのものに書き込む必要があります。
書き込み方は大きく 2 つあります。
方式 どこで位置を入れるか この章での扱い 絶対位置を足す 入力のベクトルに、位置ごとのベクトルを足す(正弦波・学習する表) 4 節・5 節 相対位置を内積に入れる 注意の内積を取る直前に、クエリとキーを位置に応じて回す(RoPE) 6 節
Vaswani らの Transformer は前者の正弦波を使い([1])、Su らは後者の RoPE を提案しました([2])。どちらも三角関数でできているので、同じ道具で性質を証明できます。
この章では、ベクトルは列ベクトル、内積は ⟨ x , y ⟩ = ∑ j x j y j \langle \boldsymbol{x}, \boldsymbol{y} \rangle = \sum_j x_j y_j ⟨ x , y ⟩ = ∑ j x j y j 、ノルムは ∥ x ∥ = ⟨ x , x ⟩ \|\boldsymbol{x}\| = \sqrt{\langle \boldsymbol{x}, \boldsymbol{x}\rangle} ∥ x ∥ = ⟨ x , x ⟩ とします(定義 3.1[内積空間とグラム・シュミット直交化] 、定義 4.1[内積空間とグラム・シュミット直交化] )。
定義 2.1 (one-hot ベクトル・埋め込み行列・重み共有 ) ↗
語彙 V V V の元に 1 , … , ∣ V ∣ 1, \ldots, |V| 1 , … , ∣ V ∣ の番号を付け、トークンをその番号と同一視する。トークン v v v の one-hot ベクトル e v ∈ R ∣ V ∣ \boldsymbol{e}_v \in \mathbb{R}^{|V|} e v ∈ R ∣ V ∣ とは、第 v v v 成分が 1、ほかの成分が 0 のベクトルである。
行列 E ∈ R ∣ V ∣ × d E \in \mathbb{R}^{|V| \times d} E ∈ R ∣ V ∣ × d を埋め込み行列 、d d d を埋め込みの次元 という。E E E の第 v v v 行を列ベクトルとみなしたもの E v ∈ R d E_v \in \mathbb{R}^{d} E v ∈ R d を、トークン v v v の埋め込み という。トークン列 ( t 1 , … , t n ) (t_1, \ldots, t_n) ( t 1 , … , t n ) に対し、第 i i i 行が E t i T E_{t_i}^{\mathsf{T}} E t i T である行列 X ∈ R n × d X \in \mathbb{R}^{n \times d} X ∈ R n × d を、その列の埋め込みという。
モデルの最後で、ベクトル h ∈ R d \boldsymbol{h} \in \mathbb{R}^{d} h ∈ R d から各トークン v v v の点数(ロジット)を z v : = ⟨ h , U v ⟩ z_v := \langle \boldsymbol{h}, U_v \rangle z v := ⟨ h , U v ⟩ (U ∈ R ∣ V ∣ × d U \in \mathbb{R}^{|V| \times d} U ∈ R ∣ V ∣ × d 、U v U_v U v はその第 v v v 行)で作るとき、U = E U = E U = E と取ること、すなわち入力側の埋め込み行列と出力側の行列に同じパラメータを使うことを重み共有 という。
重み共有は Press と Wolf が言語モデルについて調べ([5])、Vaswani らも埋め込みと出力の線形変換で同じ行列を共有しています([1] 3.4 節)。パラメータの数え方に効くので、第 4 章で改めて使います。
命題 2.2 (埋め込みは行の取り出しで、勾配は現れた行だけに入る ) ✓
E ∈ R ∣ V ∣ × d E \in \mathbb{R}^{|V| \times d} E ∈ R ∣ V ∣ × d とする。
任意のトークン v v v について e v T E \boldsymbol{e}_v^{\mathsf{T}} E e v T E は E E E の第 v v v 行である。
トークン列 ( t 1 , … , t n ) (t_1, \ldots, t_n) ( t 1 , … , t n ) の埋め込みを X ∈ R n × d X \in \mathbb{R}^{n\times d} X ∈ R n × d とし、損失が全微分可能な関数 g : R n × d → R g : \mathbb{R}^{n \times d} \to \mathbb{R} g : R n × d → R によって L = g ( X ) \mathcal{L} = g(X) L = g ( X ) と書けるとする(E E E は X X X を通してだけ L \mathcal{L} L に入るとする)。このとき
∂ L ∂ E v j = ∑ i : t i = v ∂ g ∂ X i j ( X ) ( 1 ≤ v ≤ ∣ V ∣ , 1 ≤ j ≤ d ) \frac{\partial \mathcal{L}}{\partial E_{vj}} = \sum_{i \,:\, t_i = v} \frac{\partial g}{\partial X_{ij}}(X) \qquad (1 \le v \le |V|,\ 1 \le j \le d) ∂ E v j ∂ L = i : t i = v ∑ ∂ X ij ∂ g ( X ) ( 1 ≤ v ≤ ∣ V ∣ , 1 ≤ j ≤ d ) が成り立つ。とくに、列に現れないトークン v v v の行については ∂ L / ∂ E v j = 0 \partial \mathcal{L} / \partial E_{vj} = 0 ∂ L / ∂ E v j = 0 である。
証明(命題 2.2)
行列の積の定義より、e v T E \boldsymbol{e}_v^{\mathsf{T}} E e v T E の第 j j j 成分は ∑ u = 1 ∣ V ∣ ( e v ) u E u j \sum_{u=1}^{|V|} (\boldsymbol{e}_v)_u E_{uj} ∑ u = 1 ∣ V ∣ ( e v ) u E u j です。( e v ) u (\boldsymbol{e}_v)_u ( e v ) u は u = v u = v u = v のときだけ 1 で、ほかは 0 なので、和は E v j E_{vj} E v j です。
[ t i = v ] [t_i = v] [ t i = v ] を、t i = v t_i = v t i = v のとき 1、そうでないとき 0 とします。1 より X i j = E t i j = ∑ u [ t i = u ] E u j X_{ij} = E_{t_i j} = \sum_{u} [t_i = u]\, E_{uj} X ij = E t i j = ∑ u [ t i = u ] E u j で、これは E E E の成分の 1 次式なので全微分可能で、∂ X i j ′ / ∂ E v j = [ t i = v ] [ j ′ = j ] \partial X_{ij'} / \partial E_{vj} = [t_i = v]\,[j' = j] ∂ X i j ′ / ∂ E v j = [ t i = v ] [ j ′ = j ] です。連鎖律(定理 3.1[ニューラルネットワークと逆伝播] )を合成 E ↦ X ↦ g ( X ) E \mapsto X \mapsto g(X) E ↦ X ↦ g ( X ) に使うと
∂ L ∂ E v j = ∑ i = 1 n ∑ j ′ = 1 d ∂ g ∂ X i j ′ ( X ) ∂ X i j ′ ∂ E v j = ∑ i = 1 n ∂ g ∂ X i j ( X ) [ t i = v ] \frac{\partial \mathcal{L}}{\partial E_{vj}} = \sum_{i=1}^{n}\sum_{j'=1}^{d} \frac{\partial g}{\partial X_{ij'}}(X)\, \frac{\partial X_{ij'}}{\partial E_{vj}} = \sum_{i=1}^{n} \frac{\partial g}{\partial X_{ij}}(X)\,[t_i = v] ∂ E v j ∂ L = i = 1 ∑ n j ′ = 1 ∑ d ∂ X i j ′ ∂ g ( X ) ∂ E v j ∂ X i j ′ = i = 1 ∑ n ∂ X ij ∂ g ( X ) [ t i = v ] で、これが主張の式です。v v v が列に現れなければ、すべての i i i で [ t i = v ] = 0 [t_i = v] = 0 [ t i = v ] = 0 なので和は 0 です。
∎
1 は、実装で one-hot ベクトルとの積を実際に計算する必要がないことを言っています。∣ V ∣ × d |V| \times d ∣ V ∣ × d の積を計算する代わりに、表の 1 行を読むだけです。2 は、同じトークンが列に複数回現れると、その行の勾配は現れた位置の勾配の和 になること、そして 1 回の更新で動くのは入力に現れた行だけであることを言っています。重み共有をしている場合は、E E E が出力側でも使われるので仮定「E E E は X X X を通してだけ入る」が外れ、出力側からの勾配がすべての行に加わります。
例 2.3 (重み共有のもとでのロジット )
∣ V ∣ = 3 |V| = 3 ∣ V ∣ = 3 、d = 2 d = 2 d = 2 とし、埋め込み行列を
E = ( 1 0 0 1 1 1 ) E = \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{pmatrix} E = 1 0 1 0 1 1 とします。トークン列 ( 3 , 1 ) (3, 1) ( 3 , 1 ) の埋め込みは、E E E の第 3 行と第 1 行を並べた X = ( 1 1 1 0 ) X = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} X = ( 1 1 1 0 ) です。モデルの最後のベクトルが h = ( 2 , 1 ) \boldsymbol{h} = (2, 1) h = ( 2 , 1 ) だったとすると、重み共有のもとでのロジットは z v = ⟨ h , E v ⟩ z_v = \langle \boldsymbol{h}, E_v\rangle z v = ⟨ h , E v ⟩ なので
z = E h = ( 2 , 1 , 3 ) \boldsymbol{z} = E\boldsymbol{h} = (2,\ 1,\ 3) z = E h = ( 2 , 1 , 3 ) で、いちばん大きいのはトークン 3 です。重み共有をすると、「入力でトークン v v v を表すベクトル」と「出力でトークン v v v らしさを測るベクトル」が同じ E v E_v E v になります。最後のベクトル h \boldsymbol{h} h がどのトークンの埋め込みと同じ向きを向いているかで、次のトークンの点数が決まります。パラメータは E E E の ∣ V ∣ d = 6 |V|d = 6 ∣ V ∣ d = 6 個だけで、共有しない場合の 2 ∣ V ∣ d = 12 2|V|d = 12 2∣ V ∣ d = 12 個の半分です。
埋め込みの空間では、内積やコサイン類似度(定義 3.1[数学を学び直す意義] )が「近さ」の尺度になります。次元 d d d が大きいと、互いにほぼ直交する方向を非常にたくさん取れる(系 3.5[数学を学び直す意義] )ので、数万個のトークンに、互いに干渉しにくい方向を割り当てる余地があります。この章の残りでは、内容を表すこのベクトルに、位置をどう組み合わせるかを扱います。
定義 3.1 (2 次の回転行列とブロック対角の回転 ) ↗
実数 α \alpha α に対し
R ( α ) : = ( cos α − sin α sin α cos α ) R(\alpha) := \begin{pmatrix} \cos\alpha & -\sin\alpha \\ \sin\alpha & \cos\alpha \end{pmatrix} R ( α ) := ( cos α sin α − sin α cos α ) を角 α \alpha α の回転行列 という。d d d を正の偶数とし、φ = ( φ 0 , … , φ d / 2 − 1 ) ∈ R d / 2 \boldsymbol{\varphi} = (\varphi_0, \ldots, \varphi_{d/2 - 1}) \in \mathbb{R}^{d/2} φ = ( φ 0 , … , φ d /2 − 1 ) ∈ R d /2 に対して、d d d 次の正方行列
R [ φ ] : = ( R ( φ 0 ) ⋱ R ( φ d / 2 − 1 ) ) R[\boldsymbol{\varphi}] := \begin{pmatrix} R(\varphi_0) & & \\ & \ddots & \\ & & R(\varphi_{d/2-1}) \end{pmatrix} R [ φ ] := R ( φ 0 ) ⋱ R ( φ d /2 − 1 ) (対角に 2 × 2 2 \times 2 2 × 2 のブロックが並び、ほかは 0)をブロック対角の回転 という。
この章では、d d d 次元のベクトルの成分を x 0 , x 1 , … , x d − 1 x_0, x_1, \ldots, x_{d-1} x 0 , x 1 , … , x d − 1 と 0 から数え、( x 2 i , x 2 i + 1 ) (x_{2i}, x_{2i+1}) ( x 2 i , x 2 i + 1 ) を第 i i i の対 と呼びます(i = 0 , … , d / 2 − 1 i = 0, \ldots, d/2 - 1 i = 0 , … , d /2 − 1 )。R [ φ ] x R[\boldsymbol{\varphi}]\boldsymbol{x} R [ φ ] x は、第 i i i の対を平面のベクトルとみなして角 φ i \varphi_i φ i だけ回したものです。
補題 3.2 (回転行列の性質 ) ✓
α , β ∈ R \alpha, \beta \in \mathbb{R} α , β ∈ R 、φ , ψ ∈ R d / 2 \boldsymbol{\varphi}, \boldsymbol{\psi} \in \mathbb{R}^{d/2} φ , ψ ∈ R d /2 、x , y ∈ R d \boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^{d} x , y ∈ R d とする。
R ( α ) R ( β ) = R ( α + β ) R(\alpha) R(\beta) = R(\alpha + \beta) R ( α ) R ( β ) = R ( α + β ) 、R ( 0 ) = I R(0) = I R ( 0 ) = I 、R ( α ) T = R ( − α ) R(\alpha)^{\mathsf{T}} = R(-\alpha) R ( α ) T = R ( − α ) 。
R [ φ ] R [ ψ ] = R [ φ + ψ ] R[\boldsymbol{\varphi}]\, R[\boldsymbol{\psi}] = R[\boldsymbol{\varphi} + \boldsymbol{\psi}] R [ φ ] R [ ψ ] = R [ φ + ψ ] 、R [ 0 ] = I R[\boldsymbol{0}] = I R [ 0 ] = I 、R [ φ ] T = R [ − φ ] R[\boldsymbol{\varphi}]^{\mathsf{T}} = R[-\boldsymbol{\varphi}] R [ φ ] T = R [ − φ ] 。
R [ φ ] T R [ φ ] = I R[\boldsymbol{\varphi}]^{\mathsf{T}} R[\boldsymbol{\varphi}] = I R [ φ ] T R [ φ ] = I (直交行列)。
⟨ R [ φ ] x , y ⟩ = ⟨ x , R [ − φ ] y ⟩ \langle R[\boldsymbol{\varphi}]\boldsymbol{x}, \boldsymbol{y} \rangle = \langle \boldsymbol{x}, R[-\boldsymbol{\varphi}]\boldsymbol{y} \rangle ⟨ R [ φ ] x , y ⟩ = ⟨ x , R [ − φ ] y ⟩ 、⟨ R [ φ ] x , R [ φ ] y ⟩ = ⟨ x , y ⟩ \langle R[\boldsymbol{\varphi}]\boldsymbol{x}, R[\boldsymbol{\varphi}]\boldsymbol{y} \rangle = \langle \boldsymbol{x}, \boldsymbol{y} \rangle ⟨ R [ φ ] x , R [ φ ] y ⟩ = ⟨ x , y ⟩ 、∥ R [ φ ] x ∥ = ∥ x ∥ \|R[\boldsymbol{\varphi}]\boldsymbol{x}\| = \|\boldsymbol{x}\| ∥ R [ φ ] x ∥ = ∥ x ∥ 。
証明(補題 3.2)
積を計算します。
R ( α ) R ( β ) = ( cos α cos β − sin α sin β − ( cos α sin β + sin α cos β ) sin α cos β + cos α sin β cos α cos β − sin α sin β ) R(\alpha)R(\beta) = \begin{pmatrix} \cos\alpha\cos\beta - \sin\alpha\sin\beta & -(\cos\alpha\sin\beta + \sin\alpha\cos\beta) \\ \sin\alpha\cos\beta + \cos\alpha\sin\beta & \cos\alpha\cos\beta - \sin\alpha\sin\beta \end{pmatrix} R ( α ) R ( β ) = ( cos α cos β − sin α sin β sin α cos β + cos α sin β − ( cos α sin β + sin α cos β ) cos α cos β − sin α sin β ) 加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する] )より、対角の成分は cos ( α + β ) \cos(\alpha+\beta) cos ( α + β ) 、左下は sin ( α + β ) \sin(\alpha + \beta) sin ( α + β ) 、右上は − sin ( α + β ) -\sin(\alpha+\beta) − sin ( α + β ) なので、R ( α + β ) R(\alpha+\beta) R ( α + β ) に等しくなります。cos 0 = 1 \cos 0 = 1 cos 0 = 1 、sin 0 = 0 \sin 0 = 0 sin 0 = 0 より R ( 0 ) = I R(0) = I R ( 0 ) = I 。cos ( − α ) = cos α \cos(-\alpha) = \cos\alpha cos ( − α ) = cos α 、sin ( − α ) = − sin α \sin(-\alpha) = -\sin\alpha sin ( − α ) = − sin α (定理 6.2[指数・対数・三角関数をきちんと定義する] の 2)より、R ( − α ) R(-\alpha) R ( − α ) は R ( α ) R(\alpha) R ( α ) の非対角成分の符号を入れ替えたもの、すなわち R ( α ) T R(\alpha)^{\mathsf{T}} R ( α ) T です。
ブロック対角行列どうしの積は、対応するブロックの積を対角に並べたものです。実際、A , B A, B A , B がブロック対角のとき、( A B ) j l = ∑ k A j k B k l (AB)_{jl} = \sum_{k} A_{jk}B_{kl} ( A B ) j l = ∑ k A j k B k l で A j k ≠ 0 A_{jk} \ne 0 A j k = 0 となりうるのは k k k が j j j と同じ対にあるときだけ、B k l ≠ 0 B_{kl} \ne 0 B k l = 0 となりうるのは l l l が k k k と同じ対にあるときだけなので、j , l j, l j , l が違う対にあれば 0、同じ対にあればその対のブロックの積の成分です。転置も対ごとに取れます。よって 1 を各ブロックに使えば 2 が出ます。
2 より R [ φ ] T R [ φ ] = R [ − φ ] R [ φ ] = R [ 0 ] = I R[\boldsymbol{\varphi}]^{\mathsf{T}} R[\boldsymbol{\varphi}] = R[-\boldsymbol{\varphi}]R[\boldsymbol{\varphi}] = R[\boldsymbol{0}] = I R [ φ ] T R [ φ ] = R [ − φ ] R [ φ ] = R [ 0 ] = I 。
任意の正方行列 A A A について ⟨ A x , y ⟩ = ∑ j ∑ k A j k x k y j = ∑ k x k ∑ j ( A T ) k j y j = ⟨ x , A T y ⟩ \langle A\boldsymbol{x}, \boldsymbol{y}\rangle = \sum_{j}\sum_{k} A_{jk}x_k y_j = \sum_k x_k \sum_j (A^{\mathsf{T}})_{kj} y_j = \langle \boldsymbol{x}, A^{\mathsf{T}}\boldsymbol{y}\rangle ⟨ A x , y ⟩ = ∑ j ∑ k A j k x k y j = ∑ k x k ∑ j ( A T ) k j y j = ⟨ x , A T y ⟩ です。A = R [ φ ] A = R[\boldsymbol{\varphi}] A = R [ φ ] とし 2 を使うと 1 つ目の式が出ます。2 つ目は、1 つ目で y \boldsymbol{y} y を R [ φ ] y R[\boldsymbol{\varphi}]\boldsymbol{y} R [ φ ] y に置き換えて ⟨ R [ φ ] x , R [ φ ] y ⟩ = ⟨ x , R [ − φ ] R [ φ ] y ⟩ = ⟨ x , y ⟩ \langle R[\boldsymbol{\varphi}]\boldsymbol{x}, R[\boldsymbol{\varphi}]\boldsymbol{y}\rangle = \langle \boldsymbol{x}, R[-\boldsymbol{\varphi}]R[\boldsymbol{\varphi}]\boldsymbol{y}\rangle = \langle \boldsymbol{x}, \boldsymbol{y}\rangle ⟨ R [ φ ] x , R [ φ ] y ⟩ = ⟨ x , R [ − φ ] R [ φ ] y ⟩ = ⟨ x , y ⟩ 。3 つ目は 2 つ目で y = x \boldsymbol{y} = \boldsymbol{x} y = x として平方根を取ります。
∎
4 の「内積とノルムを保つ」は、直交行列(実のユニタリ行列)の一般的な性質です(命題 3.2[スペクトル定理] の条件 1 から 2・3)。2 次の直交行列で行列式が 1 のものは回転行列に限ること(補題 2.3[合同と相似] )も知られていますが、以下で使うのは上の補題だけです。
定義 4.1 (絶対位置・相対位置・位置符号化 ) ↗
列の中でのトークンの番号 p p p を絶対位置 、2 つのトークンの絶対位置 m , n m, n m , n の差 n − m n - m n − m を相対位置 という。d d d を正の偶数とし、i = 0 , … , d / 2 − 1 i = 0, \ldots, d/2 - 1 i = 0 , … , d /2 − 1 について角周波数 を
ω i : = 10000 − 2 i / d \omega_i := 10000^{-2i/d} ω i := 1000 0 − 2 i / d と置く。実数 p p p に対し、成分が
P E ( p ) 2 i : = sin ( p ω i ) , P E ( p ) 2 i + 1 : = cos ( p ω i ) ( i = 0 , … , d / 2 − 1 ) \mathrm{PE}(p)_{2i} := \sin(p\,\omega_i), \qquad \mathrm{PE}(p)_{2i+1} := \cos(p\,\omega_i) \qquad (i = 0, \ldots, d/2-1) PE ( p ) 2 i := sin ( p ω i ) , PE ( p ) 2 i + 1 := cos ( p ω i ) ( i = 0 , … , d /2 − 1 ) であるベクトル P E ( p ) ∈ R d \mathrm{PE}(p) \in \mathbb{R}^{d} PE ( p ) ∈ R d を正弦波位置符号化 という。位置 p p p のトークンの埋め込み x \boldsymbol{x} x を x + P E ( p ) \boldsymbol{x} + \mathrm{PE}(p) x + PE ( p ) に置き換えてモデルに入れる。
これに対し、行列 P ∈ R L c t x × d P \in \mathbb{R}^{L_{\mathrm{ctx}} \times d} P ∈ R L ctx × d をパラメータとして持ち、位置 p ∈ { 1 , … , L c t x } p \in \{1, \ldots, L_{\mathrm{ctx}}\} p ∈ { 1 , … , L ctx } のトークンの埋め込み x \boldsymbol{x} x を x + P p \boldsymbol{x} + P_p x + P p (P p P_p P p は P P P の第 p p p 行)に置き換える方式を、学習する位置埋め込み という。
ω 0 = 1 \omega_0 = 1 ω 0 = 1 が最大で、ω d / 2 − 1 = 10000 − ( d − 2 ) / d \omega_{d/2-1} = 10000^{-(d-2)/d} ω d /2 − 1 = 1000 0 − ( d − 2 ) / d が最小です。つまり ω i \omega_i ω i は 1 から 1 / 10000 1/10000 1/10000 に近い値まで、桁を揃えて並んだ値で、1 周する速さの違う時計の針を d / 2 d/2 d /2 本用意することに当たります(10000 という値そのものは設計上の選択です)。第 i i i の対 ( sin p ω i , cos p ω i ) (\sin p\omega_i, \cos p\omega_i) ( sin p ω i , cos p ω i ) は、p p p が進むにつれて単位円の上を角速度 ω i \omega_i ω i で回ります。速く回る対は近くの位置の違いを、ゆっくり回る対は遠くの位置の違いを表します。時計の秒針・分針・時針に似た仕組みです。
定理 4.2 (位置のずれは直交行列で表せる ) ✓
任意の実数 k k k に対し、d d d 次の直交行列
M k : = R [ ( − k ω 0 , … , − k ω d / 2 − 1 ) ] M_k := R[(-k\omega_0, \ldots, -k\omega_{d/2-1})] M k := R [( − k ω 0 , … , − k ω d /2 − 1 )] は p p p に依らず、すべての実数 p p p について
P E ( p + k ) = M k P E ( p ) \mathrm{PE}(p + k) = M_k\, \mathrm{PE}(p) PE ( p + k ) = M k PE ( p ) を満たす。
証明(定理 4.2) M k M_k M k の定義に p p p は現れません。直交行列であることは 補題 3.2 の 3 です。
等式を対ごとに確かめます。M k M_k M k の第 i i i のブロックは
R ( − k ω i ) = ( cos k ω i sin k ω i − sin k ω i cos k ω i ) R(-k\omega_i) = \begin{pmatrix} \cos k\omega_i & \sin k\omega_i \\ -\sin k\omega_i & \cos k\omega_i \end{pmatrix} R ( − k ω i ) = ( cos k ω i − sin k ω i sin k ω i cos k ω i ) です(cos ( − t ) = cos t \cos(-t) = \cos t cos ( − t ) = cos t 、sin ( − t ) = − sin t \sin(-t) = -\sin t sin ( − t ) = − sin t を使いました)。これを P E ( p ) \mathrm{PE}(p) PE ( p ) の第 i i i の対 ( sin p ω i , cos p ω i ) T (\sin p\omega_i, \cos p\omega_i)^{\mathsf{T}} ( sin p ω i , cos p ω i ) T に掛けると
( cos k ω i sin p ω i + sin k ω i cos p ω i − sin k ω i sin p ω i + cos k ω i cos p ω i ) = ( sin ( ( p + k ) ω i ) cos ( ( p + k ) ω i ) ) \begin{pmatrix} \cos k\omega_i \sin p\omega_i + \sin k\omega_i \cos p\omega_i \\ -\sin k\omega_i \sin p\omega_i + \cos k\omega_i \cos p\omega_i \end{pmatrix}
= \begin{pmatrix} \sin\big((p+k)\omega_i\big) \\ \cos\big((p+k)\omega_i\big) \end{pmatrix} ( cos k ω i sin p ω i + sin k ω i cos p ω i − sin k ω i sin p ω i + cos k ω i cos p ω i ) = ( sin ( ( p + k ) ω i ) cos ( ( p + k ) ω i ) ) となります。等号は加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する] )を x = p ω i x = p\omega_i x = p ω i 、y = k ω i y = k\omega_i y = k ω i に使ったものです。右辺は P E ( p + k ) \mathrm{PE}(p+k) PE ( p + k ) の第 i i i の対です。M k M_k M k はブロック対角なので、対ごとの等式から全体の等式が従います。
∎
Vaswani らは正弦波を選んだ理由として、固定したずれ k k k について P E ( p + k ) \mathrm{PE}(p+k) PE ( p + k ) が P E ( p ) \mathrm{PE}(p) PE ( p ) の線形な関数で表せることを挙げています([1] 3.5 節)。上の定理はその線形写像を具体的に書き、それが回転(直交行列)であることまで示したものです。
命題 4.3 (正弦波位置符号化の内積とノルム ) ✓
任意の実数 p , q p, q p , q について
⟨ P E ( p ) , P E ( q ) ⟩ = ∑ i = 0 d / 2 − 1 cos ( ω i ( p − q ) ) , ∥ P E ( p ) ∥ 2 = d 2 \langle \mathrm{PE}(p), \mathrm{PE}(q) \rangle = \sum_{i=0}^{d/2-1} \cos\big(\omega_i (p - q)\big), \qquad \|\mathrm{PE}(p)\|^2 = \frac{d}{2} ⟨ PE ( p ) , PE ( q )⟩ = i = 0 ∑ d /2 − 1 cos ( ω i ( p − q ) ) , ∥ PE ( p ) ∥ 2 = 2 d が成り立つ。とくに内積は相対位置 p − q p - q p − q だけの関数である。
証明(命題 4.3) 内積を対ごとに計算します。
⟨ P E ( p ) , P E ( q ) ⟩ = ∑ i = 0 d / 2 − 1 ( sin p ω i sin q ω i + cos p ω i cos q ω i ) \langle \mathrm{PE}(p), \mathrm{PE}(q) \rangle = \sum_{i=0}^{d/2-1} \big( \sin p\omega_i \sin q\omega_i + \cos p\omega_i \cos q\omega_i \big) ⟨ PE ( p ) , PE ( q )⟩ = i = 0 ∑ d /2 − 1 ( sin p ω i sin q ω i + cos p ω i cos q ω i ) 加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する] )で x = p ω i x = p\omega_i x = p ω i 、y = − q ω i y = -q\omega_i y = − q ω i と置き、cos ( − y ) = cos y \cos(-y) = \cos y cos ( − y ) = cos y 、sin ( − y ) = − sin y \sin(-y) = -\sin y sin ( − y ) = − sin y を使うと cos ( p ω i − q ω i ) = cos p ω i cos q ω i + sin p ω i sin q ω i \cos(p\omega_i - q\omega_i) = \cos p\omega_i \cos q\omega_i + \sin p\omega_i \sin q\omega_i cos ( p ω i − q ω i ) = cos p ω i cos q ω i + sin p ω i sin q ω i です。よって各項は cos ( ω i ( p − q ) ) \cos(\omega_i(p - q)) cos ( ω i ( p − q )) です。q = p q = p q = p とすると各項は cos 0 = 1 \cos 0 = 1 cos 0 = 1 で、d / 2 d/2 d /2 項あるので ∥ P E ( p ) ∥ 2 = d / 2 \|\mathrm{PE}(p)\|^2 = d/2 ∥ PE ( p ) ∥ 2 = d /2 です。
∎
命題 4.4 (範囲つきの単射性 ) ✓
ω min : = ω d / 2 − 1 = 10000 − ( d − 2 ) / d \omega_{\min} := \omega_{d/2-1} = 10000^{-(d-2)/d} ω m i n := ω d /2 − 1 = 1000 0 − ( d − 2 ) / d とする。区間 0 ≤ p < 2 π / ω min 0 \le p < 2\pi/\omega_{\min} 0 ≤ p < 2 π / ω m i n の上で、写像 p ↦ P E ( p ) p \mapsto \mathrm{PE}(p) p ↦ PE ( p ) は単射である。
証明(命題 4.4) 0 ≤ p , q < 2 π / ω min 0 \le p, q < 2\pi/\omega_{\min} 0 ≤ p , q < 2 π / ω m i n で P E ( p ) = P E ( q ) \mathrm{PE}(p) = \mathrm{PE}(q) PE ( p ) = PE ( q ) とします。最後の対を比べると ( cos p ω min , sin p ω min ) = ( cos q ω min , sin q ω min ) (\cos p\omega_{\min}, \sin p\omega_{\min}) = (\cos q\omega_{\min}, \sin q\omega_{\min}) ( cos p ω m i n , sin p ω m i n ) = ( cos q ω m i n , sin q ω m i n ) です。p ω min p\omega_{\min} p ω m i n と q ω min q\omega_{\min} q ω m i n はどちらも [ 0 , 2 π ) [0, 2\pi) [ 0 , 2 π ) にあり、θ ↦ ( cos θ , sin θ ) \theta \mapsto (\cos\theta, \sin\theta) θ ↦ ( cos θ , sin θ ) は [ 0 , 2 π ) [0, 2\pi) [ 0 , 2 π ) の上で単射(定理 7.4[指数・対数・三角関数をきちんと定義する] )なので、p ω min = q ω min p\omega_{\min} = q\omega_{\min} p ω m i n = q ω m i n 、ω min > 0 \omega_{\min} > 0 ω m i n > 0 より p = q p = q p = q です。
∎
区間の長さは 2 π ⋅ 10000 ( d − 2 ) / d 2\pi \cdot 10000^{(d-2)/d} 2 π ⋅ 1000 0 ( d − 2 ) / d です。d = 4 d = 4 d = 4 なら 2 π ⋅ 100 ≈ 628 2\pi \cdot 100 \approx 628 2 π ⋅ 100 ≈ 628 、Vaswani らの基本の構成 d = 512 d = 512 d = 512 ([1])なら約 6.06 × 10 4 6.06 \times 10^{4} 6.06 × 1 0 4 で、整数の位置がこの個数だけ区別できます。証明に使ったのはいちばん遅い対だけです。この範囲を超えると最後の対は 1 周して戻りますが、ほかの対も合わせて見れば区別できる位置はもっと多くなります。ただし「すべての整数の位置で単射である」という主張には π \pi π が無理数であることが要るので、ここでは範囲つきの形だけを述べました。
例 4.5 (d = 4 の数値例 )
d = 4 d = 4 d = 4 のとき ω 0 = 1 \omega_0 = 1 ω 0 = 1 、ω 1 = 10000 − 1 / 2 = 0.01 \omega_1 = 10000^{-1/2} = 0.01 ω 1 = 1000 0 − 1/2 = 0.01 です。
P E ( 0 ) = ( 0 , 1 , 0 , 1 ) , P E ( 1 ) = ( 0.8415 , 0.5403 , 0.0100 , 1.0000 ) , P E ( 2 ) = ( 0.9093 , − 0.4161 , 0.0200 , 0.9998 ) \mathrm{PE}(0) = (0,\ 1,\ 0,\ 1), \quad
\mathrm{PE}(1) = (0.8415,\ 0.5403,\ 0.0100,\ 1.0000), \quad
\mathrm{PE}(2) = (0.9093,\ -0.4161,\ 0.0200,\ 0.9998) PE ( 0 ) = ( 0 , 1 , 0 , 1 ) , PE ( 1 ) = ( 0.8415 , 0.5403 , 0.0100 , 1.0000 ) , PE ( 2 ) = ( 0.9093 , − 0.4161 , 0.0200 , 0.9998 ) (sin 1 = 0.8415 \sin 1 = 0.8415 sin 1 = 0.8415 、cos 1 = 0.5403 \cos 1 = 0.5403 cos 1 = 0.5403 、sin 0.01 = 0.0100 \sin 0.01 = 0.0100 sin 0.01 = 0.0100 、cos 0.01 = 0.99995 \cos 0.01 = 0.99995 cos 0.01 = 0.99995 )。ずらす行列は
M 1 = ( 0.5403 0.8415 − 0.8415 0.5403 0.99995 0.0100 − 0.0100 0.99995 ) M_1 = \begin{pmatrix} 0.5403 & 0.8415 & & \\ -0.8415 & 0.5403 & & \\ & & 0.99995 & 0.0100 \\ & & -0.0100 & 0.99995 \end{pmatrix} M 1 = 0.5403 − 0.8415 0.8415 0.5403 0.99995 − 0.0100 0.0100 0.99995 で、M 1 P E ( 1 ) M_1 \mathrm{PE}(1) M 1 PE ( 1 ) の最初の 2 成分は 0.5403 × 0.8415 + 0.8415 × 0.5403 = 0.9093 0.5403 \times 0.8415 + 0.8415 \times 0.5403 = 0.9093 0.5403 × 0.8415 + 0.8415 × 0.5403 = 0.9093 、− 0.8415 × 0.8415 + 0.5403 × 0.5403 = − 0.4161 -0.8415 \times 0.8415 + 0.5403 \times 0.5403 = -0.4161 − 0.8415 × 0.8415 + 0.5403 × 0.5403 = − 0.4161 となり、P E ( 2 ) \mathrm{PE}(2) PE ( 2 ) に一致します。内積は 命題 4.3 より ⟨ P E ( p ) , P E ( p + 1 ) ⟩ = cos 1 + cos 0.01 = 1.5403 \langle \mathrm{PE}(p), \mathrm{PE}(p+1)\rangle = \cos 1 + \cos 0.01 = 1.5403 ⟨ PE ( p ) , PE ( p + 1 )⟩ = cos 1 + cos 0.01 = 1.5403 、⟨ P E ( p ) , P E ( p + 2 ) ⟩ = cos 2 + cos 0.02 = 0.5837 \langle \mathrm{PE}(p), \mathrm{PE}(p+2)\rangle = \cos 2 + \cos 0.02 = 0.5837 ⟨ PE ( p ) , PE ( p + 2 )⟩ = cos 2 + cos 0.02 = 0.5837 で、p p p に依りません。ノルムの 2 乗は常に d / 2 = 2 d/2 = 2 d /2 = 2 です。
命題 4.6 (学習する位置埋め込みのパラメータ数と定義域 ) ✓
長さ L c t x L_{\mathrm{ctx}} L ctx の学習する位置埋め込みは L c t x d L_{\mathrm{ctx}}\, d L ctx d 個のパラメータを持ち、位置 p > L c t x p > L_{\mathrm{ctx}} p > L ctx に対しては位置ベクトルが定義されない。したがってこの方式のモデルは、長さが L c t x L_{\mathrm{ctx}} L ctx を超える列を入力に取れない。一方、正弦波位置符号化 P E ( p ) \mathrm{PE}(p) PE ( p ) と、6 節の回転 R m R_m R m は、パラメータを持たず、すべての実数(とくにすべての整数の位置)に対して定義される。
証明(命題 4.6) 定義 4.1 より、学習する位置埋め込みのパラメータは行列 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 です。位置 p p p のベクトルは P P P の第 p p p 行で、P P P には第 L c t x L_{\mathrm{ctx}} L ctx 行までしか無いので、p > L c t x p > L_{\mathrm{ctx}} p > L ctx では定義されません。入力の第 p p p トークンに足すベクトルが無ければ、モデルへの入力が定まりません。P E ( p ) \mathrm{PE}(p) PE ( p ) は sin \sin sin と cos \cos cos の値で、6 節の R m R_m R m も cos \cos cos と sin \sin sin の値を成分とする行列で、どちらも任意の実数に対して定義されており、学習するパラメータを含みません。
∎
次章の注意は、2 つの位置のベクトルの内積(に線形変換を挟んだもの)で「どの位置をどれだけ見るか」を決めます。言語では「3 つ前の語」のような相対位置が意味を持つことが多いので、この内積が相対位置で決まると都合がよいのですが、位置ベクトルを足す方式ではそうなりません。
命題 5.1 (足す方式の内積の 4 項分解 ) ✓
位置 m , n m, n m , n のトークンの埋め込みを x m , x n ∈ R d \boldsymbol{x}_m, \boldsymbol{x}_n \in \mathbb{R}^{d} x m , x n ∈ R d 、位置ベクトルを p m , p n ∈ R d \boldsymbol{p}_m, \boldsymbol{p}_n \in \mathbb{R}^{d} p m , p n ∈ R d とする。
⟨ x m + p m , x n + p n ⟩ = ⟨ x m , x n ⟩ + ⟨ x m , p n ⟩ + ⟨ p m , x n ⟩ + ⟨ p m , p n ⟩ \langle \boldsymbol{x}_m + \boldsymbol{p}_m,\ \boldsymbol{x}_n + \boldsymbol{p}_n \rangle = \langle \boldsymbol{x}_m, \boldsymbol{x}_n \rangle + \langle \boldsymbol{x}_m, \boldsymbol{p}_n \rangle + \langle \boldsymbol{p}_m, \boldsymbol{x}_n \rangle + \langle \boldsymbol{p}_m, \boldsymbol{p}_n \rangle ⟨ x m + p m , x n + p n ⟩ = ⟨ x m , x n ⟩ + ⟨ x m , p n ⟩ + ⟨ p m , x n ⟩ + ⟨ p m , p n ⟩ 。
p m = P E ( m ) \boldsymbol{p}_m = \mathrm{PE}(m) p m = PE ( m ) のとき、第 4 項は n − m n - m n − m だけの関数だが、全体はそうではない。すなわち、内容 x m = x n = x \boldsymbol{x}_m = \boldsymbol{x}_n = \boldsymbol{x} x m = x n = x を固定しても、相対位置が同じ 2 組 ( m , n ) (m, n) ( m , n ) 、( m ′ , n ′ ) (m', n') ( m ′ , n ′ ) で値が異なる例がある。
証明(命題 5.1) 1 は内積の双線形性(定義 3.1[内積空間とグラム・シュミット直交化] )による展開です。
2 の前半は 命題 4.3 です。後半の例を作ります。d = 2 d = 2 d = 2 とすると ω 0 = 1 \omega_0 = 1 ω 0 = 1 で P E ( p ) = ( sin p , cos p ) \mathrm{PE}(p) = (\sin p, \cos p) PE ( p ) = ( sin p , cos p ) です。x = ( 1 , 0 ) \boldsymbol{x} = (1, 0) x = ( 1 , 0 ) と置くと、⟨ x , x ⟩ = 1 \langle \boldsymbol{x}, \boldsymbol{x}\rangle = 1 ⟨ x , x ⟩ = 1 、⟨ x , P E ( p ) ⟩ = sin p \langle \boldsymbol{x}, \mathrm{PE}(p) \rangle = \sin p ⟨ x , PE ( p )⟩ = sin p 、⟨ P E ( m ) , P E ( n ) ⟩ = cos ( m − n ) \langle \mathrm{PE}(m), \mathrm{PE}(n)\rangle = \cos(m - n) ⟨ PE ( m ) , PE ( n )⟩ = cos ( m − n ) なので、1 より
⟨ x + P E ( m ) , x + P E ( n ) ⟩ = 1 + sin n + sin m + cos ( m − n ) \langle \boldsymbol{x} + \mathrm{PE}(m),\ \boldsymbol{x} + \mathrm{PE}(n) \rangle = 1 + \sin n + \sin m + \cos(m - n) ⟨ x + PE ( m ) , x + PE ( n )⟩ = 1 + sin n + sin m + cos ( m − n ) です。( m , n ) = ( 0 , 1 ) (m, n) = (0, 1) ( m , n ) = ( 0 , 1 ) では 1 + sin 1 + 0 + cos 1 1 + \sin 1 + 0 + \cos 1 1 + sin 1 + 0 + cos 1 、( m , n ) = ( 1 , 2 ) (m, n) = (1, 2) ( m , n ) = ( 1 , 2 ) では 1 + sin 2 + sin 1 + cos 1 1 + \sin 2 + \sin 1 + \cos 1 1 + sin 2 + sin 1 + cos 1 で、どちらも相対位置は 1 ですが、差は sin 2 \sin 2 sin 2 です。
sin 2 ≠ 0 \sin 2 \ne 0 sin 2 = 0 を確かめます。3.14 < π < 3.15 3.14 < \pi < 3.15 3.14 < π < 3.15 (定理 10.4[指数・対数・三角関数をきちんと定義する] )より π / 2 < 2 < π \pi/2 < 2 < \pi π /2 < 2 < π です。[ π / 2 , π ] [\pi/2, \pi] [ π /2 , π ] では sin x = cos ( x − π / 2 ) \sin x = \cos(x - \pi/2) sin x = cos ( x − π /2 ) で、x = 2 x = 2 x = 2 のとき x − π / 2 ∈ [ 0 , π / 2 ) x - \pi/2 \in [0, \pi/2) x − π /2 ∈ [ 0 , π /2 ) 、そこでは cos > 0 \cos > 0 cos > 0 です(定理 7.3[指数・対数・三角関数をきちんと定義する] の 3)。よって sin 2 > 0 \sin 2 > 0 sin 2 > 0 で、2 組の値は異なります。数値では 2.3818 2.3818 2.3818 と 3.2911 3.2911 3.2911 です。
∎
交差項 ⟨ x m , p n ⟩ \langle \boldsymbol{x}_m, \boldsymbol{p}_n\rangle ⟨ x m , p n ⟩ は「内容と絶対位置の相性」を表す項で、これが残るかぎり、同じ 2 語が同じ間隔で並んでいても、列のどこにあるかで点数が変わります。実際の注意では内積の間に学習する行列が挟まりますが(次章)、双線形な式を 4 項に展開できることは同じです。Shaw らは、絶対位置を足す代わりに、相対位置ごとの表現を注意の計算の中に入れる方法を提案しました([4])。次節の RoPE は、同じ狙いを回転だけで実現します。
定義 6.1 (回転位置埋め込み ) ↗
d d d を正の偶数とし、θ i : = 10000 − 2 i / d \theta_i := 10000^{-2i/d} θ i := 1000 0 − 2 i / d (i = 0 , … , d / 2 − 1 i = 0, \ldots, d/2-1 i = 0 , … , d /2 − 1 )、θ : = ( θ 0 , … , θ d / 2 − 1 ) \boldsymbol{\theta} := (\theta_0, \ldots, \theta_{d/2-1}) θ := ( θ 0 , … , θ d /2 − 1 ) と置く。実数 m m m に対し
R m : = R [ m θ ] = R [ ( m θ 0 , … , m θ d / 2 − 1 ) ] R_m := R[m\boldsymbol{\theta}] = R[(m\theta_0, \ldots, m\theta_{d/2-1})] R m := R [ m θ ] = R [( m θ 0 , … , m θ d /2 − 1 )] と定める。位置 m m m のクエリ q ∈ R d \boldsymbol{q} \in \mathbb{R}^{d} q ∈ R d と位置 n n n のキー k ∈ R d \boldsymbol{k} \in \mathbb{R}^{d} k ∈ R d の内積 ⟨ q , k ⟩ \langle \boldsymbol{q}, \boldsymbol{k}\rangle ⟨ q , k ⟩ の代わりに
⟨ R m q , R n k ⟩ \langle R_m \boldsymbol{q},\ R_n \boldsymbol{k} \rangle ⟨ R m q , R n k ⟩ を使う方式を回転位置埋め込み (RoPE)という。
クエリとキーは次章で定義します(直感的には、クエリは「いま注目している語が探しているもの」、キーは「各語が持っている目印」で、2 つの内積が大きいほど強く結びつくと考えます)。ここでは「位置 m m m にあるベクトル q \boldsymbol{q} q と位置 n n n にあるベクトル k \boldsymbol{k} k の相性を内積で測る」とだけ理解しておけば十分です。足す方式との違いは、位置の情報を入力に 1 回足すのではなく、内積を取るたびにその直前で掛けることです。
命題 6.2 (位置の回転の合成 ) ✓
任意の実数 m , n m, n m , n について、R m R_m R m は直交行列で、
R m R n = R m + n , R 0 = I , R m T = R − m = R m − 1 R_m R_n = R_{m+n}, \qquad R_0 = I, \qquad R_m^{\mathsf{T}} = R_{-m} = R_m^{-1} R m R n = R m + n , R 0 = I , R m T = R − m = R m − 1 が成り立つ。
証明(命題 6.2) 補題 3.2 の 2 と 3 を φ = m θ \boldsymbol{\varphi} = m\boldsymbol{\theta} φ = m θ 、ψ = n θ \boldsymbol{\psi} = n\boldsymbol{\theta} ψ = n θ に使います。R m R n = R [ m θ ] R [ n θ ] = R [ ( m + n ) θ ] = R m + n R_m R_n = R[m\boldsymbol{\theta}]R[n\boldsymbol{\theta}] = R[(m+n)\boldsymbol{\theta}] = R_{m+n} R m R n = R [ m θ ] R [ n θ ] = R [( m + n ) θ ] = R m + n 、R 0 = R [ 0 ] = I R_0 = R[\boldsymbol{0}] = I R 0 = R [ 0 ] = I 、R m T = R [ − m θ ] = R − m R_m^{\mathsf{T}} = R[-m\boldsymbol{\theta}] = R_{-m} R m T = R [ − m θ ] = R − m 。直交性 R m T R m = I R_m^{\mathsf{T}}R_m = I R m T R m = I は 3 で、これと R − m R m = R 0 = I R_{-m}R_m = R_0 = I R − m R m = R 0 = I 、R m R − m = I R_m R_{-m} = I R m R − m = I より R − m R_{-m} R − m は R m R_m R m の逆行列です。
∎
定理 6.3 (RoPE の内積は相対位置だけで決まる ) ✓
q , k ∈ R d \boldsymbol{q}, \boldsymbol{k} \in \mathbb{R}^{d} q , k ∈ R d 、m , n ∈ R m, n \in \mathbb{R} m , n ∈ R とする。
⟨ R m q , R n k ⟩ = ⟨ q , R n − m k ⟩ \langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle = \langle \boldsymbol{q}, R_{n-m} \boldsymbol{k} \rangle ⟨ R m q , R n k ⟩ = ⟨ q , R n − m k ⟩ 。したがってこの値は q \boldsymbol{q} q 、k \boldsymbol{k} k と相対位置 n − m n - m n − m だけで決まり、任意の実数 s s s について ⟨ R m + s q , R n + s k ⟩ = ⟨ R m q , R n k ⟩ \langle R_{m+s} \boldsymbol{q}, R_{n+s} \boldsymbol{k} \rangle = \langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle ⟨ R m + s q , R n + s k ⟩ = ⟨ R m q , R n k ⟩ 。
∥ R m q ∥ = ∥ q ∥ \|R_m \boldsymbol{q}\| = \|\boldsymbol{q}\| ∥ R m q ∥ = ∥ q ∥ 。
第 i i i の対を複素数 q ^ i : = q 2 i + i q 2 i + 1 \hat q_i := q_{2i} + \mathrm{i}\, q_{2i+1} q ^ i := q 2 i + i q 2 i + 1 、k ^ i : = k 2 i + i k 2 i + 1 \hat k_i := k_{2i} + \mathrm{i}\, k_{2i+1} k ^ i := k 2 i + i k 2 i + 1 と書くと(i \mathrm{i} i は虚数単位)
⟨ R m q , R n k ⟩ = R e ∑ i = 0 d / 2 − 1 q ^ i k ^ i ‾ e i ( m − n ) θ i . \langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle = \mathrm{Re} \sum_{i=0}^{d/2-1} \hat q_i\, \overline{\hat k_i}\; e^{\mathrm{i}(m-n)\theta_i} . ⟨ R m q , R n k ⟩ = Re i = 0 ∑ d /2 − 1 q ^ i k ^ i e i ( m − n ) θ i .
証明(定理 6.3)
補題 3.2 の 4(1 つ目の式)と 命題 6.2 より
⟨ R m q , R n k ⟩ = ⟨ q , R − m R n k ⟩ = ⟨ q , R n − m k ⟩ \langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle = \langle \boldsymbol{q}, R_{-m} R_n \boldsymbol{k} \rangle = \langle \boldsymbol{q}, R_{n-m}\boldsymbol{k}\rangle ⟨ R m q , R n k ⟩ = ⟨ q , R − m R n k ⟩ = ⟨ q , R n − m k ⟩ です。右辺に現れるのは q \boldsymbol{q} q 、k \boldsymbol{k} k 、n − m n - m n − m だけです。( m , n ) (m, n) ( m , n ) を ( m + s , n + s ) (m+s, n+s) ( m + s , n + s ) に替えても ( n + s ) − ( m + s ) = n − m (n+s) - (m+s) = n - m ( n + s ) − ( m + s ) = n − m なので値は変わりません。
補題 3.2 の 4(3 つ目の式)です。
まず 1 つの対について示します。u = ( u 0 , u 1 ) \boldsymbol{u} = (u_0, u_1) u = ( u 0 , u 1 ) 、w = ( w 0 , w 1 ) ∈ R 2 \boldsymbol{w} = (w_0, w_1) \in \mathbb{R}^2 w = ( w 0 , w 1 ) ∈ R 2 に対し u ^ = u 0 + i u 1 \hat u = u_0 + \mathrm{i}u_1 u ^ = u 0 + i u 1 、w ^ = w 0 + i w 1 \hat w = w_0 + \mathrm{i}w_1 w ^ = w 0 + i w 1 と置くと
u ^ w ^ ‾ = ( u 0 + i u 1 ) ( w 0 − i w 1 ) = ( u 0 w 0 + u 1 w 1 ) + i ( u 1 w 0 − u 0 w 1 ) \hat u\, \overline{\hat w} = (u_0 + \mathrm{i}u_1)(w_0 - \mathrm{i}w_1) = (u_0 w_0 + u_1 w_1) + \mathrm{i}(u_1 w_0 - u_0 w_1) u ^ w ^ = ( u 0 + i u 1 ) ( w 0 − i w 1 ) = ( u 0 w 0 + u 1 w 1 ) + i ( u 1 w 0 − u 0 w 1 ) なので R e ( u ^ w ^ ‾ ) = ⟨ u , w ⟩ \mathrm{Re}(\hat u\, \overline{\hat w}) = \langle \boldsymbol{u}, \boldsymbol{w}\rangle Re ( u ^ w ^ ) = ⟨ u , w ⟩ です。次に、オイラーの公式 e i α = cos α + i sin α e^{\mathrm{i}\alpha} = \cos\alpha + \mathrm{i}\sin\alpha e i α = cos α + i sin α (定理 4.2[複素数と複素平面] )より
e i α u ^ = ( cos α + i sin α ) ( u 0 + i u 1 ) = ( u 0 cos α − u 1 sin α ) + i ( u 0 sin α + u 1 cos α ) e^{\mathrm{i}\alpha}\, \hat u = (\cos\alpha + \mathrm{i}\sin\alpha)(u_0 + \mathrm{i}u_1) = (u_0\cos\alpha - u_1\sin\alpha) + \mathrm{i}(u_0 \sin\alpha + u_1\cos\alpha) e i α u ^ = ( cos α + i sin α ) ( u 0 + i u 1 ) = ( u 0 cos α − u 1 sin α ) + i ( u 0 sin α + u 1 cos α ) で、実部と虚部は R ( α ) u R(\alpha)\boldsymbol{u} R ( α ) u の 2 成分です。つまり R ( α ) u R(\alpha)\boldsymbol{u} R ( α ) u に対応する複素数は e i α u ^ e^{\mathrm{i}\alpha}\hat u e i α u ^ です。
したがって第 i i i の対の内積への寄与は
R e ( e i m θ i q ^ i e i n θ i k ^ i ‾ ) = R e ( q ^ i k ^ i ‾ e i m θ i e i n θ i ‾ ) \mathrm{Re}\Big( e^{\mathrm{i}m\theta_i}\hat q_i\; \overline{e^{\mathrm{i}n\theta_i}\hat k_i} \Big)
= \mathrm{Re}\Big( \hat q_i\, \overline{\hat k_i}\; e^{\mathrm{i}m\theta_i}\, \overline{e^{\mathrm{i}n\theta_i}} \Big) Re ( e i m θ i q ^ i e i n θ i k ^ i ) = Re ( q ^ i k ^ i e i m θ i e i n θ i ) です。e i β ‾ = cos β − i sin β = cos ( − β ) + i sin ( − β ) = e − i β \overline{e^{\mathrm{i}\beta}} = \cos\beta - \mathrm{i}\sin\beta = \cos(-\beta) + \mathrm{i}\sin(-\beta) = e^{-\mathrm{i}\beta} e i β = cos β − i sin β = cos ( − β ) + i sin ( − β ) = e − i β で、e i α e − i β e^{\mathrm{i}\alpha}e^{-\mathrm{i}\beta} e i α e − i β は「R ( α ) R ( − β ) = R ( α − β ) R(\alpha)R(-\beta) = R(\alpha - \beta) R ( α ) R ( − β ) = R ( α − β ) に対応する複素数」なので e i ( α − β ) e^{\mathrm{i}(\alpha - \beta)} e i ( α − β ) です(補題 3.2 の 1。直接には、積を展開して加法定理を使っても同じです)。α = m θ i \alpha = m\theta_i α = m θ i 、β = n θ i \beta = n\theta_i β = n θ i として e i m θ i e i n θ i ‾ = e i ( m − n ) θ i e^{\mathrm{i}m\theta_i}\,\overline{e^{\mathrm{i}n\theta_i}} = e^{\mathrm{i}(m-n)\theta_i} e i m θ i e i n θ i = e i ( m − n ) θ i 。内積は対ごとの内積の和なので、i i i について足し、実部を取る操作と和を入れ替えて主張の式を得ます。
∎
なお、証明の 3 は 1 と 2 の言い換えで、各対を複素数とみなして書き直したものです。本筋は 1 と 2 だけで追えるので、複素数に馴染みが無ければ飛ばしても構いません。
1 と 命題 5.1 を比べてください。足す方式では内容と絶対位置の交差項が残りましたが、RoPE では m m m と n n n が n − m n - m n − m の形でしか現れません。2 は、回してもベクトルの長さが変わらないので、位置の情報を入れることで内容の大きさが乱されないことを言っています。3 は Su らが RoPE を導いた形で([2])、各対を複素数とみなすと「位置 m m m では e i m θ i e^{\mathrm{i}m\theta_i} e i m θ i を掛ける」という 1 行の規則になります。
例 6.4 (d = 2 の数値例 )
d = 2 d = 2 d = 2 で、説明のために角度を θ 0 = π / 6 \theta_0 = \pi/6 θ 0 = π /6 と取ります(定義 6.1 の値 θ 0 = 1 \theta_0 = 1 θ 0 = 1 の代わりです。定理 6.3 の証明は θ \boldsymbol{\theta} θ の値に依りません)。q = ( 1 , 2 ) \boldsymbol{q} = (1, 2) q = ( 1 , 2 ) 、k = ( 3 , 1 ) \boldsymbol{k} = (3, 1) k = ( 3 , 1 ) とします。
( m , n ) = ( 1 , 3 ) (m, n) = (1, 3) ( m , n ) = ( 1 , 3 ) のとき、R 1 q = R ( π / 6 ) q = ( − 0.1340 , 2.2321 ) R_1\boldsymbol{q} = R(\pi/6)\boldsymbol{q} = (-0.1340,\ 2.2321) R 1 q = R ( π /6 ) q = ( − 0.1340 , 2.2321 ) 、R 3 k = R ( π / 2 ) k = ( − 1 , 3 ) R_3\boldsymbol{k} = R(\pi/2)\boldsymbol{k} = (-1,\ 3) R 3 k = R ( π /2 ) k = ( − 1 , 3 ) で、内積は ( − 0.1340 ) × ( − 1 ) + 2.2321 × 3 ≈ 6.8301 (-0.1340)\times(-1) + 2.2321 \times 3 \approx 6.8301 ( − 0.1340 ) × ( − 1 ) + 2.2321 × 3 ≈ 6.8301 です。
( m , n ) = ( 5 , 7 ) (m, n) = (5, 7) ( m , n ) = ( 5 , 7 ) のとき、R 5 q = ( − 1.8660 , − 1.2321 ) R_5\boldsymbol{q} = (-1.8660,\ -1.2321) R 5 q = ( − 1.8660 , − 1.2321 ) 、R 7 k = ( − 2.0981 , − 2.3660 ) R_7\boldsymbol{k} = (-2.0981,\ -2.3660) R 7 k = ( − 2.0981 , − 2.3660 ) で、内積はやはり 6.8301 6.8301 6.8301 です(丸める前の値で計算)。ベクトルはどちらも大きく回っていますが、相対位置がともに 2 なので内積は一致します。
定理 6.3 の 3 で確かめます。q ^ k ^ ‾ = ( 1 + 2 i ) ( 3 − i ) = 5 + 5 i \hat q\,\overline{\hat k} = (1 + 2\mathrm{i})(3 - \mathrm{i}) = 5 + 5\mathrm{i} q ^ k ^ = ( 1 + 2 i ) ( 3 − i ) = 5 + 5 i 、e i ( m − n ) θ 0 = e − i π / 3 = 1 2 − 3 2 i e^{\mathrm{i}(m-n)\theta_0} = e^{-\mathrm{i}\pi/3} = \tfrac12 - \tfrac{\sqrt3}{2}\mathrm{i} e i ( m − n ) θ 0 = e − i π /3 = 2 1 − 2 3 i なので、実部は 5 2 + 5 3 2 = 6.8301 \tfrac52 + \tfrac{5\sqrt3}{2} = 6.8301 2 5 + 2 5 3 = 6.8301 です。
相対位置を 3 に変えた ( m , n ) = ( 1 , 4 ) (m, n) = (1, 4) ( m , n ) = ( 1 , 4 ) では e − i π / 2 = − i e^{-\mathrm{i}\pi/2} = -\mathrm{i} e − i π /2 = − i で、R e ( ( 5 + 5 i ) ( − i ) ) = 5 \mathrm{Re}\big((5 + 5\mathrm{i})(-\mathrm{i})\big) = 5 Re ( ( 5 + 5 i ) ( − i ) ) = 5 となり、値が変わります。
R₁q R₃k R₅q R₇k (m, n) = (1, 3) 内積 6.8301 (m, n) = (5, 7) 内積 6.8301
d = 2、θ₀ = π/6 の RoPE。左は (m, n) = (1, 3)、右は (5, 7)。実線が回したクエリ、破線が回したキー。2 本のなす角は相対位置 n − m = 2 だけで決まるので、左右で同じになる。
正弦波位置符号化、M k M_k M k 、RoPE を NumPy で実装し、この章の命題を数値で確かめます。乱数種は 0 に固定しています。
# Python 3.12.14, NumPy 2.5.2
return 10000.0 ** ( - 2.0 * np. arange ( d // 2 ) / d)
""" 正弦波位置符号化。偶数番目が sin、奇数番目が cos。 """
out[ 0 :: 2 ] = np. sin ( pos * omegas ( d ))
out[ 1 :: 2 ] = np. cos ( pos * omegas ( d ))
""" PE(pos + k) = M_k PE(pos) となるブロック対角行列。 """
for i, w in enumerate ( omegas ( d )):
c, s = np. cos ( k * w ), np. sin ( k * w )
M[ 2 * i: 2 * i + 2 , 2 * i: 2 * i + 2 ] = [[ c, s ] , [ - s, c ]]
""" ベクトル x の第 (2i, 2i+1) 成分を角度 m * thetas[i] だけ回す。 """
c, s = np. cos ( m * thetas ), np. sin ( m * thetas )
out[ 0 :: 2 ] = c * x[ 0 :: 2 ] - s * x[ 1 :: 2 ]
out[ 1 :: 2 ] = s * x[ 0 :: 2 ] + c * x[ 1 :: 2 ]
if __name__ == " __main__ " :
np. set_printoptions ( precision = 4 , suppress = True )
print ( " PE( %d ) = " % pos , pe ( pos , 4 ))
print ( " M_1 PE(1) = " , shift_matrix ( 1 , 4 ) @ pe ( 1 , 4 ))
err_shift = max ( np. abs ( shift_matrix ( k , d ) @ pe ( p , d ) - pe ( p + k , d )) . max ()
for p in range ( 200 ) for k in ( 1 , 7 , 100 ) )
err_orth = np. abs ( M.T @ M - np. eye ( d )). max ()
err_norm = max ( abs ( pe ( p , d ) @ pe ( p , d ) - d / 2 ) for p in range ( 200 ))
err_inner = max ( abs ( pe ( p , d ) @ pe ( q , d ) - np. cos ( omegas ( d ) * (p - q) ) . sum ())
for p in range ( 0 , 200 , 7 ) for q in range ( 0 , 200 , 11 ))
print ( " shift %.1e orth %.1e norm %.1e inner %.1e " % (err_shift, err_orth, err_norm, err_inner) )
rng = np.random. default_rng ( 0 )
q, k = rng. standard_normal ( d ), rng. standard_normal ( d )
err_rel, err_len = 0.0 , 0.0
for m in range ( 0 , 60 , 3 ):
for n in range ( 0 , 60 , 4 ):
lhs = rope ( q , m , thetas ) @ rope ( k , n , thetas )
err_rel = max ( err_rel , abs ( lhs - q @ rope ( k , n - m , thetas )))
err_rel = max ( err_rel , abs ( lhs - rope ( q , m + 500 , thetas ) @ rope ( k , n + 500 , thetas )))
err_len = max ( err_len , abs ( np.linalg. norm ( rope ( q , m , thetas )) - np.linalg. norm ( q )))
print ( " rope relative %.1e norm %.1e " % (err_rel, err_len) )
PE(1) = [0.8415 0.5403 0.01 1. ]
PE(2) = [ 0.9093 -0.4161 0.02 0.9998]
M_1 PE(1) = [ 0.9093 -0.4161 0.02 0.9998]
shift 2.8e-14 orth 2.2e-16 norm 7.1e-15 inner 3.6e-14
rope relative 1.4e-13 norm 8.9e-16
最初の 4 行は 例 4.5 の値です。5 行目は d = 64 d = 64 d = 64 での最大誤差で、順に 定理 4.2 (P E ( p + k ) = M k P E ( p ) \mathrm{PE}(p+k) = M_k\mathrm{PE}(p) PE ( p + k ) = M k PE ( p ) )、M 7 M_7 M 7 の直交性、命題 4.3 のノルムと内積です。6 行目は RoPE で、定理 6.3 の 1(⟨ R m q , R n k ⟩ = ⟨ q , R n − m k ⟩ \langle R_m\boldsymbol{q}, R_n\boldsymbol{k}\rangle = \langle \boldsymbol{q}, R_{n-m}\boldsymbol{k}\rangle ⟨ R m q , R n k ⟩ = ⟨ q , R n − m k ⟩ と、両方の位置を 500 ずらしても値が変わらないこと)と 2(ノルムの保存)の最大誤差です。どれも倍精度の丸め誤差の大きさに収まっています。rope は d × d d \times d d × d の行列を作らず、成分 1 個につき 2 回の乗算と 1 回の加減算(対ごとに 4 回の乗算と 2 回の加減算)で回しているので、計算量は O ( d ) O(d) O ( d ) です。
この章で用意したのは、(1) トークン id の列を n × d n \times d n × d の行列 X X X にする埋め込み、(2) 位置を X X X に足す正弦波と学習する表、(3) 内積の直前でクエリとキーを回す RoPE、の 3 つです。次章の自己注意 では、X X X の行どうしの内積から「どの位置をどれだけ見るか」の重みを作ります。そこで示す同変性の定理は、(2) か (3) のどちらかが無ければモデルが語順を区別できないことを意味します。この章の内容は、その穴を埋める部品です。
演習 9.1 易
∣ V ∣ = 6 |V| = 6 ∣ V ∣ = 6 、d = 3 d = 3 d = 3 とし、トークン列 ( 2 , 5 , 2 ) (2, 5, 2) ( 2 , 5 , 2 ) の埋め込みを X X X (行が x 1 , x 2 , x 3 \boldsymbol{x}_1, \boldsymbol{x}_2, \boldsymbol{x}_3 x 1 , x 2 , x 3 )とする。固定したベクトル u ∈ R 3 \boldsymbol{u} \in \mathbb{R}^3 u ∈ R 3 に対して L = ⟨ x 1 , u ⟩ + 2 ⟨ x 2 , u ⟩ + 3 ⟨ x 3 , u ⟩ \mathcal{L} = \langle \boldsymbol{x}_1, \boldsymbol{u}\rangle + 2\langle \boldsymbol{x}_2, \boldsymbol{u}\rangle + 3\langle \boldsymbol{x}_3, \boldsymbol{u}\rangle L = ⟨ x 1 , u ⟩ + 2 ⟨ x 2 , u ⟩ + 3 ⟨ x 3 , u ⟩ とするとき、L \mathcal{L} L の E E E についての勾配(6 × 3 6 \times 3 6 × 3 の行列)を求めよ。
解答 g ( X ) = ∑ i c i ⟨ x i , u ⟩ g(X) = \sum_i c_i \langle \boldsymbol{x}_i, \boldsymbol{u}\rangle g ( X ) = ∑ i c i ⟨ x i , u ⟩ (c = ( 1 , 2 , 3 ) c = (1, 2, 3) c = ( 1 , 2 , 3 ) )なので ∂ g / ∂ X i j = c i u j \partial g/\partial X_{ij} = c_i u_j ∂ g / ∂ X ij = c i u j です。命題 2.2 の 2 より、第 v v v 行の勾配は ∑ i : t i = v c i u T \sum_{i: t_i = v} c_i\, \boldsymbol{u}^{\mathsf{T}} ∑ i : t i = v c i u T です。トークン 2 は位置 1 と 3 に現れるので第 2 行は ( 1 + 3 ) u T = 4 u T (1 + 3)\boldsymbol{u}^{\mathsf{T}} = 4\boldsymbol{u}^{\mathsf{T}} ( 1 + 3 ) u T = 4 u T 、トークン 5 は位置 2 に現れるので第 5 行は 2 u T 2\boldsymbol{u}^{\mathsf{T}} 2 u T 、第 1・3・4・6 行は 0 です。
演習 9.2 標準
定理 4.2 の M k M_k M k について、M k M l = M k + l M_k M_l = M_{k+l} M k M l = M k + l と M k − 1 = M − k M_k^{-1} = M_{-k} M k − 1 = M − k を示せ。また P E ( p ) = M p P E ( 0 ) \mathrm{PE}(p) = M_p\, \mathrm{PE}(0) PE ( p ) = M p PE ( 0 ) であることと、P E ( 0 ) \mathrm{PE}(0) PE ( 0 ) の成分を求めよ。
解答 ω = ( ω 0 , … , ω d / 2 − 1 ) \boldsymbol{\omega} = (\omega_0, \ldots, \omega_{d/2-1}) ω = ( ω 0 , … , ω d /2 − 1 ) と置くと M k = R [ − k ω ] M_k = R[-k\boldsymbol{\omega}] M k = R [ − k ω ] です。補題 3.2 の 2 より M k M l = R [ − k ω ] R [ − l ω ] = R [ − ( k + l ) ω ] = M k + l M_k M_l = R[-k\boldsymbol{\omega}]R[-l\boldsymbol{\omega}] = R[-(k+l)\boldsymbol{\omega}] = M_{k+l} M k M l = R [ − k ω ] R [ − l ω ] = R [ − ( k + l ) ω ] = M k + l 、M 0 = R [ 0 ] = I M_0 = R[\boldsymbol{0}] = I M 0 = R [ 0 ] = I です。よって M k M − k = M − k M k = M 0 = I M_k M_{-k} = M_{-k}M_k = M_0 = I M k M − k = M − k M k = M 0 = I で、M k − 1 = M − k M_k^{-1} = M_{-k} M k − 1 = M − k です。
定理 4.2 で p p p を 0、k k k を p p p に取り替えると P E ( p ) = M p P E ( 0 ) \mathrm{PE}(p) = M_p\,\mathrm{PE}(0) PE ( p ) = M p PE ( 0 ) です。P E ( 0 ) 2 i = sin 0 = 0 \mathrm{PE}(0)_{2i} = \sin 0 = 0 PE ( 0 ) 2 i = sin 0 = 0 、P E ( 0 ) 2 i + 1 = cos 0 = 1 \mathrm{PE}(0)_{2i+1} = \cos 0 = 1 PE ( 0 ) 2 i + 1 = cos 0 = 1 なので P E ( 0 ) = ( 0 , 1 , 0 , 1 , … , 0 , 1 ) \mathrm{PE}(0) = (0, 1, 0, 1, \ldots, 0, 1) PE ( 0 ) = ( 0 , 1 , 0 , 1 , … , 0 , 1 ) です。つまり正弦波位置符号化は、1 つのベクトル P E ( 0 ) \mathrm{PE}(0) PE ( 0 ) を、位置に比例する角度だけ対ごとに回したものです。
演習 9.3 易
d = 4 d = 4 d = 4 の正弦波位置符号化で ⟨ P E ( 0 ) , P E ( 3 ) ⟩ \langle \mathrm{PE}(0), \mathrm{PE}(3)\rangle ⟨ PE ( 0 ) , PE ( 3 )⟩ を求めよ(cos 3 = − 0.98999 \cos 3 = -0.98999 cos 3 = − 0.98999 、cos 0.03 = 0.99955 \cos 0.03 = 0.99955 cos 0.03 = 0.99955 を使ってよい)。この値から、位置 0 と 3 のベクトルのなす角について何が言えるか。
解答 命題 4.3 より cos ( 3 ω 0 ) + cos ( 3 ω 1 ) = cos 3 + cos 0.03 = − 0.98999 + 0.99955 = 0.00956 \cos(3\omega_0) + \cos(3\omega_1) = \cos 3 + \cos 0.03 = -0.98999 + 0.99955 = 0.00956 cos ( 3 ω 0 ) + cos ( 3 ω 1 ) = cos 3 + cos 0.03 = − 0.98999 + 0.99955 = 0.00956 です。ノルムはどちらも d / 2 = 2 \sqrt{d/2} = \sqrt2 d /2 = 2 なので、コサイン類似度は 0.00956 / 2 = 0.0048 0.00956 / 2 = 0.0048 0.00956/2 = 0.0048 で、2 つのベクトルはほぼ直交しています。速く回る対(ω 0 \omega_0 ω 0 )がほぼ反対向き、遅く回る対(ω 1 \omega_1 ω 1 )がほぼ同じ向きで、打ち消し合った結果です。
演習 9.4 標準
d = 2 d = 2 d = 2 、θ 0 = π / 2 \theta_0 = \pi/2 θ 0 = π /2 の RoPE で、q = ( 1 , 0 ) \boldsymbol{q} = (1, 0) q = ( 1 , 0 ) 、k = ( 0 , 1 ) \boldsymbol{k} = (0, 1) k = ( 0 , 1 ) とする。相対位置 n − m n - m n − m が 1 1 1 、0 0 0 、− 1 -1 − 1 のときの ⟨ R m q , R n k ⟩ \langle R_m\boldsymbol{q}, R_n\boldsymbol{k}\rangle ⟨ R m q , R n k ⟩ を求め、RoPE の内積が「前にあるか後ろにあるか」を区別できることを確かめよ。
解答 定理 6.3 の 1 より、値は ⟨ q , R ( ( n − m ) π / 2 ) k ⟩ \langle \boldsymbol{q}, R((n-m)\pi/2)\boldsymbol{k}\rangle ⟨ q , R (( n − m ) π /2 ) k ⟩ です。
n − m = 1 n - m = 1 n − m = 1 : R ( π / 2 ) k = ( − 1 , 0 ) R(\pi/2)\boldsymbol{k} = (-1, 0) R ( π /2 ) k = ( − 1 , 0 ) で、内積は − 1 -1 − 1 。
n − m = 0 n - m = 0 n − m = 0 : R ( 0 ) k = ( 0 , 1 ) R(0)\boldsymbol{k} = (0, 1) R ( 0 ) k = ( 0 , 1 ) で、内積は 0 0 0 。
n − m = − 1 n - m = -1 n − m = − 1 : R ( − π / 2 ) k = ( 1 , 0 ) R(-\pi/2)\boldsymbol{k} = (1, 0) R ( − π /2 ) k = ( 1 , 0 ) で、内積は 1 1 1 。
相対位置の符号を変えると値が − 1 -1 − 1 から 1 1 1 に変わるので、キーがクエリより 1 つ後ろにあるか 1 つ前にあるかが区別できています。命題 4.3 の ⟨ P E ( p ) , P E ( q ) ⟩ = ∑ i cos ( ω i ( p − q ) ) \langle \mathrm{PE}(p), \mathrm{PE}(q)\rangle = \sum_i\cos(\omega_i(p - q)) ⟨ PE ( p ) , PE ( q )⟩ = ∑ i cos ( ω i ( p − q )) は p − q p - q p − q の符号を変えても同じ値でしたが、RoPE では内容のベクトル q , k \boldsymbol{q}, \boldsymbol{k} q , k が間に入るので、向きの情報が残ります。
[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.4 節(埋め込みと重みの共有)、3.5 節(正弦波位置符号化)。
[2] J. Su, Y. Lu, S. Pan, A. Murtadha, B. Wen, Y. Liu, “RoFormer: Enhanced Transformer with Rotary Position Embedding”, 2021. arXiv:2104.09864 — 回転位置埋め込みの提案。
[3] 本サイト「数学を学び直す意義:AI を読み解く三つの言語 」 — コサイン類似度と、高次元でほぼ直交する方向の本数。
[4] P. Shaw, J. Uszkoreit, A. Vaswani, “Self-Attention with Relative Position Representations”, NAACL 2018. arXiv:1803.02155 — 相対位置の表現を注意に入れる先行研究。
[5] O. Press, L. Wolf, “Using the Output Embedding to Improve Language Models”, EACL 2017. arXiv:1608.05859 — 入力と出力の埋め込みの重み共有。
執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12