---
# System prepended metadata

title: Transformer

---

# Transformer

## 過去回
[第１回：NLP Outline](https://hackmd.io/uD2hEISAShqVHD6IRtceUw)
[第２回：Word2Vec](https://hackmd.io/T2QJsuwsROSQluklguDOow)
[第３回：Doc2Vec](https://hackmd.io/LIT2hp_jQ56Dvn-imOVemg)
[第４回：Seq2Seq](https://hackmd.io/UGLHXO6-RweY_Bys2Dp4mA)
[第５回：Seq2Seq Attention](https://hackmd.io/D8xqAyHjRte3A0oENtLXeQ)

## 元論文
https://arxiv.org/pdf/1706.03762.pdf

## 参考
Transformerの行列イラストが分かりやすい
http://jalammar.github.io/illustrated-transformer/
日本語では一番かも
http://deeplearning.hatenablog.com/entry/transformer
実装例が書いてある
https://qiita.com/halhorn/items/c91497522be27bde17ce
transfomerのTensorの流れが書いてある
https://qiita.com/FuwaraMiyasaki/items/239f3528053889847825
Layer-NormalizationとLabel smoothing についても触れている
https://qiita.com/omiita/items/07e69aef6c156d23c538
その他
https://deepsquare.jp/2020/07/transformer/

## 要点
* **RNN Encoder-Decoder + AttentionはNLP界を牽引して来たが、並列処理ができないという大きな欠点があった**
* **RNN をやめて ==Attention だけを使った==ものがTransformer**
* **基本的には、Seq2Seqの進化系**
* **BERTは、TransformerのEncoderだけを使ったモデル**

## 全体像
![](https://i.imgur.com/2aG48fX.png)

## Positional Encoding

![](https://i.imgur.com/KsTMJ9u.png)

* TransformerではRNNをやめた
* RNNでは、文章内の語順は、RNNへの入力の順番という形で学習されていた
* RNNをやめたら、その語順はどう学習できるのか？
* それを解決するのが、==Positional Encoding== である
* Positional Encoding では以下の式によって、==位置情報を追加==する

![](https://i.imgur.com/R4bM3il.png)

## Attention
[参考](http://deeplearning.hatenablog.com/entry/transformer)

### Seq2SeqにおけるAttention

![](https://i.imgur.com/zmDQWfa.png)

![](https://i.imgur.com/g07vFw4.png)

### Attention weight の算出方法

TransfomerやSeq2Seq Attention では==Dot-Product Attention==(右側)を使っている。こちらは、パラメータが無く、高速である利点がある。

![](https://i.imgur.com/ZOwEcag.png)

### Attention の種類

KeyとValueが同じ場合は==Source-Traget Attention==(左側)、全部同じInputを使う場合は ==Self-Attention== という。
Transformerでは、**EncoderではSelf-Attention**が、**DecoderではSource-Target Attention** が使われている。

![](https://i.imgur.com/XNqpMr7.png)

### ※別図Attention（FNNのDense Weight付き図）

[参考](https://qiita.com/halhorn/items/c91497522be27bde17ce#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA-attention)

![](https://i.imgur.com/hpojC7d.png)

![](https://i.imgur.com/Id0lwOh.png)

## Multi-head Self-attention mechanism

ここの説明
![](https://i.imgur.com/w1vu1Qb.png)

### Scaled Dot-Product (Self) Attention
![](https://i.imgur.com/XrGHSLq.png)

### Multi-head Attention

論文ではこんな絵

![](https://i.imgur.com/Su1nXTE.png)

自分なりに書くとこう。アンサンブル学習のようなもの。もしくはCNNのフィルター

![](https://i.imgur.com/PBDSz3z.png)

Multi-head Attention Weight を可視化するとこんな感じ
[参考](https://deepsquare.jp/2020/07/transformer/)

![](https://i.imgur.com/U7eIUFq.png)

### Add & Norm
Residual Block と Layer-Normalization が使われている。

CNNで例えると、Batch-NormalizationはBatch内のiチャネル に対して標準化されるが、Layer-Normalization は ==1 data 内の チャネルに跨って標準化==される。
Transformaer では、チャネルの数はインプットの単語数となる。

![](https://i.imgur.com/WGoPBUU.png)

Residual Block はResNetのそれ。

![](https://i.imgur.com/ALHNivq.png)

## Position-wise Feed-Forward Networks

ここの箇所. 
![](https://i.imgur.com/vuTsIm4.png)

単語の位置毎に共通のWeightを持ったFNNを使っている。

![](https://i.imgur.com/zvhfQgw.png)

![](https://i.imgur.com/gS0bkIT.png)

## Decoder Attention (Mask)

基本的にはEncoderと同じだが、未来の単語はMaskしないといけない。Seq2Seqの構造と同じである。ある単語の入力時点で計算されるLossは、それ以降の単語の情報を参照してはいけない。

![](https://i.imgur.com/Z3OmXdb.png)

### Mask

Softmax の入力の前に、未来の情報は-infに置き換えることでMaskする。-infにすると、Softmax の 変換で確率が0になるため。

![](https://i.imgur.com/KMCqMZ3.png)

## ※補足※Prediction

Decoder側でもSelf-Attentionしているので、予測した文字と、==それまでの文字も入力する必要がある==

![](https://i.imgur.com/TbTvWY3.png)
