JA EN
体系Transformerの仕組み
·無料·論文·13分で読めます

位置エンコーディングを1から理解する(絶対位置からRoPEまで)

Transformerは素のままでは語順を知らない。なぜ位置情報が要るのかから始めて、sin/cosの絶対位置、学習型、そして現代LLMの標準であるRoPEまでを段階的に解説。「なぜ回転が相対位置を表せるのか」を式で示す。

対象textタスクattention

Attention Is All You Need

一次資料 — この記事の根拠

論文の発表 2017-06-12この解説の公開 2026-08-059年2か月後

Attention Is All You NeedAshish Vaswani, Noam Shazeer, Niki Parmar ほか · 2017-06-12 · v7arXiv:1706.03762論文ページ·PDF
Self-Attention with Relative Position RepresentationsarXiv:1803.02155論文ページ·PDF
RoFormer: Enhanced Transformer with Rotary Position EmbeddingJianlin Su, Yu Lu, Shengfeng Pan ほか · 2021-04-20 · v5arXiv:2104.09864論文ページ·PDF
Train Short"arXiv:2108.12409論文ページ·PDF
https://arxiv.org/abs/2108.12409"Test Long: Attention with Linear Biases Enables Input Length Extrapolation
Extending Context Window of Large Language Models via Positional InterpolationarXiv:2306.15595論文ページ·PDF
原文の要旨(Abstract)を読む

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new simple network architecture, the Transformer, based solely on attention mechanisms, dispensing with recurrence and convolutions entirely. Experiments on two machine translation tasks show these models to be superior in quality while being more parallelizable and requiring significantly less time to train. Our model achieves 28.4 BLEU on the WMT 2014 English-to-German translation task, improving over the existing best results, including ensembles by over 2 BLEU. On the WMT 2014 English-to-French translation task, our model establishes a new single-model state-of-the-art BLEU score of 41.8 after training for 3.5 days on eight GPUs, a small fraction of the training costs of the best models from the literature. We show that the Transformer generalizes well to other tasks by applying it successfully to English constituency parsing both with large and limited training data.

原文の要旨(Abstract)を読む

Position encoding recently has shown effective in the transformer architecture. It enables valuable supervision for dependency modeling between elements at different positions of the sequence. In this paper, we first investigate various methods to integrate positional information into the learning process of transformer-based language models. Then, we propose a novel method named Rotary Position Embedding(RoPE) to effectively leverage the positional information. Specifically, the proposed RoPE encodes the absolute position with a rotation matrix and meanwhile incorporates the explicit relative position dependency in self-attention formulation. Notably, RoPE enables valuable properties, including the flexibility of sequence length, decaying inter-token dependency with increasing relative distances, and the capability of equipping the linear self-attention with relative position encoding. Finally, we evaluate the enhanced transformer with rotary position embedding, also called RoFormer, on various long text classification benchmark datasets. Our experiments show that it consistently overcomes its alternatives. Furthermore, we provide a theoretical analysis to explain some experimental results. RoFormer is already integrated into Huggingface: \url{https://huggingface.co/docs/transformers/model_doc/roformer}.


Transformerは語順を知らない

前回の記事(Attention機構を1から理解する)で見た自己注意は、こういう式でした。

Attention(Q,K,V)=softmax ⁣(QKdk)V\mathrm{Attention}(Q, K, V) = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V

つまり「いま見ている単語の問いかけQQ)が、他の各単語の見出しKK)とどれだけ噛み合うかを全組み合わせで採点し、その点数を合計1の割合に直して、各単語が持つ中身VV)を混ぜ合わせる」という式です。dk\sqrt{d_k} は、次元数 dkd_k が大きいほど点数が大きく振れてしまうのを抑えるための割り算にすぎません。

ここに驚くべき性質が隠れています。入力の単語を並べ替えても、出力は同じ順に並べ替わるだけなのです。

理由は単純です。入力 XX の行を入れ替えると Q,K,VQ, K, V の行も同じように入れ替わり、スコア表 QKQK^\top は行と列が同時に入れ替わり、出力も同じ並べ替えを受けます。つまり「単語 ii の出力」は、その単語が何番目にあったかを一切参照していません。

結果、素のTransformerにとって「犬が猫を追う」と「猫が犬を追う」は区別できません。RNNは左から順に読むので語順が構造的に入っていましたが、全単語を同時に見渡す設計と引き換えに、Transformerは語順を失いました。

比喩を使うなら、円卓で全員が同時に喋っている状態です。誰が何を言ったかはわかるけれど、発言の順序という情報がどこにもない。位置エンコーディングは、この円卓に座席番号を配る仕事です。

素朴な案がなぜ失敗するのか

一番素朴な方法は、単語ベクトルに位置の番号 mm をそのまま足すことです。これは3つの理由で破綻します。

  1. 値が青天井。埋め込みの各成分がだいたい 11-1 \sim 1 の世界に、1000という数字が入ると単語の意味が押し流されます。
  2. 正規化しても駄目m/Lm/L(文長で割る)なら 010 \sim 1 に収まりますが、今度は文の長さによって同じ位置3が違う値になる。位置3は何単語の文だろうと位置3であってほしい。
  3. 1つの数では足りない。意味は数百次元で表すのに位置だけ1次元では、モデルが位置を使い分ける余地がありません。

欲しいのは「有界で、位置ごとに一意で、文長に依存しない、多次元の」表現です。

絶対位置 その1: sin/cosの目盛り

Vaswani らの原論文が採用したのが、三角関数を使う方法です。位置 pospos、次元 ii に対して次のベクトルを作り、単語の埋め込みに足します

PE(pos,2i)=sin ⁣(pos100002i/d),PE(pos,2i+1)=cos ⁣(pos100002i/d)PE_{(pos,\,2i)} = \sin\!\left(\frac{pos}{10000^{2i/d}}\right), \qquad PE_{(pos,\,2i+1)} = \cos\!\left(\frac{pos}{10000^{2i/d}}\right)

つまり「何番目の単語か(pospos)を 100002i/d10000^{2i/d} で割ってから角度として読み、その sin と cos を並べる」ということ。ii は何組目の目盛りかを表し、割る数が大きい成分ほど、位置が1つ進んだときの値の動きが小さくなります。

dd は埋め込みの次元数です。式は物々しいですが、やっていることは周波数の違う時計の針を何本も並べることだけです。

次元のペアを1本の針だと思ってください。i=0i=0 のペアが一番速く回る針。ii が大きくなるほど分母 100002i/d10000^{2i/d} が大きくなり、針はゆっくり回ります。原論文の通り、波長は 2π2\pi から 100002π10000 \cdot 2\pi までの等比数列を成します。

これは二進カウンタの連続版だと考えると腑に落ちます。二進数では最下位ビットが毎回反転し、次は2回に1回、その次は4回に1回反転する。全ビットを読めば数が一意に決まる。sin/cos版も同じで、速い針と遅い針を全部読めば位置が一意に決まる。各成分は 11-1 \sim 1 に収まるので、素朴案の破綻理由1と2も同時に解決しています。

そして原論文は、この関数を選んだ理由をこう書いています。「任意の固定オフセット kk に対して、PEpos+kPE_{pos+k}PEposPE_{pos} の線形関数として表せるため、モデルが相対位置による注意を学習しやすいと仮説を立てた」。

この一文が、後のRoPEの種になります。実際、1本の針(周波数 ω\omega のペア)だけを取り出すと、

(sinω(pos+k)cosω(pos+k))=(cosωksinωksinωkcosωk)(sinωposcosωpos)\begin{pmatrix} \sin\omega(pos+k) \\ \cos\omega(pos+k) \end{pmatrix} = \begin{pmatrix} \cos\omega k & \sin\omega k \\ -\sin\omega k & \cos\omega k \end{pmatrix} \begin{pmatrix} \sin\omega\,pos \\ \cos\omega\,pos \end{pmatrix}

左端の縦2つ組は位置 pos+kpos+k での針の位置、右端の縦2つ組はいまの位置 pospos での針の位置、その間に挟まった行列は「角度 ωk\omega k だけ回す」という操作です。つまり、いくつ先へ進むか(kk)さえ決まれば回す量も決まり、元がどの位置だったかには一切よらないということ。

kk 個先に進むこと = 決まった角度だけ回すこと、という関係です。回転が出てきました。

絶対位置 その2: 位置ベクトルを学習する

もっと単純な方法もあります。位置ごとに1本ずつベクトルを用意して、他の重みと一緒に学習させる。位置0用のベクトル、位置1用のベクトル……という単なる参照表です。BERTやGPT-2はこの方式でした。

原論文はこの2つを比較し、性能はほぼ同等だったと報告しています(Table 3, 行E)。それでも sin/cos を選んだ理由として挙げているのが、学習時より長い系列への外挿ができるかもしれない、という点です。

学習型の弱点はここに直結します。表にない位置は存在しない。最大512位置で学習したモデルに513番目の単語を入れても、参照するベクトルがありません。設定した最大長がそのままモデルの上限になります。

発想の転換: 足すのをやめて「回す」

ここまでの方式には共通の性質があります。位置情報を単語ベクトルに足していること。入力の時点で「意味」と「位置」を1本のベクトルに混ぜ込み、あとは注意機構がほどいてくれることを期待する設計です。

RoPE(Rotary Position Embedding、Su らの RoFormer)は違います。足さない。QueryとKeyを、位置に比例した角度だけ回転させる

2次元で考えます。位置 mm にあるQueryベクトル qq を、角度 mθm\theta だけ回します。

q~m=R(mθ)q,R(ϕ)=(cosϕsinϕsinϕcosϕ)\tilde{q}_m = R(m\theta)\, q, \qquad R(\phi) = \begin{pmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{pmatrix}

要するに「位置 mm にある単語の問いかけベクトル qq を、mm に比例した角度だけくるりと回す」だけの操作です。R(ϕ)R(\phi) は平面上のベクトルを角度 ϕ\phi 回す行列で、向きは変えても長さは変えません

位置 nn のKeyも同様に k~n=R(nθ)k\tilde{k}_n = R(n\theta)\, k とします。ここで注意機構が計算するもの——2つの内積を取ってみます。

q~mk~n=(R(mθ)q)R(nθ)k=qR(mθ)R(nθ)k=qR((nm)θ)k\tilde{q}_m^\top \tilde{k}_n = \left(R(m\theta)q\right)^\top R(n\theta)k = q^\top R(m\theta)^\top R(n\theta) k = q^\top R\big((n-m)\theta\big)\, k

つまり「位置 mm で回した問いかけと、位置 nn で回した見出しの噛み合い具合」は、「回す前の qqkk を、nmn-m 単語ぶんの角度だけずらして測ったもの」とまったく同じ値になる、ということです。

回転行列の2つの性質、R(ϕ)=R(ϕ)R(\phi)^\top = R(-\phi)R(a)R(b)=R(a+b)R(a)R(b) = R(a+b) を使っただけです。

結果を見てください。左辺は絶対位置 mmnn で作ったのに、右辺には nmn-m しか残っていません。絶対位置で回したのに、注意スコアには相対位置だけが効く。これがRoPEの核心です。

直感的には、内積は「2本のベクトルの角度差」を測る量AIのための線形代数のコサイン類似度そのもの)なので、両方を同じ規則で回せば絶対量は打ち消し合い、差だけが残ります。時計の長針と短針の角度差が、時計ごと傾けても変わらないのと同じです。

自分の手で確かめてください。片方の矢印だけ回すと内積は動きます。しかし2本を同じ角度だけ回すと内積は変わりません。RoPEの仕掛けはこの不変性そのものです。

FIG 12本の矢印を回して内積とコサインを見る。片方だけ回すと値は動くが、2本を同じ角度だけ回すと内積は不変 ── この「同じだけ回しても差は残る」がRoPEの全て

実際の埋め込みは2次元ではないので、dd 次元を d/2d/2 組のペアに分け、ペアごとに違う角度 θi=100002i/d\theta_i = 10000^{-2i/d} で回します。sin/cos方式と同じ周波数の梯子を、足す代わりに回すのに使っている、と見ると系譜がつながります。

Su らはさらに、この構成では内積の上界が相対距離とともに減衰する(遠い単語ほど影響が小さくなりやすい)という性質も示しています。

コードで書くRoPE

import numpy as np

def rope(x, base=10000.0):
    """x: (seq_len, d)、d は偶数。Q と K に適用する(V には適用しない)"""
    seq_len, d = x.shape
    pos = np.arange(seq_len)[:, None]        # (seq, 1)
    i = np.arange(d // 2)[None, :]           # (1, d/2)
    theta = base ** (-2.0 * i / d)           # 周波数の梯子(sin/cos方式と同じ)
    ang = pos * theta                        # (seq, d/2) 各ペアの回転角

    cos, sin = np.cos(ang), np.sin(ang)
    xe, xo = x[:, 0::2], x[:, 1::2]          # ペアの片割れずつ
    out = np.empty_like(x)
    out[:, 0::2] = xe * cos - xo * sin       # 2次元回転そのもの
    out[:, 1::2] = xe * sin + xo * cos
    return out

# 使い方: スコア計算の直前で Q と K を回す
Q, K, V = rope(X @ W_q), rope(X @ W_k), X @ W_v
scores = Q @ K.T / np.sqrt(Q.shape[-1])      # 相対位置だけが効く

上の等式から、位置(2, 5)の組と位置(100, 103)の組は厳密に同じスコアになります(浮動小数の誤差を除く)。距離が同じなら文のどこにあっても同じ。実装上の要点は3つ。

相対位置の別解: バイアスを足す系

RoPEだけが答えではありません。歴史的には Shaw らが、KeyとValueに学習済みの相対位置ベクトルを加える方式を先に提案し、T5はヘッドごとに学習したスカラーを注意スコアに足す軽量版を採用しました。さらに割り切ったALiBi(Press ら)は位置埋め込みを持たず、注意スコアから距離に比例したペナルティ mijm \cdot |i-j| を引くだけで、短い系列で学習して長い系列に外挿できることを示しています。

長いコンテキストへどう伸ばすか

RoPEにも上限はあります。4Kトークンで学習したモデルに32Kを入れると、学習時に見たことのない大きな回転角が現れて性能が崩れます。対処法は2系統です。

つまり「コンテキスト長を伸ばした」という話の中身は、たいてい回転角の刻み方を調整したという話です。

現場ではこう使う

1. どれを使うか迷ったらRoPE。 2026年時点で、LLaMA系・Qwen・Mistral・Gemmaなど主要なオープンLLMはRoPEを採用しています。新しくデコーダ型を組むならRoPEが既定値。学習型の絶対位置に出会うのは、たいていエンコーダ型(BERT系)を触るときです。

2. 実装の「ペアの取り方」が2流派ある。 原論文の式は隣り合う次元をペアにします(0-1, 2-3, ...)が、多くの実装は前半と後半をペアにします(0-(d/2), 1-(d/2+1), ...)。次元の並べ替えを揃えれば数学的には等価ですが、混在させると静かに壊れます。重みを別実装へ移植して「なんとなく出力が変」なら、まずここを疑ってください。

3. cos/sin は float32 で計算する。 位置が数万になると角度が大きくなり、bfloat16のまま三角関数を通すと精度が落ちます。多くの実装が位置テーブルだけfloat32で持つのはこのためです。

4. KVキャッシュには回転後のKが入っている。 格納済みのKは「その位置で回された状態」なので、キャッシュの一部を捨てて詰め直す最適化をすると、残ったトークンの位置が実質ずれます。長文推論の自作最適化で事故りやすい点です。

5. 「context 128K対応」の読み方。 その長さで一から学習したのか、後から伸ばしたのかで実力は変わります。伸ばした場合は公称長の後半で精度が落ちることがあるので、公称値を信じず自分のタスクで実測してください。

まとめ

位置エンコーディングが最初に現れた場所を読みたくなったら、原論文の解説(Attention Is All You Need を読む)へ。3.5節の短い記述が、この記事全体の出発点です。

参考文献

  1. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit et al.. (2017-06-12) Attention Is All You Need. arXiv:1706.03762論文ページ·PDF
  2. Self-Attention with Relative Position Representations. arXiv:1803.02155論文ページ·PDF
  3. Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha et al.. (2021-04-20) RoFormer: Enhanced Transformer with Rotary Position Embedding. arXiv:2104.09864論文ページ·PDF
  4. Train Short. "arXiv:2108.12409論文ページ·PDF
  5. https://arxiv.org/abs/2108.12409". Test Long: Attention with Linear Biases Enables Input Length Extrapolation
  6. Extending Context Window of Large Language Models via Positional Interpolation. arXiv:2306.15595論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

コメント

コメントにはログインが必要です