Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

Transformerについての勉強メモ

上が参考資料

Attentionとは何か

まず、一連のデータを格納したデータベースがあるとする。

  • kRdk\mathbf{k} \in \mathbb{R}^{d_k}で表される、データのKey、ラベルを表すもの。
  • vRdv\mathbf{v} \in \mathbb{R} ^ {d_v}で表される、データの本体。

このペアが大量にDBにあるとする。

ここで新たに、問い合わせれのクエリとして、 qRdk\mathbf{q} \in \mathbb{R} ^ {d_k}が与えられるとする。完全に q,k\mathbf{q, k}が一致する必要はないが、一致するデータほど色濃くクエリの答えの答えとして帰ってくるようにしたい。

この操作をAttentionとである。

NN個のクエリがあり、 MM個のペアがDBにあるとする。

  • QRN×dkQ \in \mathbb{R}^{N \times d_{k}}として、 NN個のクエリが与えられる。各行が1つ1つのQueryとなっている。
  • KRM×dkK \in \mathbb{R}^{M \times d_k}として、 MM個のDBのkey-valueがある。各行が1つ1つのKeyとなっている。
  • VRM×dvV \in \mathbb{R} ^ {M \times d_{v}}として、 MM個のDBのkey-valueがある。各行が1つ1つのValueとなり、 KKii行目のKeyは VVii行目のValueに相当する。

この時、Attentionの1つのうやり方として、以下のようにあらわせる。

Image in a image block

QKTQ K^Tでは、QueryとKey同士の内積を求めているといえる。演算結果は N×MN \times Mの行列であり、 (i,j)(i,j)成分は ii番目のQueryと jj番目のKeyの内積。合致度が高ければ、この内積が大きくなるというものらしい。

それを次元数の平方根 dk\sqrt{d_k}で割って正規化している。

そして、softmaxは横向き、つまり (i,)(i, *)の行に対して、softmax。これで、各Keyに対して、このQueryに対してどれほどの重みをもたせるのかを決定している。

そしてこのような操作を施す一連の流れは、 AAというAttention行列を作っているといえる。Attention行列の中で (i,j)(i,j)高い値をとることは、 ii番目のQueryと jj番目のKeyは合致しているということであり、その重みとみなせる値を VVと掛け合わせた結果、 N×dvN \times d _vのサイズのデータの問い合わせ結果が得られる、という仕組みである。

Attention is all you needってなんだよ

今ままではRNNとAttentionを同時に使用して、NLPのタスクを使っていた。しかし、RNNは設計の仕組み上並列計算ができないので、計算コストが高いことが難点。

そしたら、Transformerでは、Self-Attentionを用いることができるならば、RNNはいらん!というのが主張だ。

Single-Head-Attentionとは

Image in a image block

まず、Single-Head-Attentionについて説明。上のAttentionでは学習パラメタが存在せずすべて固定されているといえる

これに対して、Value, Key, Queryの前にそれぞれ線形層を1つ挟み込むことによって、(線形に限るが)学習の意味があるようにすることができる。これがSingle-Head-Attentionである。

Multi-Head-Attention

Image in a image block

このSingle-Head-Attentionを同時に並列に数本並び、同時に学習をさせることができる。複数並べることで、

  1. 複数の線形層が(並列に)存在するので、一義ではない意味などでも複数個のheadでattentionすることで、とらえやすい
  2. 同時に並列して独立して計算できる。

複数本で行うというのは、具体的には以下の手順のようになる。元のQueryやKeyは512次元ある(Valueは512次元である必要はないです)と仮定する。

  1. 512次元のQueryやkeyのものをhead本コピーする。
  2. 各headについて、いい感じの線形変換(これも学習でパラメタが更新される)を行い、64次元(例)のものにする。
    1. ここでの線形変換はSingle-Head-Attentionの緑のLinearの部分も兼ねることになる。
  3. それぞれAttentionする。
  4. その結果をContactで結合する。結合する WoW^oも学習される

複数個のheadで計算したら、最後にContactの部分で結合しないといけない。具体的には、以下の式となる。

(H1,H2,,Hh)WO(H1,H2,\cdots,H_{h})W^O

このように各headは結合される。

なお、いずれの場合も、このままのAttentionでは各トークンの位置関係をとらえることができないし、多義語などについても一義な表現として扱われてしまう。これを防ぐために、Transformerアーキテクチャではなんとか位置情報も埋め込みたいということになる。

Encoder-Decoderモデルとはなんだ

Encoderという、サンプル xRdi\mathbf{x} \in \mathbb{R}^{d_i}から、内部の表現ベクトル aRda\mathbf{a} \in \mathbb{R}^{d_a}に変換するものがある。その表現ベクトル a\mathbf{a}を受けて、出力 oRdo\mathbf{o} \in \mathbb{R}^{d_o}を出力していくというモデル。

誤差逆伝播するときにはもちろんDecoder → 内部表現 → Encoder の順序で更新していく。

意図的に内部表現を一度生成させることでの利点は以下の通り。

  • 異なる長さのシーケンスの処理をしやすい。
  • 強制的に情報の圧縮をさせることができ、サイズを落とせたりする。
  • モジュール性がある。Encoderだけパラメタの学習を止めることもできる。

欠点としては以下の通り。

  • 内部表現に落とし込むことになるので、どうしても表現力は落ちてしまう。
  • Encoder-Decoderのそのままでは長期的な依存関係をうまくとらえられない
    • これをSelf-Attentionと場所情報の盛り込みでうまくやったのがTransformerアーキテクチャ。
  • 並列処理がほぼできない。Encoder → 内部表現 → Decoderなのでシステム上さすがにね、無理。

TransformerでのEncoder-Decoder

Encoder, DecoderとAttentionだけでやっているのがTransformer。Decoderでは、毎回以下のように推論している。

  1. 今までのDecoderの出力の列を入力する。
  2. 位置情報の埋め込みを行う。
  3. Self-Attentionを行う。
  4. Encoderからの埋め込みの情報をもとに、Cross-Attentionを行う。
    1. つまり、AttentionはSelfとCrossで2回行われる
  5. 最後に出力したいトークンを出力して終わる。

訓練をするときは、

  • Input: [START] → Output: [START] This
  • Input: [START] This → Output: [START] This is
  • Input : [START] This is → Output: [START] This is a
  • Input: [START] This is a → Output: [START] This is a pen
  • Input: [START] This is a pen → Output: [START] This is a pen [END]

このような出力したトークンについてそれぞれ誤差逆伝播を行って、訓練をしなければならない。この時、同時並行しながら行ってよいのであるが、それをするためには、「Input: [START] This → Output: [START] This is 」の場合、「a pen [END]」のトークンの情報を使ってはいけない。そのためには、Masked Multi-Head Attentionをするといって、DecoderでのSelf-Attentionの学習には使用してはいけないところのデータにマスクをかけつつ、同時に学習を進めていく