コンテンツにスキップ

埋め込みと位置符号化:正弦波と回転位置埋め込み(RoPE)

対象読者: 本テーマ第 1 章のトークン化と、学部 1 年の線形代数(行列の積・内積・直交行列)、三角関数の加法定理を学んだ人。ニューラルネットワークの知識は仮定しません。

前提となる記事:トークン化:バイト対符号化(BPE)の手順と性質、内積空間とグラム・シュミット直交化:長さと角度を線形代数に持ち込む、指数・対数・三角関数をきちんと定義する:級数から出発して π と弧の長さまで

生 Markdown

文章を機械に読ませるとき、単語に振った番号をそのまま計算に使うことはできません。番号の大小に意味が無いからです。さらに、「犬が猫を追う」と「猫が犬を追う」では、同じ単語が並んでいても意味が逆になります。この章では、番号を計算に使える数の組に置き換える方法と、語順を数の中に書き込む方法を説明します。読み終えると、位置を「足す」やり方と「回す」やり方で何が違うのかを、式で説明できるようになります。

  • トークン id は名前にすぎないので、モデルに入れる前に dd 次元のベクトルに置き換えます。これは ∣V∣×d|V| \times d の行列 EE の行を取り出す操作で、one-hot ベクトル(1 か所だけ 1 で残りが 0 のベクトル)を掛けることと同じです(命題 2.2)。
  • 次章で示すとおり、自己注意(文中の各語が他の語をどれだけ見るかを決める仕組み)は入力の並べ替えを区別できません。語順を伝えるには、位置の情報を外から与える必要があります。この章ではその与え方を 2 通り用意します。
  • 正弦波位置符号化 PE(p)\mathrm{PE}(p) は、位置を kk ずらすと、pp に依らない直交行列 MkM_k を掛けたものになります(定理 4.2)。内積 ⟨PE(p),PE(q)⟩\langle \mathrm{PE}(p), \mathrm{PE}(q)\rangle は p−qp - q だけの関数です(命題 4.3)。
  • ただし位置ベクトルを入力に足す方式では、内容と位置の交差項が残り、内積は相対位置だけの関数になりません(命題 5.1)。
  • 回転位置埋め込み(RoPE)は、内積を取る直前にクエリとキーを位置に応じて回します。このとき内積は内容と相対位置 n−mn - m だけで決まり、ノルムは変わりません(定理 6.3)。
  • 証明はすべて、2 次の回転行列の性質 R(α)R(β)=R(α+β)R(\alpha)R(\beta) = R(\alpha + \beta)、つまり加法定理に帰着します。

1. 動機:id の列をベクトルの列にする

Section titled “1. 動機:id の列をベクトルの列にする”

前章で、文字列はトークン id の列 (t1,…,tn)(t_1, \ldots, t_n)、ti∈Vt_i \in V になりました。id は整数ですが、その大小や差に意味はありません。id が 300 のトークンと 301 のトークンが似ているわけではないからです。ニューラルネットワークは実数のベクトルに対する関数なので、まず各 id を「学習で調整できるベクトル」に置き換えます。これが埋め込みです。

埋め込みだけでは足りないものがあります。同じトークンは列のどこにあっても同じベクトルになるので、ベクトルの列を見ても、もとの順番は「何番目の行か」という添字にしか残っていません。次章の 定理 5.2[自己注意] は、自己注意がこの添字を使わない(行を並べ替えると出力も同じように並べ替わるだけである)ことを示します。そこで、位置の情報をベクトルの値そのものに書き込む必要があります。

書き込み方は大きく 2 つあります。

方式どこで位置を入れるかこの章での扱い
絶対位置を足す入力のベクトルに、位置ごとのベクトルを足す(正弦波・学習する表)4 節・5 節
相対位置を内積に入れる注意の内積を取る直前に、クエリとキーを位置に応じて回す(RoPE)6 節

Vaswani らの Transformer は前者の正弦波を使い([1])、Su らは後者の RoPE を提案しました([2])。どちらも三角関数でできているので、同じ道具で性質を証明できます。

この章では、ベクトルは列ベクトル、内積は ⟨x,y⟩=∑jxjyj\langle \boldsymbol{x}, \boldsymbol{y} \rangle = \sum_j x_j y_j、ノルムは ∥x∥=⟨x,x⟩\|\boldsymbol{x}\| = \sqrt{\langle \boldsymbol{x}, \boldsymbol{x}\rangle} とします(定義 3.1[内積空間とグラム・シュミット直交化]、定義 4.1[内積空間とグラム・シュミット直交化])。

定義 2.1(one-hot ベクトル・埋め込み行列・重み共有)↗

語彙 VV の元に 1,…,∣V∣1, \ldots, |V| の番号を付け、トークンをその番号と同一視する。トークン vv の one-hot ベクトル ev∈R∣V∣\boldsymbol{e}_v \in \mathbb{R}^{|V|} とは、第 vv 成分が 1、ほかの成分が 0 のベクトルである。

行列 E∈R∣V∣×dE \in \mathbb{R}^{|V| \times d} を埋め込み行列、dd を埋め込みの次元という。EE の第 vv 行を列ベクトルとみなしたもの Ev∈RdE_v \in \mathbb{R}^{d} を、トークン vv の埋め込みという。トークン列 (t1,…,tn)(t_1, \ldots, t_n) に対し、第 ii 行が EtiTE_{t_i}^{\mathsf{T}} である行列 X∈Rn×dX \in \mathbb{R}^{n \times d} を、その列の埋め込みという。

モデルの最後で、ベクトル h∈Rd\boldsymbol{h} \in \mathbb{R}^{d} から各トークン vv の点数(ロジット)を zv:=⟨h,Uv⟩z_v := \langle \boldsymbol{h}, U_v \rangle(U∈R∣V∣×dU \in \mathbb{R}^{|V| \times d}、UvU_v はその第 vv 行)で作るとき、U=EU = E と取ること、すなわち入力側の埋め込み行列と出力側の行列に同じパラメータを使うことを重み共有という。

重み共有は Press と Wolf が言語モデルについて調べ([5])、Vaswani らも埋め込みと出力の線形変換で同じ行列を共有しています([1] 3.4 節)。パラメータの数え方に効くので、第 4 章で改めて使います。

命題 2.2(埋め込みは行の取り出しで、勾配は現れた行だけに入る)✓

E∈R∣V∣×dE \in \mathbb{R}^{|V| \times d} とする。

  1. 任意のトークン vv について evTE\boldsymbol{e}_v^{\mathsf{T}} E は EE の第 vv 行である。
  2. トークン列 (t1,…,tn)(t_1, \ldots, t_n) の埋め込みを X∈Rn×dX \in \mathbb{R}^{n\times d} とし、損失が全微分可能な関数 g:Rn×d→Rg : \mathbb{R}^{n \times d} \to \mathbb{R} によって L=g(X)\mathcal{L} = g(X) と書けるとする(EE は XX を通してだけ L\mathcal{L} に入るとする)。このとき
∂L∂Evj=∑i : ti=v∂g∂Xij(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)

が成り立つ。とくに、列に現れないトークン vv の行については ∂L/∂Evj=0\partial \mathcal{L} / \partial E_{vj} = 0 である。

証明(命題 2.2)
  1. 行列の積の定義より、evTE\boldsymbol{e}_v^{\mathsf{T}} E の第 jj 成分は ∑u=1∣V∣(ev)uEuj\sum_{u=1}^{|V|} (\boldsymbol{e}_v)_u E_{uj} です。(ev)u(\boldsymbol{e}_v)_u は u=vu = v のときだけ 1 で、ほかは 0 なので、和は EvjE_{vj} です。

  2. [ti=v][t_i = v] を、ti=vt_i = v のとき 1、そうでないとき 0 とします。1 より Xij=Etij=∑u[ti=u] EujX_{ij} = E_{t_i j} = \sum_{u} [t_i = u]\, E_{uj} で、これは EE の成分の 1 次式なので全微分可能で、∂Xij′/∂Evj=[ti=v] [j′=j]\partial X_{ij'} / \partial E_{vj} = [t_i = v]\,[j' = j] です。連鎖律(定理 3.1[ニューラルネットワークと逆伝播])を合成 E↦X↦g(X)E \mapsto X \mapsto g(X) に使うと

∂L∂Evj=∑i=1n∑j′=1d∂g∂Xij′(X) ∂Xij′∂Evj=∑i=1n∂g∂Xij(X) [ti=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]

で、これが主張の式です。vv が列に現れなければ、すべての ii で [ti=v]=0[t_i = v] = 0 なので和は 0 です。

1 は、実装で one-hot ベクトルとの積を実際に計算する必要がないことを言っています。∣V∣×d|V| \times d の積を計算する代わりに、表の 1 行を読むだけです。2 は、同じトークンが列に複数回現れると、その行の勾配は現れた位置の勾配の和になること、そして 1 回の更新で動くのは入力に現れた行だけであることを言っています。重み共有をしている場合は、EE が出力側でも使われるので仮定「EE は XX を通してだけ入る」が外れ、出力側からの勾配がすべての行に加わります。

例 2.3(重み共有のもとでのロジット)

∣V∣=3|V| = 3、d=2d = 2 とし、埋め込み行列を

E=(100111)E = \begin{pmatrix} 1 & 0 \\ 0 & 1 \\ 1 & 1 \end{pmatrix}

とします。トークン列 (3,1)(3, 1) の埋め込みは、EE の第 3 行と第 1 行を並べた X=(1110)X = \begin{pmatrix} 1 & 1 \\ 1 & 0 \end{pmatrix} です。モデルの最後のベクトルが h=(2,1)\boldsymbol{h} = (2, 1) だったとすると、重み共有のもとでのロジットは zv=⟨h,Ev⟩z_v = \langle \boldsymbol{h}, E_v\rangle なので

z=Eh=(2, 1, 3)\boldsymbol{z} = E\boldsymbol{h} = (2,\ 1,\ 3)

で、いちばん大きいのはトークン 3 です。重み共有をすると、「入力でトークン vv を表すベクトル」と「出力でトークン vv らしさを測るベクトル」が同じ EvE_v になります。最後のベクトル h\boldsymbol{h} がどのトークンの埋め込みと同じ向きを向いているかで、次のトークンの点数が決まります。パラメータは EE の ∣V∣d=6|V|d = 6 個だけで、共有しない場合の 2∣V∣d=122|V|d = 12 個の半分です。

注意 2.4(埋め込みと位置ベクトルの大きさ)

4 節で見るとおり、正弦波位置符号化のノルムは位置に依らず d/2\sqrt{d/2} です(命題 4.3)。一方、埋め込み EvE_v のノルムは学習と初期化で決まります。位置ベクトルを足す方式では、この 2 つの大きさの比によって、足したあとのベクトルに占める内容と位置の割合が変わります。Vaswani らは、埋め込み層では重みに d\sqrt{d} を掛けると述べています([1] 3.4 節)。大きさの比をどう取るのが良いかは設計と経験の問題で、この章の命題はどの比でも成り立ちます。

埋め込みの空間では、内積やコサイン類似度(定義 3.1[数学を学び直す意義])が「近さ」の尺度になります。次元 dd が大きいと、互いにほぼ直交する方向を非常にたくさん取れる(系 3.5[数学を学び直す意義])ので、数万個のトークンに、互いに干渉しにくい方向を割り当てる余地があります。この章の残りでは、内容を表すこのベクトルに、位置をどう組み合わせるかを扱います。

3. 準備:回転行列とブロック対角の回転

Section titled “3. 準備:回転行列とブロック対角の回転”

定義 3.1(2 次の回転行列とブロック対角の回転)↗

実数 α\alpha に対し

R(α):=(cos⁡α−sin⁡αsin⁡αcos⁡α)R(\alpha) := \begin{pmatrix} \cos\alpha & -\sin\alpha \\ \sin\alpha & \cos\alpha \end{pmatrix}

を角 α\alpha の回転行列という。dd を正の偶数とし、φ=(φ0,…,φd/2−1)∈Rd/2\boldsymbol{\varphi} = (\varphi_0, \ldots, \varphi_{d/2 - 1}) \in \mathbb{R}^{d/2} に対して、dd 次の正方行列

R[φ]:=(R(φ0)⋱R(φd/2−1))R[\boldsymbol{\varphi}] := \begin{pmatrix} R(\varphi_0) & & \\ & \ddots & \\ & & R(\varphi_{d/2-1}) \end{pmatrix}

(対角に 2×22 \times 2 のブロックが並び、ほかは 0)をブロック対角の回転という。

この章では、dd 次元のベクトルの成分を x0,x1,…,xd−1x_0, x_1, \ldots, x_{d-1} と 0 から数え、(x2i,x2i+1)(x_{2i}, x_{2i+1}) を第 ii の対と呼びます(i=0,…,d/2−1i = 0, \ldots, d/2 - 1)。R[φ]xR[\boldsymbol{\varphi}]\boldsymbol{x} は、第 ii の対を平面のベクトルとみなして角 φi\varphi_i だけ回したものです。

補題 3.2(回転行列の性質)✓

α,β∈R\alpha, \beta \in \mathbb{R}、φ,ψ∈Rd/2\boldsymbol{\varphi}, \boldsymbol{\psi} \in \mathbb{R}^{d/2}、x,y∈Rd\boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^{d} とする。

  1. R(α)R(β)=R(α+β)R(\alpha) R(\beta) = R(\alpha + \beta)、R(0)=IR(0) = I、R(α)T=R(−α)R(\alpha)^{\mathsf{T}} = R(-\alpha)。
  2. R[φ] R[ψ]=R[φ+ψ]R[\boldsymbol{\varphi}]\, R[\boldsymbol{\psi}] = R[\boldsymbol{\varphi} + \boldsymbol{\psi}]、R[0]=IR[\boldsymbol{0}] = I、R[φ]T=R[−φ]R[\boldsymbol{\varphi}]^{\mathsf{T}} = R[-\boldsymbol{\varphi}]。
  3. R[φ]TR[φ]=IR[\boldsymbol{\varphi}]^{\mathsf{T}} R[\boldsymbol{\varphi}] = I(直交行列)。
  4. ⟨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,R[φ]y⟩=⟨x,y⟩\langle R[\boldsymbol{\varphi}]\boldsymbol{x}, R[\boldsymbol{\varphi}]\boldsymbol{y} \rangle = \langle \boldsymbol{x}, \boldsymbol{y} \rangle、∥R[φ]x∥=∥x∥\|R[\boldsymbol{\varphi}]\boldsymbol{x}\| = \|\boldsymbol{x}\|。
証明(補題 3.2)
  1. 積を計算します。
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}

加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する])より、対角の成分は cos⁡(α+β)\cos(\alpha+\beta)、左下は sin⁡(α+β)\sin(\alpha + \beta)、右上は −sin⁡(α+β)-\sin(\alpha+\beta) なので、R(α+β)R(\alpha+\beta) に等しくなります。cos⁡0=1\cos 0 = 1、sin⁡0=0\sin 0 = 0 より R(0)=IR(0) = I。cos⁡(−α)=cos⁡α\cos(-\alpha) = \cos\alpha、sin⁡(−α)=−sin⁡α\sin(-\alpha) = -\sin\alpha(定理 6.2[指数・対数・三角関数をきちんと定義する] の 2)より、R(−α)R(-\alpha) は R(α)R(\alpha) の非対角成分の符号を入れ替えたもの、すなわち R(α)TR(\alpha)^{\mathsf{T}} です。

  1. ブロック対角行列どうしの積は、対応するブロックの積を対角に並べたものです。実際、A,BA, B がブロック対角のとき、(AB)jl=∑kAjkBkl(AB)_{jl} = \sum_{k} A_{jk}B_{kl} で Ajk≠0A_{jk} \ne 0 となりうるのは kk が jj と同じ対にあるときだけ、Bkl≠0B_{kl} \ne 0 となりうるのは ll が kk と同じ対にあるときだけなので、j,lj, l が違う対にあれば 0、同じ対にあればその対のブロックの積の成分です。転置も対ごとに取れます。よって 1 を各ブロックに使えば 2 が出ます。

  2. 2 より R[φ]TR[φ]=R[−φ]R[φ]=R[0]=IR[\boldsymbol{\varphi}]^{\mathsf{T}} R[\boldsymbol{\varphi}] = R[-\boldsymbol{\varphi}]R[\boldsymbol{\varphi}] = R[\boldsymbol{0}] = I。

  3. 任意の正方行列 AA について ⟨Ax,y⟩=∑j∑kAjkxkyj=∑kxk∑j(AT)kjyj=⟨x,ATy⟩\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=R[φ]A = R[\boldsymbol{\varphi}] とし 2 を使うと 1 つ目の式が出ます。2 つ目は、1 つ目で y\boldsymbol{y} を R[φ]yR[\boldsymbol{\varphi}]\boldsymbol{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。3 つ目は 2 つ目で y=x\boldsymbol{y} = \boldsymbol{x} として平方根を取ります。

4 の「内積とノルムを保つ」は、直交行列(実のユニタリ行列)の一般的な性質です(命題 3.2[スペクトル定理] の条件 1 から 2・3)。2 次の直交行列で行列式が 1 のものは回転行列に限ること(補題 2.3[合同と相似])も知られていますが、以下で使うのは上の補題だけです。

4. 位置を足す方式:正弦波と学習する表

Section titled “4. 位置を足す方式:正弦波と学習する表”

定義 4.1(絶対位置・相対位置・位置符号化)↗

列の中でのトークンの番号 pp を絶対位置、2 つのトークンの絶対位置 m,nm, n の差 n−mn - m を相対位置という。dd を正の偶数とし、i=0,…,d/2−1i = 0, \ldots, d/2 - 1 について角周波数を

ωi:=10000−2i/d\omega_i := 10000^{-2i/d}

と置く。実数 pp に対し、成分が

PE(p)2i:=sin⁡(p ωi),PE(p)2i+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)∈Rd\mathrm{PE}(p) \in \mathbb{R}^{d} を正弦波位置符号化という。位置 pp のトークンの埋め込み x\boldsymbol{x} を x+PE(p)\boldsymbol{x} + \mathrm{PE}(p) に置き換えてモデルに入れる。

これに対し、行列 P∈RLctx×dP \in \mathbb{R}^{L_{\mathrm{ctx}} \times d} をパラメータとして持ち、位置 p∈{1,…,Lctx}p \in \{1, \ldots, L_{\mathrm{ctx}}\} のトークンの埋め込み x\boldsymbol{x} を x+Pp\boldsymbol{x} + P_p(PpP_p は PP の第 pp 行)に置き換える方式を、学習する位置埋め込みという。

ω0=1\omega_0 = 1 が最大で、ωd/2−1=10000−(d−2)/d\omega_{d/2-1} = 10000^{-(d-2)/d} が最小です。つまり ωi\omega_i は 1 から 1/100001/10000 に近い値まで、桁を揃えて並んだ値で、1 周する速さの違う時計の針を d/2d/2 本用意することに当たります(10000 という値そのものは設計上の選択です)。第 ii の対 (sin⁡pωi,cos⁡pωi)(\sin p\omega_i, \cos p\omega_i) は、pp が進むにつれて単位円の上を角速度 ωi\omega_i で回ります。速く回る対は近くの位置の違いを、ゆっくり回る対は遠くの位置の違いを表します。時計の秒針・分針・時針に似た仕組みです。

定理 4.2(位置のずれは直交行列で表せる)✓

任意の実数 kk に対し、dd 次の直交行列

Mk:=R[(−kω0,…,−kωd/2−1)]M_k := R[(-k\omega_0, \ldots, -k\omega_{d/2-1})]

は pp に依らず、すべての実数 pp について

PE(p+k)=Mk PE(p)\mathrm{PE}(p + k) = M_k\, \mathrm{PE}(p)

を満たす。

証明(定理 4.2)

MkM_k の定義に pp は現れません。直交行列であることは 補題 3.2 の 3 です。

等式を対ごとに確かめます。MkM_k の第 ii のブロックは

R(−kωi)=(cos⁡kωisin⁡kωi−sin⁡kωicos⁡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}

です(cos⁡(−t)=cos⁡t\cos(-t) = \cos t、sin⁡(−t)=−sin⁡t\sin(-t) = -\sin t を使いました)。これを PE(p)\mathrm{PE}(p) の第 ii の対 (sin⁡pωi,cos⁡pωi)T(\sin p\omega_i, \cos p\omega_i)^{\mathsf{T}} に掛けると

(cos⁡kωisin⁡pωi+sin⁡kωicos⁡pωi−sin⁡kωisin⁡pωi+cos⁡kωicos⁡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}

となります。等号は加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する])を x=pωix = p\omega_i、y=kωiy = k\omega_i に使ったものです。右辺は PE(p+k)\mathrm{PE}(p+k) の第 ii の対です。MkM_k はブロック対角なので、対ごとの等式から全体の等式が従います。

Vaswani らは正弦波を選んだ理由として、固定したずれ kk について PE(p+k)\mathrm{PE}(p+k) が PE(p)\mathrm{PE}(p) の線形な関数で表せることを挙げています([1] 3.5 節)。上の定理はその線形写像を具体的に書き、それが回転(直交行列)であることまで示したものです。

命題 4.3(正弦波位置符号化の内積とノルム)✓

任意の実数 p,qp, q について

⟨PE(p),PE(q)⟩=∑i=0d/2−1cos⁡(ωi(p−q)),∥PE(p)∥2=d2\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}

が成り立つ。とくに内積は相対位置 p−qp - q だけの関数である。

証明(命題 4.3)

内積を対ごとに計算します。

⟨PE(p),PE(q)⟩=∑i=0d/2−1(sin⁡pωisin⁡qωi+cos⁡pωicos⁡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)

加法定理(定理 6.4[指数・対数・三角関数をきちんと定義する])で x=pωix = p\omega_i、y=−qωiy = -q\omega_i と置き、cos⁡(−y)=cos⁡y\cos(-y) = \cos y、sin⁡(−y)=−sin⁡y\sin(-y) = -\sin y を使うと cos⁡(pωi−qωi)=cos⁡pωicos⁡qωi+sin⁡pωisin⁡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⁡(ωi(p−q))\cos(\omega_i(p - q)) です。q=pq = p とすると各項は cos⁡0=1\cos 0 = 1 で、d/2d/2 項あるので ∥PE(p)∥2=d/2\|\mathrm{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} とする。区間 0≤p<2π/ωmin⁡0 \le p < 2\pi/\omega_{\min} の上で、写像 p↦PE(p)p \mapsto \mathrm{PE}(p) は単射である。

証明(命題 4.4)

0≤p,q<2π/ωmin⁡0 \le p, q < 2\pi/\omega_{\min} で PE(p)=PE(q)\mathrm{PE}(p) = \mathrm{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}) です。pωmin⁡p\omega_{\min} と qωmin⁡q\omega_{\min} はどちらも [0,2π)[0, 2\pi) にあり、θ↦(cos⁡θ,sin⁡θ)\theta \mapsto (\cos\theta, \sin\theta) は [0,2π)[0, 2\pi) の上で単射(定理 7.4[指数・対数・三角関数をきちんと定義する])なので、pωmin⁡=qωmin⁡p\omega_{\min} = q\omega_{\min}、ωmin⁡>0\omega_{\min} > 0 より p=qp = q です。

区間の長さは 2π⋅10000(d−2)/d2\pi \cdot 10000^{(d-2)/d} です。d=4d = 4 なら 2π⋅100≈6282\pi \cdot 100 \approx 628、Vaswani らの基本の構成 d=512d = 512([1])なら約 6.06×1046.06 \times 10^{4} で、整数の位置がこの個数だけ区別できます。証明に使ったのはいちばん遅い対だけです。この範囲を超えると最後の対は 1 周して戻りますが、ほかの対も合わせて見れば区別できる位置はもっと多くなります。ただし「すべての整数の位置で単射である」という主張には π\pi が無理数であることが要るので、ここでは範囲つきの形だけを述べました。

例 4.5(d = 4 の数値例)

d=4d = 4 のとき ω0=1\omega_0 = 1、ω1=10000−1/2=0.01\omega_1 = 10000^{-1/2} = 0.01 です。

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)\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)

(sin⁡1=0.8415\sin 1 = 0.8415、cos⁡1=0.5403\cos 1 = 0.5403、sin⁡0.01=0.0100\sin 0.01 = 0.0100、cos⁡0.01=0.99995\cos 0.01 = 0.99995)。ずらす行列は

M1=(0.54030.8415−0.84150.54030.999950.0100−0.01000.99995)M_1 = \begin{pmatrix} 0.5403 & 0.8415 & & \\ -0.8415 & 0.5403 & & \\ & & 0.99995 & 0.0100 \\ & & -0.0100 & 0.99995 \end{pmatrix}

で、M1PE(1)M_1 \mathrm{PE}(1) の最初の 2 成分は 0.5403×0.8415+0.8415×0.5403=0.90930.5403 \times 0.8415 + 0.8415 \times 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 となり、PE(2)\mathrm{PE}(2) に一致します。内積は 命題 4.3 より ⟨PE(p),PE(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+2)⟩=cos⁡2+cos⁡0.02=0.5837\langle \mathrm{PE}(p), \mathrm{PE}(p+2)\rangle = \cos 2 + \cos 0.02 = 0.5837 で、pp に依りません。ノルムの 2 乗は常に d/2=2d/2 = 2 です。

命題 4.6(学習する位置埋め込みのパラメータ数と定義域)✓

長さ LctxL_{\mathrm{ctx}} の学習する位置埋め込みは Lctx dL_{\mathrm{ctx}}\, d 個のパラメータを持ち、位置 p>Lctxp > L_{\mathrm{ctx}} に対しては位置ベクトルが定義されない。したがってこの方式のモデルは、長さが LctxL_{\mathrm{ctx}} を超える列を入力に取れない。一方、正弦波位置符号化 PE(p)\mathrm{PE}(p) と、6 節の回転 RmR_m は、パラメータを持たず、すべての実数(とくにすべての整数の位置)に対して定義される。

証明(命題 4.6)

定義 4.1 より、学習する位置埋め込みのパラメータは行列 P∈RLctx×dP \in \mathbb{R}^{L_{\mathrm{ctx}} \times d} の成分で、その個数は Lctx dL_{\mathrm{ctx}}\,d です。位置 pp のベクトルは PP の第 pp 行で、PP には第 LctxL_{\mathrm{ctx}} 行までしか無いので、p>Lctxp > L_{\mathrm{ctx}} では定義されません。入力の第 pp トークンに足すベクトルが無ければ、モデルへの入力が定まりません。PE(p)\mathrm{PE}(p) は sin⁡\sin と cos⁡\cos の値で、6 節の RmR_m も cos⁡\cos と sin⁡\sin の値を成分とする行列で、どちらも任意の実数に対して定義されており、学習するパラメータを含みません。

注意 4.7(定義できることと、うまく働くことは別)

命題 4.6 が言っているのは「定義できるかどうか」だけです。学習時より長い列でモデルがうまく働くかどうかは、定義からは分かりません。Vaswani らは、正弦波と学習する位置埋め込みでほぼ同じ結果が得られたと報告したうえで、正弦波を選んだ理由を「学習時より長い列へ外挿できるかもしれないから」と述べています([1] 3.5 節)。これは著者らの見込みであって、証明された性質ではありません。位置符号化の外挿の良し悪しは、モデルとデータに依る経験的な問題として扱ってください。

5. 足す方式では相対位置だけの関数にならない

Section titled “5. 足す方式では相対位置だけの関数にならない”

次章の注意は、2 つの位置のベクトルの内積(に線形変換を挟んだもの)で「どの位置をどれだけ見るか」を決めます。言語では「3 つ前の語」のような相対位置が意味を持つことが多いので、この内積が相対位置で決まると都合がよいのですが、位置ベクトルを足す方式ではそうなりません。

命題 5.1(足す方式の内積の 4 項分解)✓

位置 m,nm, n のトークンの埋め込みを xm,xn∈Rd\boldsymbol{x}_m, \boldsymbol{x}_n \in \mathbb{R}^{d}、位置ベクトルを pm,pn∈Rd\boldsymbol{p}_m, \boldsymbol{p}_n \in \mathbb{R}^{d} とする。

  1. ⟨xm+pm, xn+pn⟩=⟨xm,xn⟩+⟨xm,pn⟩+⟨pm,xn⟩+⟨pm,pn⟩\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。
  2. pm=PE(m)\boldsymbol{p}_m = \mathrm{PE}(m) のとき、第 4 項は n−mn - m だけの関数だが、全体はそうではない。すなわち、内容 xm=xn=x\boldsymbol{x}_m = \boldsymbol{x}_n = \boldsymbol{x} を固定しても、相対位置が同じ 2 組 (m,n)(m, n)、(m′,n′)(m', n') で値が異なる例がある。
証明(命題 5.1)

1 は内積の双線形性(定義 3.1[内積空間とグラム・シュミット直交化])による展開です。

2 の前半は 命題 4.3 です。後半の例を作ります。d=2d = 2 とすると ω0=1\omega_0 = 1 で PE(p)=(sin⁡p,cos⁡p)\mathrm{PE}(p) = (\sin p, \cos p) です。x=(1,0)\boldsymbol{x} = (1, 0) と置くと、⟨x,x⟩=1\langle \boldsymbol{x}, \boldsymbol{x}\rangle = 1、⟨x,PE(p)⟩=sin⁡p\langle \boldsymbol{x}, \mathrm{PE}(p) \rangle = \sin p、⟨PE(m),PE(n)⟩=cos⁡(m−n)\langle \mathrm{PE}(m), \mathrm{PE}(n)\rangle = \cos(m - n) なので、1 より

⟨x+PE(m), x+PE(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)

です。(m,n)=(0,1)(m, n) = (0, 1) では 1+sin⁡1+0+cos⁡11 + \sin 1 + 0 + \cos 1、(m,n)=(1,2)(m, n) = (1, 2) では 1+sin⁡2+sin⁡1+cos⁡11 + \sin 2 + \sin 1 + \cos 1 で、どちらも相対位置は 1 ですが、差は sin⁡2\sin 2 です。

sin⁡2≠0\sin 2 \ne 0 を確かめます。3.14<π<3.153.14 < \pi < 3.15(定理 10.4[指数・対数・三角関数をきちんと定義する])より π/2<2<π\pi/2 < 2 < \pi です。[π/2,π][\pi/2, \pi] では sin⁡x=cos⁡(x−π/2)\sin x = \cos(x - \pi/2) で、x=2x = 2 のとき x−π/2∈[0,π/2)x - \pi/2 \in [0, \pi/2)、そこでは cos⁡>0\cos > 0 です(定理 7.3[指数・対数・三角関数をきちんと定義する] の 3)。よって sin⁡2>0\sin 2 > 0 で、2 組の値は異なります。数値では 2.38182.3818 と 3.29113.2911 です。

交差項 ⟨xm,pn⟩\langle \boldsymbol{x}_m, \boldsymbol{p}_n\rangle は「内容と絶対位置の相性」を表す項で、これが残るかぎり、同じ 2 語が同じ間隔で並んでいても、列のどこにあるかで点数が変わります。実際の注意では内積の間に学習する行列が挟まりますが(次章)、双線形な式を 4 項に展開できることは同じです。Shaw らは、絶対位置を足す代わりに、相対位置ごとの表現を注意の計算の中に入れる方法を提案しました([4])。次節の RoPE は、同じ狙いを回転だけで実現します。

定義 6.1(回転位置埋め込み)↗

dd を正の偶数とし、θi:=10000−2i/d\theta_i := 10000^{-2i/d}(i=0,…,d/2−1i = 0, \ldots, d/2-1)、θ:=(θ0,…,θd/2−1)\boldsymbol{\theta} := (\theta_0, \ldots, \theta_{d/2-1}) と置く。実数 mm に対し

Rm:=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})]

と定める。位置 mm のクエリ q∈Rd\boldsymbol{q} \in \mathbb{R}^{d} と位置 nn のキー k∈Rd\boldsymbol{k} \in \mathbb{R}^{d} の内積 ⟨q,k⟩\langle \boldsymbol{q}, \boldsymbol{k}\rangle の代わりに

⟨Rmq, Rnk⟩\langle R_m \boldsymbol{q},\ R_n \boldsymbol{k} \rangle

を使う方式を回転位置埋め込み(RoPE)という。

クエリとキーは次章で定義します(直感的には、クエリは「いま注目している語が探しているもの」、キーは「各語が持っている目印」で、2 つの内積が大きいほど強く結びつくと考えます)。ここでは「位置 mm にあるベクトル q\boldsymbol{q} と位置 nn にあるベクトル k\boldsymbol{k} の相性を内積で測る」とだけ理解しておけば十分です。足す方式との違いは、位置の情報を入力に 1 回足すのではなく、内積を取るたびにその直前で掛けることです。

命題 6.2(位置の回転の合成)✓

任意の実数 m,nm, n について、RmR_m は直交行列で、

RmRn=Rm+n,R0=I,RmT=R−m=Rm−1R_m R_n = R_{m+n}, \qquad R_0 = I, \qquad R_m^{\mathsf{T}} = R_{-m} = R_m^{-1}

が成り立つ。

証明(命題 6.2)

補題 3.2 の 2 と 3 を φ=mθ\boldsymbol{\varphi} = m\boldsymbol{\theta}、ψ=nθ\boldsymbol{\psi} = n\boldsymbol{\theta} に使います。RmRn=R[mθ]R[nθ]=R[(m+n)θ]=Rm+nR_m R_n = R[m\boldsymbol{\theta}]R[n\boldsymbol{\theta}] = R[(m+n)\boldsymbol{\theta}] = R_{m+n}、R0=R[0]=IR_0 = R[\boldsymbol{0}] = I、RmT=R[−mθ]=R−mR_m^{\mathsf{T}} = R[-m\boldsymbol{\theta}] = R_{-m}。直交性 RmTRm=IR_m^{\mathsf{T}}R_m = I は 3 で、これと R−mRm=R0=IR_{-m}R_m = R_0 = I、RmR−m=IR_m R_{-m} = I より R−mR_{-m} は RmR_m の逆行列です。

定理 6.3(RoPE の内積は相対位置だけで決まる)✓

q,k∈Rd\boldsymbol{q}, \boldsymbol{k} \in \mathbb{R}^{d}、m,n∈Rm, n \in \mathbb{R} とする。

  1. ⟨Rmq,Rnk⟩=⟨q,Rn−mk⟩\langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle = \langle \boldsymbol{q}, R_{n-m} \boldsymbol{k} \rangle。したがってこの値は q\boldsymbol{q}、k\boldsymbol{k} と相対位置 n−mn - m だけで決まり、任意の実数 ss について ⟨Rm+sq,Rn+sk⟩=⟨Rmq,Rnk⟩\langle R_{m+s} \boldsymbol{q}, R_{n+s} \boldsymbol{k} \rangle = \langle R_m \boldsymbol{q}, R_n \boldsymbol{k} \rangle。
  2. ∥Rmq∥=∥q∥\|R_m \boldsymbol{q}\| = \|\boldsymbol{q}\|。
  3. 第 ii の対を複素数 q^i:=q2i+i q2i+1\hat q_i := q_{2i} + \mathrm{i}\, q_{2i+1}、k^i:=k2i+i k2i+1\hat k_i := k_{2i} + \mathrm{i}\, k_{2i+1} と書くと(i\mathrm{i} は虚数単位)
⟨Rmq,Rnk⟩=Re∑i=0d/2−1q^i k^i‾  ei(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} .
証明(定理 6.3)
  1. 補題 3.2 の 4(1 つ目の式)と 命題 6.2 より
⟨Rmq,Rnk⟩=⟨q,R−mRnk⟩=⟨q,Rn−mk⟩\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

です。右辺に現れるのは q\boldsymbol{q}、k\boldsymbol{k}、n−mn - m だけです。(m,n)(m, n) を (m+s,n+s)(m+s, n+s) に替えても (n+s)−(m+s)=n−m(n+s) - (m+s) = n - m なので値は変わりません。

  1. 補題 3.2 の 4(3 つ目の式)です。

  2. まず 1 つの対について示します。u=(u0,u1)\boldsymbol{u} = (u_0, u_1)、w=(w0,w1)∈R2\boldsymbol{w} = (w_0, w_1) \in \mathbb{R}^2 に対し u^=u0+iu1\hat u = u_0 + \mathrm{i}u_1、w^=w0+iw1\hat w = w_0 + \mathrm{i}w_1 と置くと

u^ w^‾=(u0+iu1)(w0−iw1)=(u0w0+u1w1)+i(u1w0−u0w1)\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)

なので Re(u^ w^‾)=⟨u,w⟩\mathrm{Re}(\hat u\, \overline{\hat w}) = \langle \boldsymbol{u}, \boldsymbol{w}\rangle です。次に、オイラーの公式 eiα=cos⁡α+isin⁡αe^{\mathrm{i}\alpha} = \cos\alpha + \mathrm{i}\sin\alpha(定理 4.2[複素数と複素平面])より

eiα u^=(cos⁡α+isin⁡α)(u0+iu1)=(u0cos⁡α−u1sin⁡α)+i(u0sin⁡α+u1cos⁡α)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)

で、実部と虚部は R(α)uR(\alpha)\boldsymbol{u} の 2 成分です。つまり R(α)uR(\alpha)\boldsymbol{u} に対応する複素数は eiαu^e^{\mathrm{i}\alpha}\hat u です。

したがって第 ii の対の内積への寄与は

Re(eimθiq^i  einθik^i‾)=Re(q^i k^i‾  eimθi einθ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)

です。eiβ‾=cos⁡β−isin⁡β=cos⁡(−β)+isin⁡(−β)=e−iβ\overline{e^{\mathrm{i}\beta}} = \cos\beta - \mathrm{i}\sin\beta = \cos(-\beta) + \mathrm{i}\sin(-\beta) = e^{-\mathrm{i}\beta} で、eiαe−iβe^{\mathrm{i}\alpha}e^{-\mathrm{i}\beta} は「R(α)R(−β)=R(α−β)R(\alpha)R(-\beta) = R(\alpha - \beta) に対応する複素数」なので ei(α−β)e^{\mathrm{i}(\alpha - \beta)} です(補題 3.2 の 1。直接には、積を展開して加法定理を使っても同じです)。α=mθi\alpha = m\theta_i、β=nθi\beta = n\theta_i として eimθi einθi‾=ei(m−n)θie^{\mathrm{i}m\theta_i}\,\overline{e^{\mathrm{i}n\theta_i}} = e^{\mathrm{i}(m-n)\theta_i}。内積は対ごとの内積の和なので、ii について足し、実部を取る操作と和を入れ替えて主張の式を得ます。

なお、証明の 3 は 1 と 2 の言い換えで、各対を複素数とみなして書き直したものです。本筋は 1 と 2 だけで追えるので、複素数に馴染みが無ければ飛ばしても構いません。

1 と 命題 5.1 を比べてください。足す方式では内容と絶対位置の交差項が残りましたが、RoPE では mm と nn が n−mn - m の形でしか現れません。2 は、回してもベクトルの長さが変わらないので、位置の情報を入れることで内容の大きさが乱されないことを言っています。3 は Su らが RoPE を導いた形で([2])、各対を複素数とみなすと「位置 mm では eimθie^{\mathrm{i}m\theta_i} を掛ける」という 1 行の規則になります。

例 6.4(d = 2 の数値例)

d=2d = 2 で、説明のために角度を θ0=π/6\theta_0 = \pi/6 と取ります(定義 6.1 の値 θ0=1\theta_0 = 1 の代わりです。定理 6.3 の証明は θ\boldsymbol{\theta} の値に依りません)。q=(1,2)\boldsymbol{q} = (1, 2)、k=(3,1)\boldsymbol{k} = (3, 1) とします。

(m,n)=(1,3)(m, n) = (1, 3) のとき、R1q=R(π/6)q=(−0.1340, 2.2321)R_1\boldsymbol{q} = R(\pi/6)\boldsymbol{q} = (-0.1340,\ 2.2321)、R3k=R(π/2)k=(−1, 3)R_3\boldsymbol{k} = R(\pi/2)\boldsymbol{k} = (-1,\ 3) で、内積は (−0.1340)×(−1)+2.2321×3≈6.8301(-0.1340)\times(-1) + 2.2321 \times 3 \approx 6.8301 です。

(m,n)=(5,7)(m, n) = (5, 7) のとき、R5q=(−1.8660, −1.2321)R_5\boldsymbol{q} = (-1.8660,\ -1.2321)、R7k=(−2.0981, −2.3660)R_7\boldsymbol{k} = (-2.0981,\ -2.3660) で、内積はやはり 6.83016.8301 です(丸める前の値で計算)。ベクトルはどちらも大きく回っていますが、相対位置がともに 2 なので内積は一致します。

定理 6.3 の 3 で確かめます。q^ k^‾=(1+2i)(3−i)=5+5i\hat q\,\overline{\hat k} = (1 + 2\mathrm{i})(3 - \mathrm{i}) = 5 + 5\mathrm{i}、ei(m−n)θ0=e−iπ/3=12−32ie^{\mathrm{i}(m-n)\theta_0} = e^{-\mathrm{i}\pi/3} = \tfrac12 - \tfrac{\sqrt3}{2}\mathrm{i} なので、実部は 52+532=6.8301\tfrac52 + \tfrac{5\sqrt3}{2} = 6.8301 です。

相対位置を 3 に変えた (m,n)=(1,4)(m, n) = (1, 4) では e−iπ/2=−ie^{-\mathrm{i}\pi/2} = -\mathrm{i} で、Re((5+5i)(−i))=5\mathrm{Re}\big((5 + 5\mathrm{i})(-\mathrm{i})\big) = 5 となり、値が変わります。

R₁qR₃kR₅qR₇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 だけで決まるので、左右で同じになる。

正弦波位置符号化、MkM_k、RoPE を NumPy で実装し、この章の命題を数値で確かめます。乱数種は 0 に固定しています。

# Python 3.12.14, NumPy 2.5.2
import numpy as np
def omegas(d):
return 10000.0 ** (-2.0 * np.arange(d // 2) / d)
def pe(pos, d):
"""正弦波位置符号化。偶数番目が sin、奇数番目が cos。"""
out = np.empty(d)
out[0::2] = np.sin(pos * omegas(d))
out[1::2] = np.cos(pos * omegas(d))
return out
def shift_matrix(k, d):
"""PE(pos + k) = M_k PE(pos) となるブロック対角行列。"""
M = np.zeros((d, d))
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]]
return M
def rope(x, m, thetas):
"""ベクトル x の第 (2i, 2i+1) 成分を角度 m * thetas[i] だけ回す。"""
out = np.empty_like(x)
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]
return out
if __name__ == "__main__":
np.set_printoptions(precision=4, suppress=True)
for pos in range(3):
print("PE(%d) =" % pos, pe(pos, 4))
print("M_1 PE(1) =", shift_matrix(1, 4) @ pe(1, 4))
d = 64
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))
M = shift_matrix(7, d)
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)
thetas = omegas(d)
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(0) = [0. 1. 0. 1.]
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=64d = 64 での最大誤差で、順に 定理 4.2(PE(p+k)=MkPE(p)\mathrm{PE}(p+k) = M_k\mathrm{PE}(p))、M7M_7 の直交性、命題 4.3 のノルムと内積です。6 行目は RoPE で、定理 6.3 の 1(⟨Rmq,Rnk⟩=⟨q,Rn−mk⟩\langle R_m\boldsymbol{q}, R_n\boldsymbol{k}\rangle = \langle \boldsymbol{q}, R_{n-m}\boldsymbol{k}\rangle と、両方の位置を 500 ずらしても値が変わらないこと)と 2(ノルムの保存)の最大誤差です。どれも倍精度の丸め誤差の大きさに収まっています。rope は d×dd \times d の行列を作らず、成分 1 個につき 2 回の乗算と 1 回の加減算(対ごとに 4 回の乗算と 2 回の加減算)で回しているので、計算量は O(d)O(d) です。

この章で用意したのは、(1) トークン id の列を n×dn \times d の行列 XX にする埋め込み、(2) 位置を XX に足す正弦波と学習する表、(3) 内積の直前でクエリとキーを回す RoPE、の 3 つです。次章の自己注意では、XX の行どうしの内積から「どの位置をどれだけ見るか」の重みを作ります。そこで示す同変性の定理は、(2) か (3) のどちらかが無ければモデルが語順を区別できないことを意味します。この章の内容は、その穴を埋める部品です。

演習 9.1易

∣V∣=6|V| = 6、d=3d = 3 とし、トークン列 (2,5,2)(2, 5, 2) の埋め込みを XX(行が x1,x2,x3\boldsymbol{x}_1, \boldsymbol{x}_2, \boldsymbol{x}_3)とする。固定したベクトル u∈R3\boldsymbol{u} \in \mathbb{R}^3 に対して L=⟨x1,u⟩+2⟨x2,u⟩+3⟨x3,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\mathcal{L} の EE についての勾配(6×36 \times 3 の行列)を求めよ。

解答

g(X)=∑ici⟨xi,u⟩g(X) = \sum_i c_i \langle \boldsymbol{x}_i, \boldsymbol{u}\rangle(c=(1,2,3)c = (1, 2, 3))なので ∂g/∂Xij=ciuj\partial g/\partial X_{ij} = c_i u_j です。命題 2.2 の 2 より、第 vv 行の勾配は ∑i:ti=vci uT\sum_{i: t_i = v} c_i\, \boldsymbol{u}^{\mathsf{T}} です。トークン 2 は位置 1 と 3 に現れるので第 2 行は (1+3)uT=4uT(1 + 3)\boldsymbol{u}^{\mathsf{T}} = 4\boldsymbol{u}^{\mathsf{T}}、トークン 5 は位置 2 に現れるので第 5 行は 2uT2\boldsymbol{u}^{\mathsf{T}}、第 1・3・4・6 行は 0 です。

演習 9.2標準

定理 4.2 の MkM_k について、MkMl=Mk+lM_k M_l = M_{k+l} と Mk−1=M−kM_k^{-1} = M_{-k} を示せ。また PE(p)=Mp PE(0)\mathrm{PE}(p) = M_p\, \mathrm{PE}(0) であることと、PE(0)\mathrm{PE}(0) の成分を求めよ。

解答

ω=(ω0,…,ωd/2−1)\boldsymbol{\omega} = (\omega_0, \ldots, \omega_{d/2-1}) と置くと Mk=R[−kω]M_k = R[-k\boldsymbol{\omega}] です。補題 3.2 の 2 より MkMl=R[−kω]R[−lω]=R[−(k+l)ω]=Mk+lM_k M_l = R[-k\boldsymbol{\omega}]R[-l\boldsymbol{\omega}] = R[-(k+l)\boldsymbol{\omega}] = M_{k+l}、M0=R[0]=IM_0 = R[\boldsymbol{0}] = I です。よって MkM−k=M−kMk=M0=IM_k M_{-k} = M_{-k}M_k = M_0 = I で、Mk−1=M−kM_k^{-1} = M_{-k} です。

定理 4.2 で pp を 0、kk を pp に取り替えると PE(p)=Mp PE(0)\mathrm{PE}(p) = M_p\,\mathrm{PE}(0) です。PE(0)2i=sin⁡0=0\mathrm{PE}(0)_{2i} = \sin 0 = 0、PE(0)2i+1=cos⁡0=1\mathrm{PE}(0)_{2i+1} = \cos 0 = 1 なので PE(0)=(0,1,0,1,…,0,1)\mathrm{PE}(0) = (0, 1, 0, 1, \ldots, 0, 1) です。つまり正弦波位置符号化は、1 つのベクトル PE(0)\mathrm{PE}(0) を、位置に比例する角度だけ対ごとに回したものです。

演習 9.3易

d=4d = 4 の正弦波位置符号化で ⟨PE(0),PE(3)⟩\langle \mathrm{PE}(0), \mathrm{PE}(3)\rangle を求めよ(cos⁡3=−0.98999\cos 3 = -0.98999、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 です。ノルムはどちらも d/2=2\sqrt{d/2} = \sqrt2 なので、コサイン類似度は 0.00956/2=0.00480.00956 / 2 = 0.0048 で、2 つのベクトルはほぼ直交しています。速く回る対(ω0\omega_0)がほぼ反対向き、遅く回る対(ω1\omega_1)がほぼ同じ向きで、打ち消し合った結果です。

演習 9.4標準

d=2d = 2、θ0=π/2\theta_0 = \pi/2 の RoPE で、q=(1,0)\boldsymbol{q} = (1, 0)、k=(0,1)\boldsymbol{k} = (0, 1) とする。相対位置 n−mn - m が 11、00、−1-1 のときの ⟨Rmq,Rnk⟩\langle R_m\boldsymbol{q}, R_n\boldsymbol{k}\rangle を求め、RoPE の内積が「前にあるか後ろにあるか」を区別できることを確かめよ。

解答

定理 6.3 の 1 より、値は ⟨q,R((n−m)π/2)k⟩\langle \boldsymbol{q}, R((n-m)\pi/2)\boldsymbol{k}\rangle です。

  • n−m=1n - m = 1: R(π/2)k=(−1,0)R(\pi/2)\boldsymbol{k} = (-1, 0) で、内積は −1-1。
  • n−m=0n - m = 0: R(0)k=(0,1)R(0)\boldsymbol{k} = (0, 1) で、内積は 00。
  • n−m=−1n - m = -1: R(−π/2)k=(1,0)R(-\pi/2)\boldsymbol{k} = (1, 0) で、内積は 11。

相対位置の符号を変えると値が −1-1 から 11 に変わるので、キーがクエリより 1 つ後ろにあるか 1 つ前にあるかが区別できています。命題 4.3 の ⟨PE(p),PE(q)⟩=∑icos⁡(ωi(p−q))\langle \mathrm{PE}(p), \mathrm{PE}(q)\rangle = \sum_i\cos(\omega_i(p - q)) は p−qp - q の符号を変えても同じ値でしたが、RoPE では内容のベクトル q,k\boldsymbol{q}, \boldsymbol{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 — 入力と出力の埋め込みの重み共有。

このテーマの 100 本ノック(50 問)

執筆: Claude Code(Opus 5.5)、Claude Code(Sonnet 5.5)・監査 2 回(Claude Code)・最終 2026-10-12

この記事の誤りを報告する ・運営: 夢現技研合同会社 ・料金 ・利用条件 ・特定商取引法に基づく表記

© 2026 夢現技研合同会社 ・コード例は MIT ライセンスです。