論文メモ：Attention Is All You Need

#　前提
2017年の論文「Attention Is All You Need」を、ざっくりと訳しています。
2020年時点では、BERTで利用されているTransformerに関する論文というのが、通りがよいでしょう。

ところどころ、原文を十分に理解できずに記載する箇所があります。
ご了承ください。

なお、表や図は、論文からの転載です。

#　目的
ネット上のTransformerの解説を読んでも、十分に理解できなかったため、
原文を読む必要を感じました。
同様の思いを抱く人がいるかもしれないと思い、
つたない訳でも網羅して書くことに意味があるかもしれないと考え、
ここにあげることにしました。

#　概要
文章変換の主流はRNNやCNN。エンコーダとデコーダをattentionでつなぐのがBEST。我々のtransformerはもっとシンプルで、attentionのみで構成。成果を見るがよい（ドイツ語の英語訳や、英語のフランス語訳のデータセットでSoTAだとか書いてある）。

# 1導入
RNNだのLSTMが翻訳とかで地位を築いている。
膨大な努力がモデルの精度を積み上げてきた。
再帰系の処理は位置に依存する（t番目の記号を処理する際に、t-1番目の記号の処理状態を使う）ので並列に処理できないしメモリを食う。
効率化しようと頑張ってるけど、問題は根本的でなかなかむずかしい。
一方Attentionは位置を気にしないが、なぜか位置を気にする再帰系で人気。
Attentionを活かしたtransformerは並列処理できて速いぞー。

# 2背景
直列処理を減らした結果できたのはCNNに基づく有象無象。
そいつらは距離が離れた要素間の関係性を計算をするのに、たくさん計算が必要。
そのため離れた要素間の関係性の学習は苦手。
Transformerにはそんな問題はない。Multi-Head Attentionのとこで説明しよう。

Self-attentionは一文の異なる位置の関係を表現でき理解・要約・含意とかで使われている。
再帰attention（recurrent attention）機構を使うと位置再帰（sequence aligned recurrence）よりもよい。
Transformerはself-attentionのみで構成された最初の変換器だ。
Transformerの詳細は後述。

# 3モデルの構造
翻訳ではエンコーダー・デコーダー構造が優れている。
入力x1～xn　⇒　z1～zn　とするのがエンコーダー。
z1～zn　⇒　y1～ym：出力　と順次するのがデコーダー。
自己回帰モデルでは、ある生成タイミングで、それ以前の生成結果を使う。
Transformerはこの仕組みを継承する。

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/93e1fc9a-6339-105f-ffae-e6931d532773.jpeg)

## 3.1エンコーダーとデコーダー
### エンコーダー
エンコーダーは同一の層を6つ重ねる。
各層はsefl-attentionとfeed-forward networkの副層からなる。
各副層からの出力は、計算結果と入力をたして層標準化したもの。
円滑なresidual connectionのため、全副層から出力まで512次元で統一。

### デコーダー
デコーダーも同一の層を6つ重ねる。
ただし各層にはエンコーダーの出力を読むmulti-head attention副層あり。
layer normalization によるresidual connection はエンコーダーと一緒。
ただし、自己注意では先をカンニングしないように、マスクする。

## 3.2 Attention
Attentionは、keyとvalueの組を作るqueryといえる。
計算結果は、重みづけ（keyとqueryにより）されたvalueの列。

![図2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/518aa9cd-3607-6287-b4de-fe3dbd9b4b0c.jpeg)

### 3.2.1 Scaled Dot Product Attention
Keyとqueryの次元をdk、valueの次元をdvとする。
Valueの重みを得るために、dkの平方根でわって、softmaxを適用する。
QueryをQ、keyをK、valueをVと表記する。

![式1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/42f3d86f-5260-9dcb-18ca-9cedd2b36375.jpeg)

Attentionは加法（additive）注意と内積（dot-product (multiplicative)） 注意が主流。
dot-product をscalingしたのが我々の手法。
加法注意は一つの中間層をもつfeed forward networkを用いる。
dot-productの方が速いし、メモリ消費量が少ない。
dkが小さい時は差は乏しいが、dkがデカいと加法注意の方が
scalingのない内積注意より性能がいい。

### 3.2.2 Multi Head Attention
QueryとKeyとvalueを、h組にばらして、それぞれ学習させるのがいいと気付いた。
ばらしたのは並列に処理できる。
処理した結果を。後でくっつければいい。

MultiHead(Q,K,V ) = Concat(head1, …, headh)W(O)
where headi = Attention(Q W(Q, i) ,K W(K, i), V W(V, i ))

W(Q,i) ∈ R(dmodel × dk) 
W(K,i) ∈ R(dmodel × dk) 
W(V,i) ∈ R(dmodel,dv)
W(O)   ∈ R(hdv × dmodel )

h = 8 
dk = dv = dmodel/h = 64

合計の計算時間は、ばらす前と変わらない。

### 3.2.3 Applications of Attention in our Model

TransformerはMulti-head attentionを3通り使っている。
エンコーダー・デコーダーattentionでは、
query=デコーダーの前の層の出力　Key,value = エンコーダーの出力。
ここではデコーダーの全位置で入力文の全位置に注意をつけられる。
一見、典型的なエンコーダー・デコーダーattention機構に見える。

エンコーダーではself-attention。
Key, value, queryは全部エンコーダーの前の層の出力。
エンコーダーの各位置で、エンコーダーの前の層の全位置に注意をつけられる。

デコーダーでもself-attentionがあり、各位置で前の層の全位置に注意をつけられる。
でもデコーダーのj番目の出力をi(<j)番目の出力に参照させるわけにはいかない。
そこで、-∞によりマスクすることにした。

## 3.3 Position-wise Feed-Forward Networks

Attentionの副層後に、Feed-Forward Networksを各位置に別々かつ同様にかける。
間にReLUをいれた、二つの線形変換からなる。

FFN(x) = max(0,xW1 + b1)W2 + b2 (2)

やることは同じだが層毎にパラメータの値は変わる。
カーネルサイズ1の畳み込みといえないこともない。

## 3.4 Embeddings and Softmax

有象無象と同様に入出力のトークンをdmodel次元のベクトルにする。
デコーダーの出力を線形変換しsoftmaxしてから次の予測に使う。

Embeddingとその線形変換に同じ重みを使う。

Embeddingでは、重みをルートdmodelで割る。

## 3.5 Positional Encoding

Sinとcosを使い、pos=文中の位置、i=embeddingされたベクトルの次元数。
PE(pos,2i) = sin(pos/10000^(2i/dmodel) )
PE(pos,2i+1) = cos(pos/10000^(2i/dmodel) )
位置エンコーディングの各次元は、正弦曲線で与えられる。
波長は2π から 10000×2πの幾何学的な数列。
ある位置のPEが前の位置のPEから計算できるため学習しやすいと踏んだ。
他のもやったけど似たようなもの。
学習文よりも長いのに出くわしてもいいように、正弦曲線にした。

# 4 Why Self-Attention

この章ではself-attention を他と多角的に比較する。
self-attention を使う理由は3つ。
一つは１層あたりの計算の複雑性。
一つは並列計算できる割合。
一つは離れている要素の関係性を考慮できること。

離れている要素の関係性の学習は重要な試み。
要素間が離れている場合でも計算を単純にすることが重要。
計算が単純なほど、離れた要素の関係性は学習しやすい。
もっとも長いときの計算量を比較する必要がある。

自己注意は、全位置がつながっており、再帰層で直列でO(n)。
文の長さが表現次元よりも短い時、自己注意は再帰より速い。
文の長さは制限事項となりうるため、今後の課題。

畳み込み層では、全位置はつながらない。
O(k)の場合とO(logk(n))の場合がある??
kによって畳み込みは再帰よりも計算量がかかる。
O(k ・n・d + n・d^2)　ぐらい。
k=nとしても、自己注意とFFNを組み合わせた計算量と同等。

![表1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/6c6e80bc-2fc9-acf6-6bbc-362fa6b74c75.jpeg)

解釈可能性も自己注意のメリット。
Appendixに例をつけた。
統語的・意味論的な構造がとれている。

# 5 Training

## 5.1 Training Data and Batching

450万組の文からなる　WMT 2014 English-German　を使う。
文は、バイト-ペアエンコーディングされている。
これは、37,000トークンのソースターゲット語彙からなる。
英仏翻訳には、3600万のWMT 2014 English-Frenchを使う。
トークンは32,000個のWordPieceに分けられる。
1バッチは、25,000ソーストークンと25,000ターゲットトークンを用いる。

## 5.2 Hardwar and Schedule

学習には、NVIDIA P100 GPUを8個用いる。
この論文を通して基準となるハイパーパラメータでは、1stepに0.4秒かかる。
12時間で10万step学習する。
大モデルは、1step1秒、30万stepに3.5日使う。


## 5.3 Optimizer 

Adamをβ1=0.9、β2=0.98、ε=10の-9乗で使う。
学習率は、学習を通して以下の式で変化させる

lrate = dの-0.5乗　×min(step数の-0.5乗, step数×ウォーミングアップステップ数の-1.5乗)

これによりウォーミングアップステップ数の間は学習率は線形に増え、その後step数の-1/2乗で減っていく。
ウォーミングアップステップ数には、4000を用いる。

## 5.4 Regularization

Residual Dropout

各副層の出力に対し、次の副層への入力や正則化される前に、drop outを適用する。
さらに、embeddingと入出力の位置エンコーディングの合計に対してもdrop outを使う。
基本的にdrop out率は0.1。

Label Smoothing

学習中はεls = 0.1でLabel Smoothingを用いる。
学習の安定性は悪化するが、精度改善には寄与する。

6 Results

6.1 Machine Translation

英独翻訳では、大Transformerが一番いい。
通常のでも過去のアンサンブルを含むどのモデルよりいい。

英仏翻訳では、大Transformerが過去の単独モデルよりいい。

通常のモデルでは、学習の最後から10分空けてとった5個のチェックポイントの平均を用いた。
大モデルでは、20個のチェックポイントの平均を用いた。
beam size=4、length penalty α=0.6でbeam searchを用いた。
出力長の最大値は、入力長+50とした。

翻訳精度と学習コストを表にまとめた。

![表2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/aa5f96ab-7c74-bc54-2199-4cd0f97e894b.jpeg)

6.2 Model Variations

通常モデルをいじって、日独の精度の変化を表にまとめた。
beam serachを使うが、チェックポイントの平均は用いない。

![表3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/051589a5-8f66-1647-55dd-5a7bc7d6a377.jpeg)

表のA部分は、3.2.2で示したように計算量を固定し、attentionのヘッド数とkeyとvalueの次元数を調整した。
h=1のとき、BLUEがもっとも低い。
表のB部分を見ると、keyのサイズを減らすと精度が下がることがわかる。
表のC,D部分を見ると、大きいモデルほど良く、drop outが良く過学習を防いでいることがわかる。
表のE部分では位置embeddingを正弦から学習したものに変えても、大差ない。

## 6.3 English Constituency Parsing

英語の構文木解析に用いた。
RNNでは、小さなデータセットではSoTAに至らなかった。

d model = 1024の4層transofomerをPenn Treebankの　Wall Street Journal　4万文で学習した。
1700万文から信頼度の高いBerkeley Parser corporaを使って半教師学習も行う。
WSJ用の語彙数は16000トークン、半教師学習の語彙数は32000トークンを使った。

小規模な実験を行い、attentionとresidualのdropoutを選んだ。
学習率とbeam幅は22章の開発セット（？）、その他のパラメータは英独変換のまま用いた。
推論中は出力長の最大値は入力長より300長くする。
WSJのみを使う場合も半教師学習する場合も、beam幅=21、α=0.3とする。

結果は表4にまとめた。
タスク特化の調整をしていないのに驚くほどの性能がでている。
RNN文法を除くどのモデルよりもよい結果を得られた。

RNNを用いたseq2seqと違い、たかだか4万文のWSJで学習したTransformerがBerkeley Parserより性能がいい。

![表4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/0adf14be-1d36-44dd-e3cc-344488e6e1f2.jpeg)

#7 Conclusion

attentionで作成した最初の系列変換モデルTransformerを紹介した。
エンコーダーデコーダー構造で広く用いられている再帰層をマルチヘッドself attentionに置き換えたものだ。

翻訳では、Transformerは再帰や畳み込みより圧倒的に早く学習できる。
WMT2014の英独翻訳でも英仏翻訳でもSoTAを達成した。
英独翻訳に関して言えば、アンサンブルモデルをも凌駕した。

attentionに基づくモデルは、翻訳以外にも有効だと考える。
画像や音声、動画など、より大きな入出力を処理することも計画している。
そういったことは今後の課題とする。

学習と評価に用いたコードは、以下のURLで公開している。
https://github.com/ tensorflow/tensor2tensor

# Attention Visualizations


![図3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/cfba97b4-e150-a242-5a9d-b5bcb5f1dc7f.jpeg)

6層あるエンコーダーのself-attentionの5層目から、長距離依存性を参照している例を示す。
動詞「making」に対し、多くのヘッドの注意が向いている。
making 〇〇 more difficultといった言い回しを形成している。
ここではmakingに関するattentionだけを示している。
ヘッド毎に色を分けている。


![図4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/7c17c664-28ea-2f5e-ed52-ca32bc8e8286.jpeg)

こちらも、6層あるエンコーダーのself-attentionの5層目の、首句反復の解決に関する二つのヘッドを示す。
上はヘッド5のフルattention。下は「its」に関するヘッド5と6の独立したattention。
この単語に強く関連付けられていることを明治しておく。


![図5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595766/dde951c1-56d2-94c1-13ab-130f58634cb3.jpeg)

多くのattentionのヘッドは、文の構造関係を示している。
エンコーダーの5層目のattentionの異なるヘッドから、例を二つほど示す。
この二つのヘッドは明らかに異なる役割を持っている。