位置エンコーディングとは
Positional Encoding / 位置埋め込み
語順を区別できない自己注意機構へ、トークンの位置情報を与える仕組み
ひとことで言うと
Transformerは単語の順番をそのままでは区別できないため、「この単語は何番目か」という情報を別途埋め込む仕組み。
概要
位置エンコーディングとは、系列内のトークンの位置情報をモデルへ与える仕組みを指す。 Transformerの自己注意はトークンの順序を区別しないため、位置情報を別途注入しなければ語順を扱えない。 元のTransformerでは周期の異なる正弦波によるパターンを埋め込みへ加算する方式が使われ、その後、学習可能な位置埋め込み・相対位置エンコーディング・回転行列を使うRoPEなど多様な方式が提案された。 位置エンコーディングの設計は、学習時より長い系列への外挿性能、すなわちロングコンテキスト対応に直結する要素として重要視されている。
歴史
2017年のTransformerの論文「Attention Is All You Need」で正弦波による方式が導入された。
アーキテクチャ
正弦波位置エンコーディングでは、位置ごとに周波数の異なるsin・cos関数の値を計算し、トークンの埋め込みベクトルへ加算する。学習可能な位置埋め込みでは、位置ごとのベクトルをパラメータとして直接学習する。RoPE(回転位置埋め込み)は、クエリ・キーのベクトルを位置に応じた角度で回転させることで、絶対位置でなく相対位置の情報を注意計算に反映させる。
コード例
正弦波位置エンコーディングの実装例
import numpy as np
def sinusoidal_positional_encoding(seq_len, d_model):
position = np.arange(seq_len)[:, np.newaxis]
div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
pe = np.zeros((seq_len, d_model))
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
return pe利点
- 自己注意に順序の概念を与え、語順を区別できるようにする
- 正弦波方式は追加の学習パラメータを必要とせず、任意の系列長に一定の計算量で適用できる
- RoPE等の相対位置を扱う方式は、学習時より長い系列への外挿性能に優れる場合がある
欠点
- 学習可能な位置埋め込みは、学習時に見た最大系列長を超える入力への汎化が難しい
- 位置エンコーディングの方式選択がモデルの長系列外挿性能を左右するため、事後的な変更が難しい設計上の決定になる
- 方式によっては、非常に長い系列で位置情報の解像度や周期性に起因して精度が下がりやすい
比較
- RoPE — RoPEは位置エンコーディングの一手法で、絶対位置でなく相対位置の情報を回転行列によって注意計算に組み込む
関連用語
よくある質問
なぜ重要視される?
位置エンコーディングの設計が、学習時より長い入力への汎化性能(ロングコンテキスト対応)に直結するため。