きっと続かんブログ

勉強したことや人に言いたいことを書く。

Attention is all you need(Transformer)のお勉強

deeplearning.hatenablog.com

りょぼっと様が解説記事を書いてくださってるのでそれで勉強。
ここには読んでいて難しかったところ(ほぼ全て)の解説(個人的解釈)を記事に沿って示します。
浅学なもんで厳密には間違ってるってところがたくさんあると思います。自信無い、間違ってるだろうとこは青字にしてる。

注意は辞書オブジェクト

大前提として、Attention機構はターゲット文の対象単語に対し、「注意すべき」単語をソース文から一つ選ぶ*1んだけど、そのAttentionの内部動作の説明。

Query→ターゲット文の対象単語の特徴を持ったナニカ
Key,Value→ソース文の単語行列の特徴を持ったナニカ

なんでソースの単語行列が2つあるんじゃ、と。同じもの2ついるんかと。
そこはまず、置いておいておこう。

Attention機構が「注意すべき」単語を選ぶまでの流れを見てみよう。
①まずsoftmax(QKT)で、「どの単語に注意すべきか」明らかにする。
ここで[0.01 0.9 0.02 ...]みたいな、「各単語の選ばれる確率」ができる。
②次に、①にValueを掛けて、「注意すべき」単語を取り出す。

流れはこれだけ。 結局なんでKeyとValueが2つあるのか。その答えは次節にあった。

MemoryをKeyとValueに分離する意味

分からん次。
ちょっと思ったのは、KeyとValueって転置関係にあるだけの全く同じ行列では無いっぽい。
それじゃホントに分離する意味ないかそりゃそうか。

加法注意と内積注意

上で動作を説明したAttention、これが内積注意(Dot-Product Attention)。
動作追いながら、あれAttentionて重みって無いのかなとかぼんやり思った。 無いんです。それがいいんです。Transformerはこっちの方式を使う。
ちなみに僕らが普通に思い描く一般的なニューラルネットワーク(レイヤー間の重みを更新していくあれ)、あれを使った方式を加法注意(Additive Attention)という。

ソースターゲット注意と自己注意

  1. Source-Target-Attention
    Queryと、Key,Valueが別の場所からくるやつ。要は普通の(RNNで使われる)Attention。
    Queryはデコーダ側から、Key,Valueはエンコーダ側から来る。

  2. Self-Attention
    入力を全部同じ場所(エンコーダならエンコーダ、デコーダならデコーダ)から引っ張ってくる。

Self-Attentionの利点として、従来のRNNモデル(に使われるSource-Target-Attention)は1度に1つのquery(ターゲット単語)しか与えられない(時系列処理だから)。Transformerは文をガサっとエンコーダorデコーダに投げるから一度に全ての単語をqueryとして与えられる。*2

Self-Attentionが何のためにあるのか分からない…
普通のRNN翻訳モデル(に使われるSource-Target-Attention)ならターゲット文を生成するとき、ソース文のどの単語に「注意」するかを教えてあげる役割がある。Self-Attentionは?

縮小付き内積注意

従来の内積アテンションだと値が大きすぎることがあるらしく、小さくする方向でスケーリングしている様子。
*注釈 スケーリング - きっと続かんブログ

複数ヘッドの注意(Multi-Head Attention)

Transformerは縮小付き内積アテンションを複数並列化した構造を持っておりこれをMulti-Head Attentionと呼ぶ。
Multi-Head Attentionの一連の動作としては、各ヘッダ(縮小付き内積アテンション)でアテンションを計算したのち、それらを結合(concat)、線形変換(linear)する。
並列化するのはそのほうが単一で用いるより性能が高くなるためである。この理由として
「Multi-Head Attentionは各ヘッドが異なる位置の異なる部分空間を処理すると解釈でき、単一のアテンションでは加算がこれを妨げてしまう」
とあるがよくわからない。

感想

まだ読み終えてないけど、分からないことが多すぎる。明らかに知識不足!

*1:これをハードアテンションという。複数ベクトルの重み付き平均を用いる手法もあり、そちらはソフトアテンションと呼ばれる。内積アテンションは加重和だからソフトアテンションかな

*2:超自信ない。