-
encoder: self-attention → feed-forward NN
-
decoder: self-atteiont → multi-head attention → feed-forward NN
-
self-attention
- K,V,Qをsource内部で学習
-
attention
- K,V,Qをsource-target間で学習
-
multi-head
- 各単語ごとにK,V,Qを計算するのではなく, ヘッドの数だけ小さいK,V,Qを計算してconcat. 出力時に重みWをかけて次元を調整
- 学習対象は各ヘッドの重みW_Q, W_K, W_V と出力W_O
- attention機構自体には学習対象は無い → 最後参照
- https://gyazo.com/5edce3f28e32b750fb6533a4705b8ba1
-
ヘッドを複数個用意することで、それぞれが異なる潜在表現の空間から有益な情報を取ってきてくれる (???) (https://qiita.com/omiita/items/07e69aef6c156d23c538#13-モデル構造)
-
このモデルではAttentionは3ヶ所で使われている。
- エンコーダ-デコーダ Attention :
- Query: デコーダ内前層の出力
- Key, Value: エンコーダの最終出力
- エンコーダ Self-Attention :
- Query, Key, Value: エンコーダ内の前層出力
- デコーダ Masked Self-Attention :
- Query, Key, Value: デコーダ内の前層出力(ただし、対象単語より右側にAttentionが加わらないようにしている。翻訳タスクでカンニングを防ぐ。)
- エンコーダ-デコーダ Attention :
-
Attentionはざっくりと, softmax(QK)V
- QとKは内積を取るので類似度を表す
- つまり, Qに類似するKを見つけ, そのKに対応するVを加重和を計算 .
- QとKは内積を取るので類似度を表す
-
Multi-head attention はXを回転する.
-
その他
Transformerの重要な特性の 1 つが見えてきます。それは,各位置にある単語がエンコーダ内のそれ自身のパスを通って流れるということです。自己注意層では,これらのパス間に依存性があります。しかし,全結合層にはそのような依存関係がないので,全結合層を流れる間に様々なパスを並列に実行することができます。
自己注意がどのように機能しているのかを見ていきましょう。
次の文が翻訳したい入力文だとします。“The animal didn’t cross the street because it was too tired”
この文章の「it」は何を指しているのでしょうか?「street」のことを指しているのか,それとも動物のことを指しているのか?これは人間にとっては簡単な質問ですが,機械にとってはそう簡単ではありません。
モデルが「it」という単語を処理しているとき,自己注意は「it」を「animal」と関連付けることを可能にします。
https://tips-memo.com/translation-jayalmmar-transformer
Self-Attentionで重み行列をかける理由は?
-
たぶんだけど
- 「これは / ペン / です.」にself-attentionをかけるとする.
- → 「これは」と「ペン」に強いattentionがあるように学習したい
- → Attention機構自体には学習対象は存在しない
- → なので, 埋め込みベクトルに対して線形変換をかけて拡大・回転させることで, 「これは」と「ペン」に強いattentionが付くように学習する
-
https://github.com/cedro3/Transformer/blob/master/transformer_en_run.ipynb