Transformerで使われているPositional EncodingであるSinusoidal Positional Encodingについて徹底的に解説して
さらに、そこから相対位置エンコーディングへの橋渡しをこの記事では行う。
なるべく直感的に、なぜこのような手法がとられるのか、なぜうまくいくのか、現時点での僕ができうる限り解説する。
この記事を読めばInput Embeddingがどういう気持ちで何をやっているのかがわかることと思う。
必要な前提知識は三角関数だけである。(線形代数のくだりもあるがさして重要な話ではないので大丈夫)
Positional Encodingの概念
Positional Encodingの基本理論
Positional Encodingは、Transformerにおいて重要な役割を果たす概念である。Transformerでは、文章や言葉をコンピュータが理解し処理するために、これらの言葉を数値の形、すなわちベクトルに変換する必要がある。この変換プロセスを「埋め込み(embedding)」と呼ぶ。しかし、埋め込みだけでは、単語の並び順や位置関係が失われてしまう。これは、文章の意味を正確に理解する上で大きな問題となる。例えば、「犬が猫を追いかける」と「猫が犬を追いかける」では意味が全く異なるが、単語の埋め込みだけではこの違いをTransformerのAttentionは区別できない。
ここでPositional Encodingが重要になる。この技術は、各単語の位置情報を埋め込みベクトルに追加することで、単語の順序を保持する。これにより、モデルは単語の並び順や文脈を理解し、文章の意味をより正確に把握できるようになる。
Positional Encodingにはいくつかの方法があるが、Transformerモデルでよく知られているのは、「Attention is all you need」(Vaswani et al, 2017)で紹介されている「Sinusoidal Positional Encoding」である。これは、各位置に対してサイン波やコサイン波の関数を使用して数値を生成し、これを元の埋め込みベクトルに加算する。この方法では、位置の情報が周期的な波形で表現され、モデルが長い範囲の依存関係を学習しやすくなる。
このPositional Encodingの導入により、NLPモデルは文の構造をより深く理解し、より複雑な自然言語のタスクを効果的に処理できるようになる。文章の意味解釈や機械翻訳など、多くの応用分野でこの技術が不可欠となっている。
Sinusoidal Positional Encodingの定義
Sinusoidal Positional Encodingは、Transformerにおいて単語の位置情報を表現するために用いられる埋め込みベクトルに絶対位置を付与する手法である。この方法では、各位置(pos)に対して特定の数学的関数を用いて位置情報をベクトルとして表現する。具体的には、サイン関数(\(\sin\))とコサイン関数(\(\cos\))が使用される。
トークン列中のpos番目の位置に対応する\(d_{\text{model}}\)次元の位置符号(PE)は、以下の式で計算される。ここで、\(d_{\text{model}}\)はモデルの埋め込みベクトルの次元を示す。\(i \in\left\{0,1,2, \ldots, \frac{d_{\text {model }}}{2}-1\right\}\)で、PEの\(j\)番目の要素を\(PE(\text{pos}, j)\)と表現する。
$$
\begin{aligned}
P E(\operatorname{pos}, 2 i) & =\sin \left(\frac{\operatorname{pos}}{10000^{2 i / d_{\text {model }}}}\right) \\
P E(\operatorname{pos}, 2 i+1) & =\cos \left(\frac{\operatorname{pos}}{10000^{2 i / d_{\text {model }}}}\right)
\end{aligned}
$$
この式により、位置posに対して一意のベクトルが生成される。ベクトルの各要素は、サイン関数とコサイン関数を用いて異なる周波数で変化する。このことにより、モデルは位置の情報を効果的に捉えることができる。
ベクトルで表現すると、PE(pos)は次のようになる。
このようにして、Sinusoidal Positional Encodingは単語の位置を数学的に表現し、モデルが文章の中で単語の順序を把握するのを助ける。これにより、文章の意味をより深く理解することが可能になる。
単語埋め込みが\(\sqrt{d_{model}}\)倍されているのは、位置符号のL2ノルムが\(\sqrt{\frac{d_{model}}{2}}\)となるので、スケールを揃えるために入力トークン埋め込みを\(\sqrt{d_{model}}\)倍している。
イメージ
埋め込みが行われ、語をWord2Vecで変換した後の\(d_{model}\)次元の空間にベクトルとして表現されたとする。
そしてSuidoidal Positional Encodingとは入力の内容に関わらず、その単語の系列の順番のみに従う小さいベクトルを付与されるイメージである。
なんでSin関数とCos関数を交互につかうの?
さて、なぜSinusoidal Positional EncodingではSin関数とCos関数を交互に使うのか段階的に考えていく。
そもそもどのような関数が位置情報を付与するのに適しているのだろうか?
真っ先に考えられるのはそのまま順番を加えることである。一番目だったら(\(1,1,\cdots,1\))、二番目であれば(\(2,2,\cdots,2\)),、、、
しかし、それだと順番に比例して付与する位置を示すベクトルが大きくなっていく。
大きくなりすぎると、そもそものWord2Vecで得た意味を失ってしまう。
つまり、Suisoidal Positional Encodingに必要なのは順番に関わらず大きさが変わらないことである。
されど、順番が変化しても、付与するベクトルが変わらないのは意味がない。入力するシーケンス長がどれだけ伸びても発散せずに、しかし値は絶えず変化するようなもの。。。
というわけで、周期関数であるsinやcosに白羽の矢が立つわけである。
sinを使うことでその値を-1から1の間に制限できる。
しかし、周期関数なので定期的に同じ値が返されてしまう。
そこで、文章量が多くなっても同じ値が繰り返されないほど低い周波数を与えたらいい感じなのではないだろうか?
だが、周波数を低くしたことによる弊害が発生する。それは勾配が小さいところでは低周波ゆえに順番が変わってもほとんど数値が変化しない区間があるということである。
そこでcosを組み合わせるのである。
こうすることでシーケンスのどの順番にあってもほかの位置情報とは異なるベクトルを手に入れることができるのである。
Multi-Head Attentionとの関係
TransformerモデルのMulti-Head Attention機構は、内積を取ることで単語間の関連性を評価する。Sin関数とCos関数を用いたPositional Encodingは、内積計算時に自然に相対位置の近さを表現できる可能性を持っている。これは、二つの異なる位置に対するSinusoidal Positional Encodingベクトルの内積が、それらの位置の差(相対位置)に関連する値になるためである。この性質により、Attention機構は単語の絶対位置だけでなく、単語間の相対的な距離感も考慮に入れることができる。
「Attention is all you need」論文においては、Sin関数とCos関数を用いることが効果的であると述べられている。
"We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, \(PE_{pos +k}\)can be represented as a linear function of \(PE_{POS}\)."
Attention is all you need [Vaswani 2017]
ただ、この論文で報告されているのは、学習不要のSinusoidal Positional Encodingの代わりにパラメータを用意して1から学習させた場合と性能が劣らないということだけである。
Sinusoidal Positional Encodingの相対位置の可能性
さて、どういうことか
TransformerにおけるMulti-Head Attentionの内部のScaled Dot-Product Attentionでは、
$$
\operatorname{softmax}\left(\frac{Q K^\top}{\sqrt{d_k}}\right) \boldsymbol{V}
$$
これを計算するのであり、この中の\(Q K^\top\)という内積の計算が単語間の類似度を測っている重要な部分である。
Multi-Head AttentionとScaled Dot-Product Attentionの全て:Transformerの核心を徹底解説
この記事では、Transformerの中心的な役割を果たすMulti-Head Attentionについて解説する。 Transformerのほかの機構の詳細な解説はせず、完全にMult ...
続きを見る
このQ,Kの作り方は
そしてMulti-head AttentionではヘッドにQ,Kに分割するのでさらに次のように分割する。
なので\(Q_i'K_i'^\top\)は
$$
Q_i'K_i'^\top = X W_Q W_i^Q W_i^{V\top} W_V^\top X^\top
$$
と書くことができ、この\(W_Q W_i^Q W_i^{V\top} W_V^\top\)のところは線形変換の連続なので、一つの\(W\)にまとめることができる(\(2 \times 3 \times 3 \times 2 = 2 \times 9 \times 2\)と書けることと同じ)
ここで改めて、\(X\)を
$$
X=\left(\begin{array}{c}
X_1+P E(1) \\
X_2+P E(2) \\
\vdots \\
X_n+P E(n)
\end{array}\right)
$$
と書くことにする。
先ほど、丁寧に線形変換行列を変形したところ大変恐縮だが、一旦\(W\)を無視する。
すると、内積後の行列の\(t\)行\(t'\)列目の要素は\(t\)番目のトークンと\(t'\)番目のトークンの関係を表している。ここを計算すると\((X_t + PE(t))(X_{t'} + PE(t'))\)となる。
$$
(X_t + PE(t))(X_t' + PE(t')) = X_t X_{t'} +X_t PE(t') + X_{t'} PE(t) + PE(t)PE(t')
$$
第一項目は位置を考慮しない、そのままの単語同士の類似度を測っている。
第二項目と第三項目は分からない。相対関係を示していると捉えれなくもない。
第四項目については加法定理より
$$
\begin{aligned}
PE(t)\cdot PE(t') &= \sin(t) \sin(t') + \cos(t) \cos(t')\\
&\quad +\sin(\frac{t}{10000^{2 / d_{model}}})\sin(\frac{t'}{10000^{2 / d_{model}}})\\
& \qquad +\cos(\frac{t}{10000^{2 / d_{model}}})\cos(\frac{t'}{10000^{2 / d_{model}}})\\
& \cdots\\
& \quad +\sin(\frac{t}{10000^{d_{model} -2 / d_{model}}})\sin(\frac{t'}{10000^{d_{model} -2 / d_{model}}})\\
& \qquad +\cos(\frac{t}{10000^{d_{model} -2 / d_{model}}})\cos(\frac{t'}{10000^{d_{model} -2 / d_{model}}})\\
&=\sum_i^{d_{model} / 2-1} \cos \left(\frac{1}{10000^{2 i /d_{model}}}\left(t-t^{\prime}\right)\right)
\end{aligned}
$$
となる。これにより位置\(t\)と位置\(t'\)の位置埋め込みの内積は、上記のように\(t\)と\(t'\)の位相差で表現される。
これによってSinusoidai Position Encodingには絶対位置表現であるが、相対位置の近さを表現できる可能性がある。
この間にある線形変換行列のパラメータがこの内積計算後の四つの項につくことになる。このパラメータは学習可能パラメータなので、相対位置が重要な単語間では四つ目の項が強調されるように学習されることが期待される。
Positional Encodingを可視化
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
x_,y_ = np.arange(0,501,1), np.arange(0,501,1)
x, y = np.meshgrid(x_,y_)
z = np.sin(y/10000**(x/500))
plt.pcolormesh(x, y, z,cmap='viridis')
plt.colorbar()
plt.show()
上記のコードを実行すると
上記のコードと得られた画像は、Sinusoidal Positional Encodingの原理を簡易的に視覚化したものである。ここでは、位相と周波数の概念がどのように利用されているかを説明する。
画像は、500x500のグリッド上でサイン関数の値を色で表現している。横軸(x軸)がモデルの埋め込み次元(\(d_{\text{model}}\))を、縦軸(y軸)がトークン列の位置(pos)を表していると考えることができる。
このコードでは、各位置pos
に対して、\(\sin\)関数を用いて値を計算している。\(\sin\)関数は周期的な関数であり、位相が変化すると波形の開始点が変わる。ここでの位相は、サイン関数によって生成される波形の位置を指している。画像の各行(y軸に沿って)は、特定のpos
でのサイン波の位相を表しており、左から右へ移動するにつれて位相が変化していく様子を示している。
周波数は、単位時間あたりの波の繰り返し回数を表す。この画像では、周波数は\(x\)軸に沿って変化しており、\(10000^{x/500}\)という式によって調整されている。これは、埋め込み次元が大きくなるにつれて周波数が幾何級数的に減少することを意味する。画像の左側では波が密に見え、これは周波数が高いことを示している。逆に右側に行くほど波の間隔が広がり、周波数が低くなる。これにより、モデルは小さな位置の変化に対しても敏感になり、位置の情報を捉えることができる。
画像の色の変化は、サイン関数の値の変化を表しており、青から黄色への変化はサイン関数の値が-1から1まで変化することを示している。この周期的なパターンは、Transformerモデルが長い文章の中で、単語の位置情報を捉えるのに役立つ。
横方向の行が単語ごとの位置を示すベクトルを色付けして可視化したものであるが、このことからSinusoidal Positional Encodingによる位置情報の付与は商品にバーコードを付けて管理するようなものだとイメージするのがいいと思う。
Sinusoidal Positional Encodingの利点
絶対的位置表現のメリット
Sinusoidal Positional Encodingは、各トークンの絶対位置情報をエンコードする手法であり、この絶対的位置表現は多くのメリットを持つ。
- シーケンスの長さに依存しない: 絶対的位置表現は、シーケンスの長さが変動しても一定のパターンで位置を表現できる。これにより、異なる長さのデータを扱う際にモデルの再学習が不要となり、汎用性が高まる。
- 学習の必要がない: 絶対的位置情報は学習を介さずに予め決定できるため、モデルの学習がより速く、効率的に行える。また、学習パラメータが少ないため、過学習のリスクも低減される。
- シーケンス内での位置関係の明確化: 各トークンに固有の位置情報が付与されるため、モデルは文脈をより正確に把握できる。これは、特に文章理解や機械翻訳などのタスクにおいて、精度の向上に寄与する。
- 並列計算の容易さ: 絶対位置情報はトークンごとに独立して計算できるため、計算処理を並列化しやすく、大規模なデータセットに対しても効率的に処理を行える。
- 長距離依存関係の捉えやすさ: Sinusoidal Positional Encodingは、長いシーケンスにおける遠距離間の依存関係を捉える能力に優れている。これは、Transformerモデルが全体的な文脈を理解する上で重要である。
Sinusoidal Positional Encodingによる絶対的位置表現は、これらの利点により、Transformerモデルの性能を大きく向上させる重要な要素である。各トークンがその絶対位置を持つことで、モデルは単語の意味のみならず、その配置や文脈における役割をより適切に解釈することができるようになる。
モデルへの統合容易性
Sinusoidal Positional Encodingのもう一つの大きな利点は、モデルへの統合の容易さである。これは、以下のような特性により実現される。
- 事前計算可能: Positional Encodingはトークンの位置に基づいて事前に計算することができるため、学習プロセス中に計算するオーバーヘッドがない。この計算は一度だけ行われ、エンコードされたベクトルは必要に応じてモデルに入力される。
- 加算による統合: トークンの埋め込みベクトルとPositional Encodingベクトルは単純に加算することで統合される。この操作は非常に単純であり、新たなパラメータを導入することなく実装できる。
- パラメータの非依存性: 学習パラメータに依存しないため、モデルの他の部分とは独立して機能し、統合が容易である。また、既存のモデルに後から追加することも可能である。
- スケーラビリティ: シーケンスの長さに対してスケーラブルであり、異なるサイズのデータに対して同じエンコーディング手法を適用できる。これにより、モデルを様々なタスクやデータセットに容易に適用することが可能となる。
- 互換性: Sinusoidal Positional Encodingは、Transformerモデルだけでなく、他の種類のシーケンスモデルにも適用可能である。これにより、異なるアーキテクチャ間での知識の移転が容易になる。
これらの点から、Sinusoidal Positional EncodingはTransformerを含む様々なモデルにとって、統合が容易であり、計算効率が良く、シーケンスデータを扱う際の汎用性が高いと言える。モデルが複雑化することなく、位置情報を効果的に組み込むことができるのである。
相対位置(Relative Positional Encoding)による位置符号化
世の中のデータでは絶対的な位置よりも相対的な位置の情報が重要な場合は多い。
系列データにおいて相対位置の把握が絶対位置の把握よりも重要になるケースは多岐にわたる。以下はそのような例である。
相対位置の把握が有利になる可能性があるもの
- 言語理解: 言語においては、単語や句の意味はその絶対的な位置よりも文脈内での相対的な位置によって大きく影響を受ける。例えば、代名詞「彼」の参照先は、文内の相対的な位置関係によって決定される。
- 対話システム: 対話においては、応答の生成が前の発言との相対的な位置に依存する。前の発言から一定距離内にある情報が応答にとって重要となることが多い。
- 機械翻訳: 翻訳においては、文法構造や意味の正確な伝達は単語間の相対的な位置関係に強く依存する。文の構造は言語間で異なるため、相対位置が重要な指標となる。
- 音声認識: 音声データにおいては、音素や単語の発音が前後の音素の相対的な位置関係によって変わることがある。これを正確に捉えることは音声の理解に不可欠である。
- 生物情報処理: 生物学的な系列データ、特にDNAシーケンスやタンパク質の構造において、特定の配列の機能はその配列が相対的に位置するコンテキストによって決まることがある。
- プログラミング言語の処理: コード理解や自動生成において、変数のスコープや関数の呼び出しは、コード内での相対的な位置に基づいて理解される。
- 音楽生成: 音楽の構造において、旋律や和音の進行は前後の音符との相対的な位置関係に依存する。[ Cheng-Zhi Anna Huang2018]
- 画像認識:物体検出やシーン解析において、異なるオブジェクトや要素が画像内でどのように配置されているか、つまりそれらが互いにどのような相対的な位置関係にあるかが重要。顔の相貌認識など。
これらのケースにおいては、絶対位置よりもトークン間の相対的な距離や順序が情報の解釈に直接的に影響を与えるため、相対位置エンコーディングの方が有効であると考えられる。
Sinusoidal Positional Encodingは先ほど少し議論したが、可能性として相対位置を感じ取る能力があるのだったが、あくまで可能性であり、完璧とは言えないものだった。
それはなぜか?
それはひとえに、位置符号をTransformerブロックに入る前に加えるからである。
Xに加算してしまったうえで、Multi-Head Attentionの計算をしていくので、相対位置を把握する上で余計なものが混ざってしまう。
相対位置エンコーディング(Relative Positional Encoding)
Multi-Head Attentionにおいて重要な部分は内積の計算でその結果出てくる\(n \times n\)(\(n\)はシーケンス長)の正方行列である。
発想としてはとてもシンプルで、\(Q K^\top\)の計算をした後にそれぞれの単語間の距離に応じた関係性の調節値を要素に持つ行列\(S^{rel}\)を足してあげればいい。
行列\(Q K^\top\)は、すべてのトークンの組み合わせ\((i,j)\)について、「トークン\(i\)とトークン\(j\)への関係の強さ」を表すものであった。
そこに、すべてのトークン\(i\)について「トークン\(i\)と、そこからの距離に基づいて決定される\(Q K^\top\)の補正値」を持つ\(S^{rel}\)を加える。
つまり、単語によってもこの補正の値は異なる。「『吾輩』から距離1の補正値」と「『猫』から距離1の補正値」は異なるのである。
この\(S^{rel}\)はMulti-Head Attention内部に持つ学習可能な距離embedding行列とQを掛け合わせて得られる。詳しくわかりやすい記事はこちらを参照されたし。
https://qiita.com/masaki_kitayama/items/01a214c07b2efa8aed1b
学習可能なので、パラメータ数が増えてしまうという若干の弱点がある。
補足
相対位置エンコーディングはShawら(2018)によってはじめて提案され、その後アルゴリズムを効率化したChengら(2018)による改良がなされた。
ここで言っている相対位置エンコーディングは後者のものである。
Transformerが実際に使われているところでは、学習可能なPositional Encodingを使われていることが多い。実際Chat-GPTで使われているGPTシリーズでは学習可能な位置符号化が用いられている。
まとめ
この記事では、特にSinusoidal Positional Encodingについて解説を行った。
TransformerとMulti-Head Attentionの解説記事と併せて読むことで理解が深まると思うので、ぜひこちらの記事たちも読んでほしい。
Transformerとは?世界を変えた深層学習モデルの仕組みをわかりやすく徹底解説
近年のAI技術の急激な発展には「Transformer」という深層学習モデルの存在が大きく関わっている。 この記事では、そのTrasformerについてその仕組みとそれがなぜ組み込まれているかを画像を ...
続きを見る
参考先
- BERT Rediscovers the Classical NLP Pipeline[2019][Ian Tenney,Dipanjan Das,Ellie Pavlick]
- Attention is all you need[2017][Vaswani et al.]
- What Does BERT Learn about the Structure of Language?[2019][Genesh Jawahar, Benoit Sagot,Djame,Seddah]
- Approximation and Estimation ability of Transformers for Sequence-to-Sequence Functions with Infinite Dimensional Input[2023][Shokichi Takakura,Taiji Suzuki]
- A Comprehensive Survey on Application of Transformers for Deep Learning Tasks[2023][Saidul Islam et al.]
- Transformer models: an introduction and catalog[2023][Xavier Amatriain]
- Self-Attention with Relative Position Representations[2018][Peter Shaw, Jakob Uszkoreit, Ashish Vaswani]
- Music Transformer[2018][Cheng-Zhi Anna Huang et al.]
- Linearized Relative Positional Encoding[2023][Zhen Qin et al.]
- ON THE RELATIONSHIP BETWEEN SELF-ATTENTION AND CONVOLUTIONAL LAYERS[2019][Jean-Baptiste Cordonnier et al.]