OMOGANEYA Technical Academy 〜 重金屋 技術塾 〜

技術アカデミー

【人工知能・機械学習|LLM | Transformer】2. 入力トークン埋め込みと位置符号

Transformerで文章を処理するためには、文章をトークンに分割したうえで、それぞれのトークンを数値で構成されたベクトルに変換する必要がある。

ただし、トークンをベクトルに変換しただけでは、そのトークンがトークン列内のどの位置にあるのかを表現できない。

そこでTransformerでは、トークンを表す入力トークン埋め込みに、トークン列内の位置を表す位置符号を加算してモデルへ入力する。

本項では、Transformerへ入力されるベクトルがどのように構成されるのか、入力トークン埋め込みと位置符号に分けて説明する。

Transformerの構成と本記事の対象

Transformerには、エンコーダのみを使用する構成、エンコーダとデコーダを組み合わせる構成、デコーダのみを使用する構成がある。

図2-1では、エンコーダに入力されるトークン列が、入力トークン埋め込みと位置符号によって入力ベクトル列へ変換され、複数のエンコーダブロックで処理される流れを示している。

エンコーダ・デコーダ構成では、入力側のトークン列がエンコーダへ入力される一方、出力側のトークン列はデコーダへ入力される。

エンコーダ側とデコーダ側の両方で、トークン埋め込みをD\sqrt{D} 倍した後に位置符号を加算する。
ただし、デコーダへ入力される出力側のトークン列は、各位置において次のトークンを予測できるように、1位置ずらして入力される。

また、デコーダはエンコーダから出力された表現も受け取り、入力側のトークン列を参照しながら出力を生成する。

デコーダのみを使用する構成では、エンコーダは使用されない。
入力されたトークン列をトークン埋め込みへ変換し、位置を表す情報を加えたうえで、デコーダブロックによって次のトークンを順番に予測する。

なお、位置情報の与え方は、すべてのTransformerで同一ではない。
本項で説明する正弦関数と余弦関数による位置符号は、Transformerで使用される方法の一つである。

モデルによっては、学習によって値を更新する位置埋め込みなど、異なる方法が使用される。

図2-1 Transformerエンコーダにおける入力トークン埋め込みと位置符号

図2-1  Transformerエンコーダにおける入力トークン埋め込みと位置符号

ベクトルと次元

入力トークン埋め込みと位置符号は、いずれも複数の数値を並べたベクトルとして表される。

例えば、次のベクトルは4個の数値で構成されているため、4次元のベクトルである。

[0.20.70.10.4](2-1)\begin{bmatrix} 0.2 & 0.7 & -0.1 & 0.4 \end{bmatrix} \tag{2-1}


Transformerでは、このようなベクトルを使用して各トークンを表現する。

ベクトルを構成する数値の個数を、本項では DD と表す。したがって、DD 次元のベクトルには、DD 個の数値が含まれる。

入力トークン埋め込み

Transformerでは、語彙 VV に含まれる各トークンに対して、DD 次元の入力トークン埋め込みを用意する。

トークン ω\omega に対応する入力トークン埋め込みを、次のように表す。

𝒆ωD\boldsymbol{e}_{\omega} \in \mathbb{R}^{D}



D\mathbb{R}^{D} は、実数を要素とする DD 次元のベクトルであることを表している。

長さ nn の入力トークン列を、次のように表す。

(ω0,ω1,,ωn1)(2-3)\left( \omega_0, \omega_1, \ldots, \omega_{n-1} \right) \tag{2-3}


ここで、ωi\omega_i は、トークン列内の位置 ii にあるトークンを表す。


各トークンは、埋め込み層によって、それぞれに対応する DD 次元の入力トークン埋め込みへ変換される。

ωi𝒆ωiD(2-4)\omega_i \longmapsto \boldsymbol{e}_{\omega_i} \in \mathbb{R}^{D} \tag{2-4}



したがって、入力トークン列に対応する入力トークン埋め込みの列は、次のように表される。

(𝒆ω0,𝒆ω1,,𝒆ωn1)(2-5)\left( \boldsymbol{e}_{\omega_0}, \boldsymbol{e}_{\omega_1}, \ldots, \boldsymbol{e}_{\omega_{n-1}} \right) \tag{2-5}



入力トークン埋め込みを構成する数値を、人間がトークンごとに設定するわけではない。
Transformerでは、埋め込み層の重みもモデルの学習対象となる。

なお、この段階における入力トークン埋め込みは、トークン自体に対応するベクトルであり、トークン列内の位置を表す情報はまだ加えられていない。

入力トークン埋め込み行列

モデルが持つすべての入力トークン埋め込みは、入力トークン埋め込み行列 𝑬\boldsymbol{E} としてまとめて表すことができる。


𝑬=[𝒆1T𝒆2T𝒆|V|T]|V|×D(2-6)\boldsymbol{E} = \begin{bmatrix} \boldsymbol{e}_{1}^{\mathrm{T}}\\ \boldsymbol{e}_{2}^{\mathrm{T}}\\ \vdots\\ \boldsymbol{e}_{|V|}^{\mathrm{T}} \end{bmatrix} \in \mathbb{R}^{|V|\times D} \tag{2-6}



ここで、|V||V| は語彙 VV に含まれるトークンの総数、DD は各入力トークン埋め込みの次元数である。

入力トークン埋め込み行列の各行が、一つのトークンに対応する。

したがって、語彙に含まれるトークンが |V||V| 個あり、それぞれを DD 次元のベクトルで表す場合、入力トークン埋め込み行列の大きさは |V|×D|V|\times D となる。

位置情報が必要な理由

入力トークン埋め込み 𝒆ωi\boldsymbol{e}_{\omega_i} は、トークン ωi\omega_i に対応するベクトルであり、トークン列内の位置 ii を表すものではない。

また、Transformerは、再帰型ニューラルネットワークや畳み込みニューラルネットワークを使用せず、注意機構を中心としてトークン間の関係を処理する。

そのため、入力トークン埋め込みだけを使用した場合、トークン列内における各トークンの順序をモデルへ明示的に与えることができない。

式(2-3)で表した入力トークン列に含まれるトークンの順序を入れ替えると、元のトークン列とは異なる並びになる。

しかし、入力トークン埋め込み自体には、それぞれのトークンがトークン列内のどの位置にあるのかという情報が含まれていない。

そこで、Transformerへトークンの順序を明示的に与えるため、各入力トークン埋め込みに位置符号を加算する。

位置符号

位置符号(positional encoding)は、トークン列内における各トークンの位置を、ベクトルとして表現する方法である。

正弦関数と余弦関数を使用する位置符号では、それぞれの位置に対応するベクトルを、周期の異なる正弦関数と余弦関数を組み合わせて構成する。

正弦関数と余弦関数

正弦関数 sin\sin と余弦関数 cos\cos は、入力される値に応じて、一定の周期で繰り返し変化する関数である。

いずれの関数も、出力される値は (-1) から (1) までの範囲となる。

1sin(i)1,1cos(i)1(2-7)\begin{aligned} -1 &\leq \sin(i) \leq 1,\\ -1 &\leq \cos(i) \leq 1 \end{aligned} \tag{2-7}



位置符号では、周期の異なる複数の正弦関数と余弦関数を組み合わせて、各位置に対応する DD 次元のベクトルを構成する。

位置符号の計算

トークン列内の位置 ii に対応する DD 次元の位置符号を 𝒑i\boldsymbol{p}_i とする。

𝒑i\boldsymbol{p}_i の各要素は、次の式によって計算される。

pi,2k=sin(i100002k/D)(2-8)p_{i,2k} = \sin \left( \frac{i}{10000^{2k/D}} \right) \tag{2-8}


pi,2k+1=cos(i100002k/D)(2-9)p_{i,2k+1} = \cos \left( \frac{i}{10000^{2k/D}} \right) \tag{2-9}

ただし、k=0,1,,D21k=0,1,\ldots,\frac{D}{2}-1とする。

各記号は、次の内容を表す。


ii:トークン列内の位置

kk:正弦関数と余弦関数の組を指定する整数

DD:位置符号および入力トークン埋め込みの次元数


位置符号では、偶数番目の要素に正弦関数を使用し、奇数番目の要素に余弦関数を使用する。
正弦関数と余弦関数を対にして使用するため、上式では DD を偶数としている。

位置 ii に対応する位置符号 𝒑i\boldsymbol{p}_i は、次のように表される。

𝒑i=[sin(i)cos(i)sin(i100002/D)cos(i100002/D)sin(i10000(D2)/D)cos(i10000(D2)/D)](2-10)\boldsymbol{p}_i = \begin{bmatrix} \sin(i)\\ \cos(i)\\ \sin\left(\dfrac{i}{10000^{2/D}}\right)\\ \cos\left(\dfrac{i}{10000^{2/D}}\right)\\ \vdots\\ \sin\left(\dfrac{i}{10000^{(D-2)/D}}\right)\\ \cos\left(\dfrac{i}{10000^{(D-2)/D}}\right) \end{bmatrix} \tag{2-10}



位置0の位置符号

位置 i=0i=0 の場合、すべての正弦関数と余弦関数には0が入力される。

sin(0)=0,cos(0)=1(2-11)\begin{aligned} \sin(0) &= 0,\\ \cos(0) &= 1 \end{aligned} \tag{2-11}



したがって、位置0に対応する位置符号は、次のように0と1が交互に並ぶベクトルとなる。

𝒑0=[010101](2-12)\boldsymbol{p}_0 = \begin{bmatrix} 0\\ 1\\ 0\\ 1\\ \vdots\\ 0\\ 1 \end{bmatrix} \tag{2-12}


位置 ii が変化すると、それぞれの正弦関数と余弦関数の値も変化するため、各位置に対応する位置符号も変化する。


位置符号の波長

位置符号では、次元によって正弦関数および余弦関数の波長が異なる。

式(2-8)および式(2-9)で使用する正弦関数と余弦関数の波長は、2π2\pi から 2π10000(D2)/D2\pi\cdot10000^{(D-2)/D} まで等比的に増加する。

DD が大きい場合、最大の波長は 100002π10000\cdot2\pi に近づく。

したがって、一つの位置符号には、異なる波長を持つ複数の正弦関数と余弦関数の値が含まれる。

相対的な位置関係

正弦関数と余弦関数による位置符号には、一定の位置差を線形変換によって表現できる性質がある。

任意の一定の位置差 mm に対して、位置 i+mi+m の位置符号 𝒑i+m\boldsymbol{p}_{i+m} は、位置 ii の位置符号 𝒑i\boldsymbol{p}_i の線形関数として表すことができる。

この性質により、モデルが相対的な位置に基づいて注意を向ける方法を学習しやすくなることが期待される。


入力トークン埋め込みと位置符号の加算

入力トークン埋め込みと位置符号は、どちらも DD 次元のベクトルである。

そのため、入力トークン埋め込みと位置符号を、対応する要素ごとに加算することができる。

位置 ii にあるトークンを ωi\omega_i、その入力トークン埋め込みを 𝒆ωi\boldsymbol{e}_{\omega_i}、同じ位置に対応する位置符号を 𝒑i\boldsymbol{p}_i とする。

Transformerへ入力されるベクトル 𝒙i\boldsymbol{x}_i は、次の式で計算される。

𝒙i=D𝒆ωi+𝒑i(2-13)\boldsymbol{x}_i = \sqrt{D}\boldsymbol{e}_{\omega_i} + \boldsymbol{p}_i \tag{2-13}



これは、入力トークン埋め込みと位置符号のスケールをそろえるために、入力トークン埋め込みを D\sqrt{D} 倍しているものと考えられる。

これをトークン列に含まれるすべての位置について計算することで、次の入力ベクトル列が得られる。

(𝒙0,𝒙1,,𝒙n1)(2-14)\left( \boldsymbol{x}_0, \boldsymbol{x}_1, \ldots, \boldsymbol{x}_{n-1} \right) \tag{2-14}



正弦関数と余弦関数による位置符号が採用された理由

Transformerでは、正弦関数と余弦関数による固定された位置符号のほか、学習によって値を更新する位置埋め込みについても比較実験が行われた。

比較実験では、固定された位置符号と学習可能な位置埋め込みは、ほぼ同等の結果を示している。

一方、正弦関数と余弦関数による位置符号には、学習時に扱った長さを超えるトークン列にも適用できる可能性がある。

この点を考慮し、固定された位置符号が採用された。


まとめ

Transformerでは、語彙に含まれる各トークンを D 次元の入力トークン埋め込みに変換する。

ただし、入力トークン埋め込みだけでは、トークン列内における位置や順序を表すことができない。

そこで、正弦関数と余弦関数によって計算した位置符号を入力トークン埋め込みに加算する。

位置 ii にあるトークン ωi\omega_i に対応する入力ベクトルは、次式で表される。


𝒙i=D𝒆ωi+𝒑i\boldsymbol{x}_i = \sqrt{D}\boldsymbol{e}_{\omega_i} + \boldsymbol{p}_i



各位置について計算された入力ベクトルを行方向に並べることで、n×Dn\times D 次元の入力行列が構成される。

この入力行列がTransformerの各ブロックで処理され、自己注意機構などを通じて、トークン間の関係を反映した文脈化された表現へ変換されていく。

この記事について

参考文献
・「大規模言語モデル入門」山田郁夫 監修/著、鈴木正敏・山田康輔・李凌寒 著
・Ashish Vaswani et al., “Attention Is All You Need,” Advances in Neural Information Processing Systems 30, 2017.
・Alec Radford et al., “Improving Language Understanding by Generative Pre-Training,” OpenAI, 2018.


※本記事は、上記文献を参考にしつつ、筆者の理解に基づき整理したものである。


この記事を書いた企業

企業名
株式会社Lightcone Technology
事業内容
LLMを活用したAIサービスの企画・開発・運営
Web・モバイルアプリケーションの企画・開発・運営
Webサイトの企画・制作
AI基盤技術の研究・開発
URL
https://lc-techno.com/
連絡先
info@lc-techno.com
企業ページを見る
contact

製品・サービスの掲載、掲載情報に関するお問い合わせ、OMOGANEYAを通じた調達・販売・取引支援について、お気軽にご相談ください。