位置符号化 (Positional Encoding, 位置エンコーディング) [Transformer の部品]

1. 位置符号化 (Positional Encoding, 位置エンコーディング) とは [概要]

位置符号化(Positional Encoding, 位置エンコーディング)とは,各トークンが「系列中の何番目の位置(i)にあるか」を,符号化関数をもちいてD次元ベクトル表現へと符号化を行い,他の表現と同じ程度の高次元ベクトルへ変換する処理である [Sukhbaatar et al., 2015].特に,Transformer [Vaswani et al., 2017] において,Transformerはトークン埋め込み層とアテンションだけでは,各トークンの位置情報を埋込めないので,(1)学習を行わない位置符号化層 (この記事のメイン内容) [Vaswani et al., 2017] ,もしくは学習を行う位置埋め込み(Positional Embedding) 層のいずれかが用いられる.

この記事ではまず,Transformer元論文 [Vaswani et al., 2017] での,トークン位置符号化の定義(1.1節)と,元論文での動機(1.2節)について述べる.次に「位置符号化 or 位置埋め込み層」のどちらが良いかについては決定的な答えが出ておらず,2者ともよく使われている点を述べる(1.3節).1.3節については,管理人はNLPが専門ではないので,深入りした話までは行わない.

一方2節では,管理人が専門とする「コンピュータビジョンや Vision-Language界隈」でも,同様に「位置符号化も位置埋込みも,両者使われる状況にある」ことについて,簡単に整理しておきたい.どちらの方が優れているかの決定打も出ていない面もあるゆえ,あまり深入りした議論はせず,「どのモデル・タスクの研究で,2者のどちらが使われているか」を整理するまでに留める.

位置符号化の中でも,Transformer向けに提案された「三角関数ベースの,周期的関数による位置符号化」[Vaswani et al., 2017] が,広く使用されるようになったこともあり,「位置符号化」と書いた場合には「Transformerで提案された,サイン関数型のトークン位置符号化」を実質的にさすことが多い.

系列対系列変換においては,Transformer直前の最先端モデルであったConSeq2seq [Gehring et al., 2017] だと,学習可能な位置埋め込み層を使用していた.それが,Transformer原論文が提案した位置符号化を用いると,位置埋め込み層埋込みを学習しておらずとも,十分な系列変換精度を達成できるようになった.よって,それ以降,Transformer系モデルを中心に,位置埋め込み層の代わりにTransformer式の位置符号化がよく用いられるようになった.以後,NLPに限らず,画像や音の自己アテンション・マルチヘッドアテンションにおいても,Transformer式のトークン位置符号化がよく用いられるようになる.

Transformerを用いた物体群検出器である「DETR」でも,オリジナル論文では,各パッチトークンの2次元位置 (x,y) を,位置符号化関数でベクトル変換して使用する.ただ,DETR系ネットワークでも,学習する「位置符号化層の埋込み」を代わりに使っても良く,位置埋め込みを用いるDETR発展型の提案も多い.

1.1 位置符号化(Positional Encoding)に用いる関数

Transformer 論文 [Vaswani et al., 2017] では,系列長さ$L$の入力系列に対して,各トークンの位置$\text{pos}$を入力として,D次元ベクトルを作成する位置符号化(Positional Encoding)が提案された.

アテンション機構 は,位置情報をケアしないので,各トークン表現に,系列中の位置情報表現を加えるための仕組みが必要であり,それが位置符号化や位置埋め込み層である.従来のseq2seq with attentionによる系列対系列変換では,RNNの再帰などがトークンの位置情報をケアしていたので,(アテンション部分以外は) 位置情報の埋め込みは必要ではなかった.

1.1.1 基本の定式化

Transformer 論文 [Vaswani et al., 2017] の位置符号化では,以下の周波数が変化していく三角関数の,位置関数 $P(\text{pos},2d), P(\text{pos},2d+1)$ を用いることで,位置符号化後の$D$次元ベクトル$\bm{p}_i$ の各次元の特徴値を計算する:

\begin{align} P(\text{pos},2d) &= \sin \left( \frac{ \text{pos} }{ 10000^{2d/D} }\right) \\P(\text{pos},2d+1) &= \cos \left( \frac{ \text{pos} }{ 10000^{2d/D} }\right) \tag{1.1}\end{align}

ここで,パラメータは以下の3つである:

  • $\text{pos}$:系列中のトークンの登場位置番号.$0 \leq \text{pos} \le \frac{L}{2} $
  • $D$:トークン埋め込み後のベクトル次元数 (元論文の$d_{\text{model}}$に相当).
  • $d$:トークン埋め込み後のベクトルの,各次元のインデックス値($d=1,2,\ldots,D$).

式(1.1)では,学習不可能な決め打ちの三角関数による符号化式であり,系列における$\text{pos}$番目トークンの「(絶対)位置情報」が,$D$次元ベクトルとして手に入る.各ベクトルはトークン位置に沿った個別のベクトルになるので,「位置符号化後の$D$次元ベクトル × $L$個」を用いて,各トークン間の位置関係もTransformerが学習できるようになる.

1.1.2 関数の挙動の理解

$\text{pos}$だけを用いて,(普通の)三角関数による出力を位置符号の値として用いようとしてしまうと,周期ごとに同じ値が出力されてしまい,お互い独立した位置符号値を,各$\text{pos}$番目のトークンに与えることができない.そこで分母に,更に$d$が連動することがポイントである.式(1.1)の分母の値$2d/D$ と $2d/D$ が,$\text{pos}$と連携することにより,多数の異なる周波数の波を,埋込み後ベクトルの,各次元の位置符号値として出力できる.この仕組みのおかげで,長い文章でも,トークン位置ごとに,固有の符号化値を,位置符号(ベクトル)として与えることができる仕組みである.

Transformer では,各トークンから埋め込み層で作成したトークン埋め込みベクトル $\bm{x}_i$ (D次元)に,位置符号化で計算したベクトル$\bm{p}_i$を,加算合成した形で,$i$番目のトークンの系列変換入力として用いる.言い換えると,位置符号化後の位置表現ベクトルと,トークン表現ベクトルの埋込み後の次元数は,共に $D$ 次元にして同じに揃えておく

※ より詳しくは Transformer の記事や,2.2節「位置符号化」を参照.

1.1.3 より詳しい挙動と性質

(1.1) 式では,周波数が次元 $d$ が増えるごとに変わっていく関数に設計されており,これにより可変長の系列のトークン位置情報埋め込みに対応できる.

(1.1) の分母にある「10000」の値は,ユーザー自由に設定できるハイパーパラメータである.この大きな値での割り算により,出力値は$d$が小さいと波長が短く,$d$ が大きいほど長い波長になる.従って,系列前半は,各トークン異なる値を示す(周波数が異なる)が,系列後半のトークンほど,隣接トークン位置同士の符号化結果が,ほぼ同じ値(もとい周波数が同期)を示すようになっていく.逆に言うと,長期のトークン位置関係はEndodeできないことが,(1.1)式の欠点でもある (この点は,Tranformer-XL などで,改善案が提案されていく).

また符号化後ベクトルの各$d$次元の値は,周期的な(1.1)式の関数で値が決まる.これにより,学習データで与えられた系列長 $L$ 以降の「学習データでは見えていない,先のトークン位置」での登場位置具合も,Transformerが学習できるという利点が出る.これにより Transformer では,学習データで与えた以上の系列長の文を翻訳してトークンを予測する際にも,学習した各トークン位置の情報が効いてくる.

Transformer界隈では,最初の論文 [Vaswani et al., 2017] で (1.1) 式が提案されて以降,この「(絶対)トークン位置符号化」を代替する「よりよい手法」が永らく現れておらず,標準的な Transformer 構成の位置符号化には,ずっと(1.1)式の関数が用いられている.

Transformer-XLなどでは「相対」位置符号化も使われるが,基本となる「三角関数を用いたEncoding」というところは同じである.オリジナルの(絶対)位置符号化 [Vaswani et al., 2017] には「なぜかうまくいっている」,「もう少しよい関数ありそうが,未だに良い代替案が(2022年現在)提案されていない」という,闇部品の側面もある.Transformer系ネットワークでは,Position Embeddingを学習することも多くなっているので,その分,位置符号化関数はケアされてこなかっただけかもしれないが.

※ 管理人はコンピュータビジョンが専門であり,NLP視点での知識・経験は深くもないのでこれ以上の議論は行わない.

1.2 なぜTransformerでは位置符号化を使用したか

オリジナルのTransformerの提案 [Vaswani et al., 2017] において,なぜ位置符号化が提案されたかの動機・背景について,この1.2節でまとめる.

1.2.1 Transformerの構造と,当時の従来技術のおさらい.

Transformerの各トークン入力には,元の文をサブワード単位にも分割できるトークナイザ (BPE, WordPiece, SentencePieceなど)によって,あらかじめ分割した各トークンを辞書化しておき,そのトークン表現IDを用いる.ただ,各トークンを,数万個の語彙のトークンからなるOne-hotベクトルになってしまう.

そこで,Transformerが効率的に計算を行いやすいように,各トークンを低次元のD次元ベクトル(D= 512~256次元程度) へ埋め込みむために,全結合層による埋め込み層も学習する.このように,埋め込み層を各トークンに使用して次元削減(埋め込み)を行う習慣は,seq2seq with attention時代の頃と同じである.

また,位置符号化/位置埋め込みは,Transformerから新たに始まった仕組みではないことに注意である.Transformer登場前に最先端の系列対系列変換であった ConvSeq2Seq [Gehring et al., 2017] でも,位置埋め込み(Position Embedding)層は使用されていた.

1.2.2 Transformerのトークン位置符号化:周期関数による符号化を提案

Transformerマルチヘッドアテンションを用いた「系列全体トークン群の一括処理」が,主要処理である.よって,埋め込み層で得られるD次元トークン表現列をマルチヘッドアテンションで処理しても,系列全体の何番目のトークンであるかの「系列内でのトークン(絶対)位置情報」が埋め込まれていない処理になってしまい,系列処理がうまくいかない.そもそも,NLP分野には,分散表現(Word2Vec, GloVe)のような「単語同士の(相対)位置関係」の埋め込みの知見は以前からあったので,Transformerでも同じように「トークンの位置情報もコーディング」したいという事となった.

そこで,Transformer 論文では,位置符号化を提案し,式(1.1)によって各トークン位置を,D次元ベクトル表現に符号化することを提案した.そして,その位置埋め込みベクトルを,埋め込み層で得られるD次元トークン表現に,加算合成することにより,(絶対)位置情報も加味した系列対系列変換をTransformerのマルチヘッドアテンション中心の設計でも行えるようにした.

実験の節でも,学習可能な位置埋め込み層(Positional Embedding)を用意したものよりも,位置符号化のほうが性能で勝ったので位置符号化で良いと主張している.

1.3 位置符号化 v.s 位置埋め込み

ただし,その後のTransformer改善論文や,Transformer-Encoder or Transformer-Decoderを使用した大規模言語モデル(BERT・GPT など)では,位置埋め込み層を使用して位置情報も学習している設計のネットワークも多い.「位置符号化 v.s 位置埋め込み層」の2者は,どちらのほうが性能が上になるかは,ネットワーク構造やタスクなどによって異なり,「両者はどちらが良いとは言えず,どちらも使われる」という状況である(※ 2022年8月執筆現在の感想).

私はNLPの専門家ではないので,現時点では知識が足りないゆえ,NLPにおけるこの話題への深入りは行わない.代わりに,以降の2節では,私の守備範囲であるビジョンとVision-and-Languageに対して,簡単にだけこの1.3節と同じ「2者の比較」の話を2節で述べたい.

2. ビジョンでの位置符号化 v.s 位置埋め込み

コンピュータビジョンでも,最近のTransformerを使用した各種画像認識タスク(物体認識・物体検出・セマンティックセグメンテーションなど)や,3D点群処理にNeRFなどでも,(幾何的な)位置符号化が用いられている.

ただし,画像向けでも,1.3節で比較しているように,「学習しない位置符号化」と「学習する位置埋め込み層」のどちらが性能がよくなるかは,(各研究での採用割合を見ていて)実験結果でしか答えが出しづらい面があり,個人的には2者のどちらが優れているかを定性的に測りづらい面があると考えている.

2.1 Transformer,DETRでの状況

たとえば DETR元論文では,(学習可能な)位置埋め込みを使用している.しかし,DETRの各フォロー研究では,位置符号化も代わりに結構使用されている.DETR界隈では決定打が出ていない

一方,ViT(Vision Transformer)のオリジナル論文でも,元のTransformerで使用されている位置符号化ではなく,(1D)位置埋め込み層が使用されており,Transformerベースの設計であるが位置符号化を使用せず学習する.

このように,ビジョン向けTransformerでは,位置符号化と位置埋め込みのどちらも使われている状況である.一方で,著者の研究興味も高いVision-Language 学習向けのTransformerだと,オリジナルのTransformerと同じく位置符号化で行い,位置埋め込み層学習はしないケースも多い.

2.2 ビジョンでも同じ結論:どちらも使われている

以上のように,ビジョンでも2者のどちらも使用されており雑多な状況である.どちらが良いか決定解が出ていないのと,どちらかだけが強く精度を向上させるケース(もとい改善案)が出ていないことが,この状況の原因である.

また,Transformer系モデルでは,位置符号化や位置埋め込みを除いても,あまり精度が落ちないものがある.つまり,位置符号化/位置埋め込みが,ほとんど寄与しないケースもある.

3. 位置符号化 (Positional Encoding) のまとめ

Transformerで提案された(学習しない)トークン位置符号化について,まず仕組みと動機・歴史経緯を述べた(1.1, 1.2節).また,学習するトークン位置埋め込み層と,位置符号化では,あまり甲乙がつけがたい側面があり,どちらもよく使われていることを,NLP(1.3節)とビジョン界隈(2節)について,それぞれ短くだけ論じた.

関連書籍

References

  • [Gehring et al., 2017] Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, and Yann N Dauphin. 2017. Convolutional sequence to sequence learning. arXiv preprint arXiv:1705.03122 .
  • [Sukhbaatar et al., 2015] Sainbayar Sukhbaatar , Jason Weston, Rob Fergus, et al. 2015. End-to-end memory networks. In NIPS 2015.
  • [Mildenhall et al., 2020] Ben Mildenhall, Pratul P. Srinivasan, Matthew Tancik, Jonathan T. Barron, Ravi Ramamoorthi, and Ren Ng. Nerf: Representing scenes as neural radiance fields for view synthesis. In ECCV, 2020.
  • [Vaswani et al., 2017] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. Attention is all you need. In NIPS 2017.

参照外部リンク