PositionEmbeddings
PositionEmbeddings
TransformerやConvS2Sで使われている、位置情報をトークンの値と独立に判断するための仕組み。
- WhatDoPositionEmbeddingsLearn 学習されたPositionEmbeddingsの内容などを調査、ただし調査方法が少し微妙。
- OnPositionEmbeddingsInBERT BERTにいろんなPEを適用してGLUEとかSQuADのスコアを見たり最初のアテンションの重みを評価したり。
- RoPE
LxDの行列をindexでルックアップして学習(ConvS2S, BERT)
ConvS2SのPositionEmbeddingsの周辺の話。
論文では詳細は述べていないが、以下の実装を見ると
単なるintのindexでWをlookupしているようで、そのWを学習する感じになっている。通常のembeddingと同じ計算だな。 上の実装にはTransformerで提唱されたsinの奴も入っているが。
なお、positional embedding無しでもそこそこスコアはでているので、これ無しでもそこそこは位置を扱えていそう。論文のテーブル4に以下のスコアがある。
| 項目 | BLUE |
|---|---|
| 両方にpositional embedding | 21.7 |
| targetだけpositional embedding | 21.3 |
| sourceだけpositional embedding | 21.5 |
| 両方無し | 21.2 |
sourceの方が影響はでかそう。
BERTでも、論文には詳細は書いていないが実装を見ると、512個のD次元のベクトルを単に学習させている。
bert/modeling.py at master · google-research/bert
原論文から解き明かす生成AIの演習問題3.1(sinusoidalの相対位置)
原論文から解き明かす生成AIの演習問題3.1に、Transformerのポジショナルエンコーディングが相対的な位置関係を把握しやすいというメリットがあるという事を示す問題があるのでやってみよう。
まずp+kを加法定理で開く事で、pの線形結合の形で書ける。
図2
これでpの線形結合の形で書ける事が証明出来た(ちょっとpを右に寄せてないので見づらいが、まぁ分かるだろう)。
次にp+kとpの間の相対的な位置関係を調べるために、 を計算してみる。2iと2i+1を調べてみれば十分だろう。
図3
ここで、Aはkのみで、Bはpのみとなっている。 そしてpositional encodingは違う位置のものが区別出来るような値になっていると期待出来るので、pを起点として既知とすると、このAの部分を分離出来て、 Aからkを知る事が出来る(ような値がpositional encodingに期待されるもの)。
これが答えに鳴っているかは少し微妙なので、もう少し周辺的なことを考えてみる。 これはようするに、並進対称性のようなものを持たせられる、という話だと思う。 10個目のトークンと13個目のトークンの間の関係を学習した時、違う例文の100個目と103個目にも同じ関係を適用出来るようなモデルに出来る、という事だと思う。 これは修飾語だとか修飾節、語群自体が主語と目的語のように違う役割を果たすが語群内での修飾関係が同じ、 みたいな事を学習出来るようなモデルになっているか?という話だと思う。
これは画像解析で、CNNが良いとされていた根拠にもなっていて、画像内に対象オブジェクトが少し移動している時でもちゃんんと認識出来るという事を保証する数学的な性質。
さて、Transformer型のモデルで異なる位置の特徴量の線形和を考えた時に、いつも3個右隣のトークンとの間に似たような関係が見られる、としたとしよう。 ただしどこのトークンかはトレーニングセットの文章ごとに異なる。 この時に、値のみからこの3個右隣、という事を取り出せるのか?というのが題意だと思うが、これはそんなに自明でもない。
positional encodingは位置ごとに独立っぽい値になっていて、値のみからどこの位置かの雰囲気が分かると期待されるものだ。 そしてp+kがpの線形結合で表せる事から、p+kは、「p+kの雰囲気を感じつつpの雰囲気も感じる」ような値になっていると期待出来る。 また、kの線形結合にもなっているので、「kの雰囲気も感じる」事が出来ると期待は出来る。 そして学習の時にkの雰囲気が重要な情報になっているとすると、このkを取り出せる事は出来るかもしれない。
ただ本当に出来るかは良く分からない。少し考えてみよう。図の式で、左辺が与えられた時に、右辺が学習出来るか、という話に思う。 Aの所を未知の2x2行列だとする。Bのpも学習する必要がある。 左辺がいろいろ与えられた時に、このpの値をいろいろ調整していつも同じAになるように出来るか?という学習になる。 結構難しい気はする。
ただ、kの線形結合でも表せている事から考えると、positional encodingが基本的な演算をしても位置っぽさが残るという元の期待を満たされているとするなら、 kを学習は出来るはずと言えそうだ。
これは証明というよりは、数学的にはこういう分解が出来る、以上の事は言えず、あとは実験で比較してみるしかないんじゃないかなぁ。 逆象が存在するかもかなり自明ではないし、kと近いようなpの値を間違えて相対位置と勘違いしないような演算が作れるか、とかはかなり自明ではない。
ChatGPTに質問して、以下の論文を教えてもらう。WhatDoPositionEmbeddingsLearn
Sinusoidalの値の確認(演習問題3.2)
原論文から解き明かす生成AIの演習問題3.2はsinusoidalのembeddingsが実際にどういう値になっているかを確認せよ、というもの。 annotated transformerに同じようなのあったが、自分でやってみるか。
colab: SinusoidalなPositionEmbeddingsの確認.ipynb
高次元の方がゆるやかになって、低次元の方が高周波になっている。 低次元は近傍の前後関係を、高次元は絶対的な位置の雰囲気を伝えるのだろう。
Sinusoidalのスケールの確認(演習問題3.3)
上のcolabで一緒にやっている。