[初学者] 2人のAIに教えてもらうTransformer

# はじめに

- Transformerとは現代のAIの礎とも言える、Attentionを使った翻訳モデルのことです。
- 今更ながら、改めてTransformerの構造を理解したいと思ったので2人のAI(?)、AIciaさんとChatGPTを仮想教師として勉強しました。

- 私のような初学者向けに、教科書的にまとめることを意識しました。これを見返せばまた理解できるよう、網羅的に情報を入れたつもりです。記事は主に[AIciaさんのTransformerの動画](https://youtu.be/50XvMaWhiTY?si=60t2HC7LlQlqmIKl)をベースに書いています。    


- 今回は以下のような学習手順を踏みました。この勉強法は爆速で理解が進んだので、ぜひみなさんも真似してください。
    1. AIciaさんのTransformerの動画を頭から終わりまで見る。
    2. 同動画をNotion上に写経しながら再度見る。この時疑問点はコメントで残しておく。
    3. 元論文を参照し、疑問点を解消していく。
    4. ChatGPTに[Jurafsky](https://web.stanford.edu/~jurafsky/slp3/)の教科書を食わせ、教授に質問する体で疑問点を解消する。
- 記事末尾に参考文献を載せておきます。特にJurafskyの教科書は無料でありながら網羅的かつわかりやすいので、おすすめです。(教科書を食わせたGPTを公開して良いのか判断がつかなかったため、今回はGPTへのリンクを載せておりません。)

# 1. Transformerとは

- 元論文:

    - [Attention Is All You Need](https://arxiv.org/abs/1706.03762)

- 強み:
    - どんなタスクにも応用可
        - BERT: 自然言語処理ならなんでも
        - GPT-n: 文章生成
        - ViT: 画像処理系
        - DALL-E: 生成系の画像のモデル
    - 元々は機械翻訳用のモデル
- 当時の成果
    - BLEUスコア大幅向上
        - 英語→ドイツ語 28.4 BLEU
        - 英語→フランス語 41.8 BLEU
    - RNN使わず、Attentionのみ利用
        - →並列計算できるので、高速学習&推論が可能に

# 2. モデル

## 2-1. 概要

- 目的: 機械翻訳
- 入力: 英文
- 出力: ドイツの次単語予測
    - →beam searchでドイツ文を出力
    - *beam search: 探索アルゴリズムの一種

## 2-2. 構造

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621082/7e653893-0ff6-2a72-57b4-97e581b1f64b.png)
*source: [元論文](https://arxiv.org/abs/1706.03762)*

- encoder: 文章→意味
- decoder: 意味→文章
- 3種類のブロック
    - Multi-Head Attention
        - 次章説明
    - Add & Layer Normalisation
        - Add: residual connectionを足す
            - Residual connectionとは?なぜTransformerに使われている?→ref: Appendix 2
        - Layer Normalisation: 学習高速化の工夫（正規化）
            - Batch normalisationのlayer版的な
    - Feed Forward Network
        - $FFN(x) = ReLU(xW_{1}+b_{1})w_{2}+b_{2}$

### 2-2-1. Encoder

- Encoder側の残りの部分
    - Embedding: 入力単語列をベクトルの列に
        - 厳密には単語ではなくサブアド
    - Positional Encoding:
        - 元の単語の位置を管理する工夫
        - Multi-Head Attentionだとその単語が何番目だったかという情報が失われてしまうので、
        - positional encodingという特殊なベクトルで何番目の単語だったかという情報を入力のembeddingに足してやる
        - sinとかcosの三角関数使う
    - x6やって出力
- Encoderの出力
    - 英語から意味を抽出した、入力単語と同じ数のベクトルの列
    

### 2-2-2. Decoder

- Embeddingの入力: 1つ前までのドイツ語列
    - これをベクトル列に変換
    - cf) 実際のtransformerがしているのは次単語予測 = 出力は$p(y_{i}|x_{1}, ...x_{n}, y_{1},...,y_{i-1})$
    - =今まで何書いたかに応じて次の単語を出す
    - →前までの単語も突っ込む
- 2個目のMulti head attentionにencoderの出力突っ込む
- x6やって出力
- Linear, softmax
    - linear: 今まで圧縮した世界でやっていたのを、線形変換によって単語の次元のベクトルに引き伸ばす
    - softmax: 確率(列)に

- 注意
    - Transformerでは横ベクトル
        - なのでベクトルの右に行列ある
- なぜこんなにシンプルなのに強いのか?
    - →Multi-Head Attentionのおかげ

# 3. Multi-Head Attention

- 強み
    - どの情報に注目すべきかを判断して情報を処理する&注目すべき場所がどんなに遠くても良い
    - Instead of one single attention mechanism, the Transformer uses multiple heads, allowing the model to focus on different parts of the input sequence simultaneously.
        - e.g.
            - 画像のどこに注目するか
            - 将棋の盤面のどこに注目するか

## 3-1. Scaled Dot-Product Attention

- 式: $Attention(Q, K, V) = softmax (\frac{Q^t\!K}{\sqrt{d}})V$
    - $Q=　\begin{pmatrix} \vec{q_{1}} \\ \vdots \\ \vec{q_{n}} \end{pmatrix}$: query
        - 横ベクトルが縦に並んだもの=入力
        - 横ベクトル一つ一つが入力
        - →n個分のデータのバッチ処理
    - $K=　\begin{pmatrix} \vec{k_{1}} \\ \vdots \\ \vec{k_{n}} \end{pmatrix}$
    - $V=　\begin{pmatrix} \vec{v_{1}} \\ \vdots \\ \vec{v_{n}} \end{pmatrix}$: keyとvalueのペア$(\vec{k_{i}}, \vec{v_{i}}) \times m$
    - 入力n個分の処理なので、まずは入力一つ分から見ていく→
- 入力1個の時: $Attention(\vec{q}, K, V) = softmax (\frac{\vec{q} ^t\!K}{\sqrt{d}})V$
    
    $$
    \begin{equation}\begin{split} \vec{q} ^t\!K  &= \vec{q}(^t\!\vec{k_{1}}, ^t\!\vec{k_{2}},..., ^t\!\vec{k_{n}}) \\ &= (\vec{q}^t\!\vec{k_{1}}, \vec{q}^t\!\vec{k_{2}},..., \vec{q}^t\!\vec{k_{n}})  \\ &= (\vec{q}\cdot \vec{k_{1}}, \vec{q}\cdot\vec{k_{2}},..., \vec{q}\cdot\vec{k_{n}}) \end{split} \end{equation}
    $$
    
    - 式解説
        - (1)式: 内積が並ぶ
            - 内積は類似度なので、queryとkeyおん類似度を並べたベクトル
                - cf) 2つのベクトルが同じ向き→内積: 大, 別の向き(90度)→0, 逆の向き→-大
        - $\sqrt{d}$: 次元の高いベクトルは長いので割って補正
            - ここでは純粋に類似度だけ知りたいので、補正してやる
        - softmax: 類似度を合計1の重みに変換
        - $softmax (\frac{\vec{q} ^t\!K}{\sqrt{d}})V=\vec{p}V=\sum p_{i}\vec{v_{i}}$
    - まとめ:
        - $Attention(\vec{q}, K, V)$ではqueryとkeyの類似度を計算し、それに応じた重みでvalueを足している。
        - e.g. query $q$が$k_{i}$に似ていた場合、$k_{i}$との内積だけが大きくなり、出力はほぼ$\vec{v_{i}}$になる。
- →入力n個のqueryの場合は?
    - $Attention(Q, K, V)= softmax (\frac{Q^t\!K}{\sqrt{d}})V = \begin{pmatrix} p_{11}\vec{v_{1}}+...+ p_{1m}\vec{v_{m}}\\  \vdots \\p_{n1}\vec{v_{1}}+...+ p_{nm}\vec{v_{m}} \end{pmatrix}$
    - ↑横向きにsoftmax
    - =keyとvalueの学習が超重要. この学習をいい感じにやってくれるのがMulti-Head Attention

## 3-2. Multi-Head Attention

- Concept:
    - Multi-head attentionは ”heads”と呼ばれる複数の並列attention構造からなる。
    - 各ヘッドは入力シーケンスの異なる部分に注意を払うことを学習し、シーケンスに含まれる情報の様々な側面を捉える。
- 式:

$$
\begin{equation} \begin{split}Multi-Head(Q,K,V)&=concat(head_{i})W^{o} \\ head_{i} &= Attention(QW_{i}^{Q}, K W_{i}^{K}, VW_{i}^{V}) \end{split} \end{equation}
$$

- 中身解説:
    - Step1. W: ただの行列かける
    - Step2. Attentionやる
    - Step3. concat: 横ベクトルを横に繋げて永井ベクトルにする
    - Step4. 行列描ける
- なぜStep1で行列をかけるのか?
    - Multi-Head Attentionの入力は$X$

        ![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621082/7a5a2804-3448-766e-b888-b2761eb4b43c.png)
        *source: [元論文](https://arxiv.org/abs/1706.03762)*
        
        - そのままだと$V=K=Q=X$を入れる
            - →入力$Q=X$はまだしもVもKもX, これは同じものの類似度を測ることになるのでおかしい
            - → 行列かけてベクトルを回転させてやる
    - $W _{i}^Q$: Xのどの部分を処理するかを決める
    - $W _{i}^K$: Xのどの部分に注目するか（見る角度）を決める
    - $W _{i}^V$: 出力をどんなふうにするのかを決める=情報伝達力up
- Attention Mechanism in Each Head
    - 各HeadのAttentionはscaled dot-product attention mechanismを用いて計算される
    - 各トークンに対する出力はValueベクトルの重み付き和であり、その重みはそのトークンのQueryベクトルと全Keyベクトルの内積によって決まる。
- なぜMulti-Head Attentionを使うのか?
    1. Diverse Feature Capturing (多様な特徴の捕捉ができる)
        - 異なるHeadがデータ内の異なるタイプの関係に注目することができる。例えば、あるHeadは構文的な側面に注目し、別のHeadは意味的な関係を捉えることができる。
        - e.g.
            - Head 1: 文章の主語に注目
            - Head 2: 動作や動詞に注目
            - Head 3: 文脈や位置関係に注目する。
    2. Increased Model Capacity (モデル容量の増加)
        - Q, K, V行列のセットを複数持つことで、モデルはより多くのパラメータを持つことができ、計算の複雑さを大幅に増加させることなく、より大きな学習能力を持つことができる。
    3. Parallel Processing (並列処理)
        - 各Attention Headが並列に動作するため、計算効率が向上する。
- まとめ:
    - 様々な角度からXの横ベクトルを比較し、どこに注目するかを制御して出力を決定するのがMulti-Head Attention
    - それによってTransformerは複雑なシーケンスを効率的かつ効果的に処理し、解釈することができる。

# Appendix 1

- Masked Multi-Head Attention
    - Decoderで後ろの単語の情報から前の単語への流入をブロック
- DecoderでのAttention

    ![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621082/b8021c24-309d-46d4-07e2-e38ad5f832ba.png)
    *source: 元論文, 入力は左からV, K, Q*

    
    - 英語の出力をv, k に、ドイツ語をQに
        - key: 英文の情報処理の結果を元に注目する場所を決め、
        - value: 英文の情報処理の結果を組み合わせて出力する。

# Appendix 2: Residual Connection

Skip connectionとも呼ばれるresidual connectionは、Transformerを含むディープ・ニューラル・ネットワークで使われるテクニックで、ディープ・ネットワークのトレーニングでよくある問題である勾配の消失の問題を緩和するのに役立つ。ここではresidual connectionとは何か、なぜTransformerモデルで重要なのかを探る。

## Appendix 2-1. Residual Connectionとは

**基本概念:** 

- 残差接続では、レイヤーへの入力はそのレイヤーの出力に直接追加される。
- 通常、これは、1つまたは複数のレイヤーをバイパスするショートカットまたは”skip” connectionによって実現される。

**Transformerでの実装：**

- Transformerブロックでは、Self-attention層（同様に、後続のフィードフォワード層）の出力は、次の層に渡される前に、その層への入力が追加される。
- 図解:
    
    ```markdown
    Input -> [ Layer ] -> Output
       |_____________________↑
    ```
    
    - このダイアグラムでは、入力は "Layer"（Self-attentionレイヤーやTransformerブロックのフィード・フォワード・レイヤーの可能性もある）を通り、そのレイヤーの出力に加えられる。この加算結果は次のレイヤーに渡される。

## Appendix 2-2. なぜResidual Connectionsを使うのか

1. Vanishing Gradients(勾配消失)の緩和
    - ディープ・ニューラル・ネットワークは勾配の消失に悩まされることがある。勾配が小さくなりすぎると、特に初期の層では効果的な学習ができなくなる。
    - Residual connectionは、勾配がネットワークに直接流れるようにすることでこれを軽減し、より深いモデルの学習を容易にする。
2. Preserving Information (情報の保存)
    - データが複数の層を通過するとき、いくつかの情報が失われることがある。Residual connectionは、層を超えて情報を伝達することで、この情報を保持するのに役立つ。
3. Easing the Training of Deep Networks (学習を容易にする)
    - 勾配の流れに直接経路を提供することで、各層が損失関数からの勾配と元の入力信号に直接アクセスできるため、residual connectionはより深いネットワークの学習を容易にする。
4. Enabling Deeper Architectures (より深いアーキテクチャの実現)
    - residual connectionがなければ、特徴の再利用が減少し、勾配が消失するため、非常に深いネットワークのトレーニングは現実的ではない。residual connectionは、Transformerのような、より深く強力なモデルの作成を可能にする。

つまり、Transformerモデルのresidual connectionは、層間の勾配の流れや情報の保存を改善することで、深いアーキテクチャの学習を可能にする上で重要な役割を果たしている。これはより効果的な学習につながり、特にNLPで遭遇するような複雑なタスクにおいて、深層学習モデルの成功の重要な要因となっている。

# 感想
- AIciaさんの動画はやっぱりすごい。数学的な部分の説明であっても、直感的な理解まで落とし込んでくれるので腹落ちしまくりです。
- GPTに教科書読ませる勉強法は学習効率を1000倍に上げる。いくら質問しても辟易せず、理解できるまで丁寧に噛み砕いて説明してくれる聖人大学教授が24時間サポートしてくれる感じ。みなさんもぜひ試してみてください。

# Reference
- AIciaさんのTransformer解説動画: https://youtu.be/50XvMaWhiTY?si=MKAK4J7-mUsmcikc
- 元論文 "Attention Is All You Need": https://arxiv.org/abs/1706.03762
- Jurafsky, "Speech and Language Processing" ((NLPの教科書): https://web.stanford.edu/~jurafsky/slp3/