Transformer
https://gyazo.com/e438321cbf7dd50c42a764f71ee8332d
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
このモデルではAttentionは3ヶ所で使われている。
エンコーダ-デコーダ Attention :
Query: デコーダ内前層の出力
Key, Value: エンコーダの最終出力
エンコーダ Self-Attention :
Query, Key, Value: エンコーダ内の前層出力
デコーダ Masked Self-Attention :
Query, Key, Value: デコーダ内の前層出力(ただし、対象単語より右側にAttentionが加わらないようにしている。翻訳タスクでカンニングを防ぐ。)
Attentionはざっくりと, softmax(QK)V
QとKは内積を取るので類似度を表す
つまり, Qに類似するKを見つけ, そのKに対応するVを加重和を計算 .
Multi-head attention はXを回転する.
その他
Transformerの重要な特性の 1 つが見えてきます。それは,各位置にある単語がエンコーダ内のそれ自身のパスを通って流れるということです。自己注意層では,これらのパス間に依存性があります。しかし,全結合層にはそのような依存関係がないので,全結合層を流れる間に様々なパスを並列に実行することができます。
自己注意がどのように機能しているのかを見ていきましょう。
次の文が翻訳したい入力文だとします。
“The animal didn’t cross the street because it was too tired”
この文章の「it」は何を指しているのでしょうか?「street」のことを指しているのか,それとも動物のことを指しているのか?これは人間にとっては簡単な質問ですが,機械にとってはそう簡単ではありません。
モデルが「it」という単語を処理しているとき,自己注意は「it」を「animal」と関連付けることを可能にします。
https://gyazo.com/217dabf0867b2eb60cfdbd22c39e9721
Self-Attentionで重み行列をかける理由は?
たぶんだけど
「これは / ペン / です.」にself-attentionをかけるとする.
→ 「これは」と「ペン」に強いattentionがあるように学習したい
→ Attention機構自体には学習対象は存在しない
→ なので, 埋め込みベクトルに対して線形変換をかけて拡大・回転させることで, 「これは」と「ペン」に強いattentionが付くように学習する