Transformer 関して

# 概要
2017年にGoogleを中心とした研究チームが'Attention is all you need'という論文を発表

Attensiton機構のみを採用することで長距離の関係を効率的に学習することが可能

近年の大規模言語モデルで一般的に利用されているモデル構造

## 構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/3a895dae-2f8c-7e69-bb3b-ff07f1280309.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用し、一部改変

Transformerは、**Encoder-Decoder構造**を持っており、主に以下の2つの部分から構成されます：

翻訳タスクの場合
- **Encoder**: 翻訳元の言語の入力機構を持つNN
- **Decoder**: 翻訳先に出力機構と再帰的な入力機構を持つNN

GPTなどは、デコーダのみで構成されてたりします。

### モデルの構造の解説
### 1. **Embedding**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/3ba9cf2b-4c16-9988-d616-c89940a34de6.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用し、一部改変

ここでは、テキストをtransformerの入力値として扱えるように**単語のベクトル変換**を行う。

#### 1. テキスト → トークン
- **テキストの分割**: まず、テキストを「単語」や「サブワード」に分割します。

**例**:  
テキスト: `"今日は天気が良いです。"`  
    トークン: `["今日","は","天気", "が", "良い", "です", "。"]`

#### 2. トークン → トークンID
- **辞書に変換**: 各トークンをモデル内の辞書（Vocabulary）で対応する数値（トークンID）に変換します。

**例**:  
**トークン**: `["今日", "は", "天気", "が", "良い", "です", "。"]`  
**トークンID**: `[1234, 5678, 910, 1123, 1415, 6789, 678]`  
（ここでは辞書内の位置に応じたIDに変換されます）

#### 3. トークンID → One-hotベクトル
- **One-hotエンコーディング**: トークンIDを、辞書全体のサイズを持つベクトルに変換します。トークンIDがある場所には「1」を、それ以外は「0」を持つベクトルです。

**例**:  
トークンID: `1234` → One-hotベクトル: `[0, 0, 0, ..., 0, 1, 0,...,0,0]`  
1234番目だけ1が入り、その他は0

#### 4. One-hotベクトル → 埋め込みベクトル (Embedding)
- **埋め込み層（Embedding layer）による変換**: One-hotベクトルは非常に大きく扱いにくいので、これを学習済みの意味情報を含む低次元のベクトルに変換します。これが **埋め込みベクトル** です。このベクトルは、単語やフレーズの意味や文脈を反映しています。

**例**:  
One-hotベクトル → 埋め込みベクトル: `[0.28, -0.67, 0.11, ...]`  

#### 5. Positional Encoding(PE)
word Embeddingに位置情報を追加する。
まだ、**"今日は天気が良いです"と"です良いが天気は今日"** が同じです。そこで、単語の埋め込みを入力する際に、順序情報を内蔵させるために、位置情報を追加する。

[2] Raimi Karim (2019) https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a/ より引用

**例**:
WE("今日")+PE("1番目")
WE("は")+PE("2番目")
WE("天気")+PE("3番目")
WE("が")+PE("4番目")
WE("良い")+PE("5番目")
WE("です")+PE("6番目")
WE("。")+PE("7番目")

### 2. **Multi-head Attention**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/f5013b98-400e-60f9-fadf-c45d3e0371b8.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用し、一部改変

**アテンション機構**：全トークンと類似度を図ることで**長距離の関係**を理解できる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/9c914c66-7185-f8db-a27d-bb3202b8da85.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017
**数式の整理**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/a37c69e1-adb0-0a89-b922-f16a4153523b.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017

**Q:Queryベクトル**
**K:Keyベクトル**
**V:Valueベクトル**
**dk:ベクトルの次元数**

1. inputした全トークンのベクトル表現をから、線形変換にて、keyベクトルとValueベクトルを作成

2. 第一トークンを線形変換にてQueryベクトルを作成
3. 第一トークンのQueryベクトルと全トークンのkeyベクトルの内積をだし、ベクトル間の類似度を測る。
4. 類似度をsoftmaxにて正規化を行う。（合計が１になる）
5. それぞれの類似度とValueベクトルの掛け算を行う。
6. すべてのベクトルの総和を取る。これが第一トークンがoutputされる（valueベクトルの加重平均を算出したことになる）
7. 2から6までを第二トークン、第三トークンも同じように続ける。

まとめると、**全単語と繋がれること**と重要なトークンがどこか分かるので、**遠距離の依存関係が把握できること**、**勾配消失問題が発生しないこと**。がアテンション機構の良い点である。


### 3.**Feed Forward**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/84e2e40a-248f-7e99-47ca-0dd0ee3c079e.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用

**数式の整理**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/80d26e98-491b-1358-a8fc-8fdcaf6210da.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用

**W1とW2：重みの行列**（学習パラペータ）
**b1とb2：バイアス**（学習パラペータ）
**max(0,x):ReLU**（活性化関数）

入力データに重みをかけて線形変換して、活性化関数ReLUで非線形性の追加をする。もう一度、線形変換する。

ReLeで活性化している2048次元の中間層と512次元の出力層の二層の全結合ニュートラルネットワーク


4.**Add ＆ Norm**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889006/44266aca-2a31-ef0c-94aa-77e382983ea4.png)
[1] Ashish Vaswani et al. (2017), “Attention Is All You Need”, NeurIPS2017 より引用し、一部改変
#### Add:残差接続（residual connection)
残差接続とは、ブロックをスキップして接続するものである。AttensitonやFeed Forwardを通る経路と、通らない経路の2つができるため、**ブロックの多層化**ができる。

Feed forwardの前後で残差接続
attensionの前後で残差接続

#### Norm：レイヤの正規化(Layer Normalization)
中間層の次元軸で平均と分散を取り正規化



## 参考文献
[1]Ashish Vaswani et al. (2017),https://user.phil.hhu.de/~cwurm/wp-content/uploads/2020/01/7181-attention-is-all-you-need.pdf ,NeurIPS2017
[2] Raimi Karim (2019) https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a
アクセス日：2024/9/20
[3]https://cvml-expertguide.net/terms/dl/inter-layer-connection/residual-connection/ アクセス日:2024/9/20