Transformerの基本

# はじめに
今回はTransformerで使用されている技術についてまとめておきます．
初めは自然言語処理に用いられていた構造ですが，画像分野でも大活躍中です．
なかなかとっかかりにくい分野ですが，単純なDeepLearning は一通り学べたという人は是非Transformerについて勉強しておきましょう:heart_exclamation:

今回はPowerPointの画像をペタペタ＋αちょこっと説明という形式です．

# 1 Attention
下図のような🐶の画像があったときに人は背景を無視して🐶だけを注目できますが，CNNでは画像全体に同じ処理を繰り返すため，そういったことはできません．
![Attention1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/71d57718-91df-4ec3-7bb1-76c9d8a6f57f.png)

例えば，以下のような流れのモデルがあるとして，GAPでは背景も含めて画像全体の特徴を平均化します．
勿論大量のデータを使うことで，前景のみを注目するようにはなりますが，CNNで表現するには学習が難しくなっちゃってるんじゃない？という問題があります．
そこでAttentionが出てきます:smirk_cat:　Atetntionを用いると，明示的に特定の画像個所に注目するようことをNN上で実現することができます．
![Attention2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/2ce9092c-415d-e8e6-c81f-afe5fe52482c.png)

一番簡単なAtetntionの例です．そのまま進むのはSkipConnectionです．こういった処理を行うことで，背景はこれより後には効いてこなくなるわけです．
![Attention3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/ba95c609-8620-183a-fa79-00d99722d71c.png)

画像の特徴マップでのAttention，SENetを紹介します．画像のもつ複数の特徴からどの特徴に注目するかを決定します．
![Attention4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/e49d64ea-3c35-5382-66ba-90102c20f702.png)
![Attention5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/22c78a92-0a66-1ab3-9bcc-11bfcadd068c.png)

Attentionを式で考えます．Qは入力，KとVは対応すべき出力からきています．![Attention6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/f6e787ba-40e7-fa96-25ea-caccdbff4436.png)

…なるほど．まったくわからん．➡ 図で考えましょう．
使うパラメータはQ, K，Vの3つです．Qは入力から，KとVは対応する出力から決定されます．
下図でq1についてを考えてみましょう．
1.  まず，内積ですべてのKとの類似度を計算します．今回はq1に対してk1とk2が似ており，knは似ていません．
1.  次に，似ているキーに関するバリューを重み付けします．k1とk2が似ていたので，ここの部分の重みが大きくなります．
1.  最後にバリューの重み付き和を取ります．すると，これらの計算によって出てくるのは，v1＋v2に近いベクトルになります．

これでクエリに対するバリューが検索され，出力されたということになります．
![Attention7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/39d86265-e989-5101-581b-a4a39886d08d.png)

なんで対応すべき出力をKとVに分けんの？という点ですが，注目する点を決定するためのK（キーベクトル），最終的に利用される値を示すV（バリューベクトル）を分けることでより表現力が出て，精度が良くなるといわれています．
![Attention8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/956f2efa-23fc-77b6-1203-b684d35fe2c6.png)



# 2 Self Attention
Attentionは，QはInputから，KとVはMemoryからですが，SelfAttentionでは，それらすべてが同じ場所から来ます．（それぞれに対してパラメータ変換行列を適用するので，別の値にはなります．）
SelfAttentionを使用することで，自分自身の中でどことどこが関係しているかの依存関係を捉えることができます．
![SelfAttention1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/cdaf792a-dacd-df7e-cc5e-f6d832b2659b.png)

では，これについてより詳細に考えていきましょう．
画像だと説明しにくいので自然言語で考えます．画像だと，単語がパッチになります．
ここでは，5単語あり，今回は”小説”について考えます．
![SelfAttention2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/81c0c7f3-ae93-04e3-9457-ee0a1f9b484c.png)
”小説”のQであるq2は各キーに対して，類似度を計算します．
![SelfAttention3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/5f625e60-4894-af0c-e050-aed246e3e878.png)
![SelfAttention4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/c4ebc032-2a03-38df-2f99-15de1f9ebfd7.png)
ここで出てきた値をSoftmaxします．
![SelfAttention5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/1db3f2d2-7c16-9aea-d61c-4ad34937b1d2.png)
その値を，それぞれのバリューと掛け合わせると，バリューの重み付け和が出ます．これが”小説”との関連性を表しています．
![SelfAttention6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/2b0e2270-6fc9-daab-742d-031114fc4ddf.png)
![SelfAttention7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/9bc22f2c-62b5-478c-cd81-d383a5a725ab.png)
今回”小説”との関係性が強い単語は”人気”と”小説”となりました．
![SelfAttention8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/083ac5a6-c232-800a-cae6-1338f3765e83.png)

# 3 Multi Head Self Attention
Multi Head Self Attention（MHSA）は，各単語に対して1組のQKVを用いるのではなく，複数作ってそれぞれで潜在表現を計算します．
複数用意することで，それぞれが異なる潜在表現の空間から有用な情報を取ってこれます．
![MultiHaedSelfAttention.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120757/a40e308e-fc63-aed2-e8af-6812c223361b.png)


# 4 Position Encoding
ここまでの構造で欠けているのは，順序の情報です．
Attentionだけでは位置情報が入らないので，位置情報を符号化して加えます．
ここは勉強中なのでまた今度まとめさせてください:sob:
なるはやで頑張るます:dark_sunglasses:


# さいごに
随時追記予定です．
私も勉強中の身なので，面白い技術があれば是非教えて欲しいです:hugging: