# Transformer：「RNN を捨てたらどうなる？」から積み上げる

---

## この資料の位置づけ

この資料は [Week 12「系列モデリングと Attention」](./towards_deeplearning4.md)で生まれた問い——**「Attention が本質なら RNN は本当に必要か？」**——を継承し、その問いに答える形で Transformer を積み上げます。問いが解決するたびに新しい問いが生まれ、最終的に Transformer の全体像が「必然的な帰結」として完成します。

---

## 学習目標

1. RNN の逐次処理がなぜ並列化の障壁になるかを説明できる。
2. Positional Encoding が「RNN を取り除くことで失われる語順情報」を補う仕組みを説明できる。
3. Self-Attention の計算手順（Q/K/V → スコア → softmax → 加重和）を追うことができる。
4. Multi-Head Attention が「複数の注目パターンを並列に学習する」設計であることを説明できる。
5. Add（残差接続）と Layer Normalization が深い積み重ねを安定させる理由を説明できる。
6. Transformer の Encoder-Decoder 構造で「Masked Self-Attention」と「Cross-Attention」の役割を区別できる。

---

## 振り返り：Week 12 の残課題

### 技術の地図の現在地

| 回 | テーマ | 技術 |
|:---:|:---|:---|
| 11 | 言語モデル | n-gram → Perplexity → neural LM の示唆 |
| 12 | 系列モデリングと Attention | RNN → seq2seq → Attention |
| **13** | **Transformer** | **Positional Encoding・Self-Attention・Multi-Head・Add&Norm・FFN** |
| 14 | 事前学習・多段階学習・RAG | Transformer ベース事前学習 → SFT → RAG |

### Week 12 で「解決した」こと・「残った」こと

Week 12 では seq2seq + Attention によって「長い文でも動的に参照位置を変えられる」問題を解決しました。

しかし、根本的な問題が1つ残っていました。

```
Encoder（RNN）:
  h_1 が確定してから h_2 を計算
  h_2 が確定してから h_3 を計算
  ...（T ステップ、全て直列）
```

RNN は前のステップの出力を使って次のステップを計算するため、**並列化できません**。現代の大規模コーパス（数十億トークン）では、この逐次処理が学習速度の根本的なボトルネックになります。

一方、Attention スコア $e_{t,i}$ は「Decoder の状態 $h'_t$ と Encoder の隠れ状態 $h_i^{enc}$ という2つのベクトルの関連度」で算出します。この計算は $h'_t$ と $h_i^{enc}$ の全ての $(t, i)$ の組み合わせについて RNN に依存せず独立に行えるため、行列積として一括計算できます。つまり、RNN + Attention というアーキテクチャでは RNN 側がネックとなり全体を並列化できません。

> **今日の出発点となる問い**：RNN を取り除いて、Attention だけで再設計できないか？

---

## RNN を取り除くと何が失われるか

### Attention スコアは並列計算できる

Week 12 の Attention スコアを振り返ります。

$$e_{t,i} = \mathbf{v}^\top \tanh(W_1 h'_t + W_2 h_i^{enc})$$

この計算の本質は「2つのベクトル（Decoder の状態 $h'_t$ と Encoder の隠れ状態 $h_i^{enc}$）の関連度を数値化すること」です。全ての $(t, i)$ ペアを独立に計算できるため、行列積として一括処理できます——RNN の逐次依存はありません。

では RNN を取り除いてみましょう。本来ならばRNNブロックの行列で2つの線形変換（$W_h \cdot h_{t-1} + W_x \cdot x_t + b$）が入ります。これに対してRNNブロックを取り除くと、入力トークン列 $(x_1, x_2, \ldots, x_T)$ を埋め込みベクトル列 $(e_1, e_2, \ldots, e_T)$ に置き換えるだけで、線形変換することなくそのまま Attention スコアを計算することになります。

### RNNがないと語順情報が消える

線形変換を経ずに Attention スコアを計算してしまうと、問題があります。

```
入力列A: 「猫  が  走る」 → 埋め込み: (e_猫, e_が, e_走る)
入力列B: 「走る 猫  が」  → 埋め込み: (e_走る, e_猫, e_が)
```

本来のAttention スコアは「どの単語と単語を比較するか」で決まります。しかしながら線形変換を経ていない単語埋め込みだけでスコアを算出しようとすると、「どの位置に現れるか」は無視されます。このため上記の入力列AとBは区別することができません。

RNN は「左から右へ順番に処理する」ことで、位置が隠れ状態に暗黙的にエンコードされていました。それを素朴に取り除くと**語順情報が失われます**。

> **問い①**：語順情報を失わずに並列計算するには？

もう一つの損失もあります。RNN の隠れ状態 $h_t$ は「それまでの全トークンの情報を統合した表現」でした。「走る」の $h_3$ には「猫」「が」の情報が既に織り込まれています。RNN を取り除くと、各トークンの埋め込み $e_t$ は「自分自身の意味」しか持ちません——**他のトークンとの関係はまだ計算されていない**のです。

> **問い②**：各トークンが同じ系列内の他のトークンを参照し、文脈を取り込むには？

これらの問いについて1つずつ解決案を見ていきます。

---

## Positional Encoding：位置情報を埋め込みに加える

### 解決策のアイデア

RNN が「処理順序」から位置を得ていたなら、**位置情報を直接埋め込みベクトルに加算**すればよいのでは？

$$\tilde{e}_t = e_t + PE(t)$$

$PE(t)$ は「トークンが $t$ 番目に現れる」ことを表す固定ベクトルです。

![Positional Encoding](./figs/pos-encoding.png)

### 正弦波による Positional Encoding

Vaswani et al. (2017) は次の正弦波方式を提案しました。

$$PE_{(t,\, 2i)} = \sin\!\left(\frac{t}{10000^{2i/d}}\right), \quad PE_{(t,\, 2i+1)} = \cos\!\left(\frac{t}{10000^{2i/d}}\right)$$

- $t$：位置（0, 1, 2, …）
- $i$：次元ペアインデックス（0 から $d/2 - 1$）
- $d$：埋め込み次元

**読み方**：$PE_{(t, 2i)}$ は「位置 $t$ の固定ベクトル（$d$ 次元）のうち、第 $2i$ 番目の要素（1つのスカラー）」です。$i$ の値ごとに sin / cos の周波数が変わり、そのスカラーを $d$ 次元分並べることで位置ベクトルが完成します。

```
d = 8 次元の場合の PE(t=1) の例:

インデックス  i   値の計算式                    値（t=1）
   0番目   (i=0)  sin(1 / 10000^(0/8))  = sin(1)    ≈ 0.841
   1番目   (i=0)  cos(1 / 10000^(0/8))  = cos(1)    ≈ 0.540
   2番目   (i=1)  sin(1 / 10000^(2/8))  = sin(0.178) ≈ 0.177
   3番目   (i=1)  cos(1 / 10000^(2/8))             ≈ 0.984
   4番目   (i=2)  sin(1 / 10000^(4/8))  = sin(0.01) ≈ 0.010
   5番目   (i=2)  cos(1 / 10000^(4/8))             ≈ 1.000
   6番目   (i=3)  sin(1 / 10000^(6/8))             ≈ 0.001
   7番目   (i=3)  cos(1 / 10000^(6/8))             ≈ 1.000

→ PE(t=1) = [0.841, 0.540, 0.177, 0.984, 0.010, 1.000, 0.001, 1.000]（8次元ベクトル）
```

**各ペアが異なる周波数で振動**します：$i$ が大きくなるほど $10000^{2i/d}$ が大きくなり、sin/cos の振動が遅くなります（低周波）。低インデックスの成分は位置の細かい違いを、高インデックスの成分は大まかな違いを表します。異なる周波数の組み合わせにより、**全ての位置 $t$ に対して一意なベクトルが生成**されます。

```{tip}
**正弦波を選ぶ理由**

原論文（Vaswani et al., 2017）では、正弦波を選んだ主な根拠として**線形変換性**を挙げています。三角関数の加法定理から：

$$\sin\!\left(\frac{t+k}{\omega_i}\right) = \sin\!\left(\frac{t}{\omega_i}\right)\cos\!\left(\frac{k}{\omega_i}\right) + \cos\!\left(\frac{t}{\omega_i}\right)\sin\!\left(\frac{k}{\omega_i}\right)$$

固定オフセット $k$ に対して $PE(t+k) = R(k) \cdot PE(t)$ と書けます（$R(k)$ はブロック対角の回転行列）。係数は $k$ のみに依存し、絶対位置 $t$ には依存しません。整数列では $PE(t+k) = PE(t) + k$ という**加算**はできますが、$PE(t)$ を入力とする行列変換（回転）にはなっていません。

原著者の主張：*「固定オフセット $k$ に対して $PE(t+k)$ が $PE(t)$ の線形変換で表せるため、モデルが相対位置に基づく注目パターンを学習しやすい」*

**有界性：系列長によらず埋め込みの大きさが一定**

$$\|PE(t)\| = \sqrt{d/2} \quad \text{（$t$ に無関係に一定）}$$

$\sin, \cos$ の値域は $[-1, 1]$ に収まるため、PE ベクトルのノルムが位置によらず常に一定です。整数列では $\|PE(t)\| = |t|$ となり、系列が長くなるほど PE が埋め込み全体を支配し、学習の不安定化や長文での性能低下につながります。

**【発展】相対距離とアテンションスコアの限界**

和積公式から、生の PE ベクトル同士の内積は：

$$PE(t)^\top PE(t') = \sum_i \left[\sin\frac{t}{\omega_i}\sin\frac{t'}{\omega_i} + \cos\frac{t}{\omega_i}\cos\frac{t'}{\omega_i}\right] = \sum_i \cos\frac{t - t'}{\omega_i}$$

右辺は相対距離 $(t - t')$ のみに依存します（整数列では $t \cdot t'$ で絶対位置の積に依存）。しかし実際のアテンションスコアは $(e_t + PE(t))$ から作った $q_t, k_i$ の内積であり、展開するとトークン埋め込みとの交差項が現れます：

$$q_t^\top k_i = \underbrace{e_t^\top W^Q (W^K)^\top e_i}_{\text{内容×内容}} + \underbrace{e_t^\top W^Q (W^K)^\top PE(i)}_{\text{内容×絶対位置}} + \cdots$$

交差項が絶対位置に依存するため、**相対距離のみに依存するという性質は実際のスコアには引き継がれません**。この問題を完全に解決したのが **RoPE**（Su et al., 2021）で、加算ではなく回転操作を用いることで $q_t^\top k_i$ が厳密に $(t-i)$ のみに依存するよう設計されています。

**性質の比較**：

| 性質 | 正弦波 PE | 整数・線形スケール |
|:---|:---:|:---:|
| $PE(t+k)$ が $PE(t)$ の線形変換（回転） | ✓ | ✗ |
| 系列長によらず値が有界 | ✓ | ✗ |
| 外挿性（訓練長以上に適用可） | ✓ | ✗ |
| $q^\top k$ が厳密に相対距離のみに依存 | ✗ → RoPEで解決 | ✗ |

```

最近の LLM では RoPE（Rotary Position Embedding）など、位置の相対的な関係を内積の中に組み込む方式も広く使われています。

問い①**解決**。語順情報が $\tilde{e}_t = e_t + PE(t)$ で保持されます。

---

## Self-Attention：系列内で互いを参照する
```
（再掲）問い②：各トークンが同じ系列内の他のトークンを参照し、文脈を取り込むには？
```

### Cross-Attention から Self-Attention へ

Week 12 の Attention（Cross-Attention）では、**Decoder の状態** が **Encoder の全状態** を参照しました。

Self-Attention はそのアイデアを同じ系列内に適用します——各トークンが**同じ系列内の全トークン**を参照します。これにより「文脈」を構築することができるようになりました。

![cross-attention vs self-attention](./figs/cross-self-attention.png)

```
Cross-Attention（Week 12）:
  Decoder の h'_t  ←参照→  Encoder の h_1^{enc}, ..., h_T^{enc}

Self-Attention（今日）:
  系列の e_t  ←参照→  同じ系列の e_1, ..., e_T
```

### Q / K / V フレームワーク

各トークンの埋め込みを3つの役割に線形変換します。

| 記号 | 読み方 | 意味 | 変換 |
|:---:|:---|:---|:---|
| **Q** | Query（質問） | 「私は何を探しているか」 | $Q = \tilde{E} W^Q$ |
| **K** | Key（鍵） | 「私はどんな情報を持っているか」 | $K = \tilde{E} W^K$ |
| **V** | Value（値） | 「実際に取り出す情報」 | $V = \tilde{E} W^V$ |

$\tilde{E} \in \mathbb{R}^{T \times d}$ は PE 付き埋め込み行列、$W^Q, W^K, W^V \in \mathbb{R}^{d \times d_k}$ は学習可能なパラメータです。

```{note}
**$W^Q, W^K, W^V$ は全位置で共通（並列処理の根拠）**

$Q = \tilde{E} W^Q$ は「$T$ 個のトークン埋め込み全てに、同一の $W^Q$ を一括適用する」ことと等価です。$W^K, W^V$ も同様です。Add & Norm の $\gamma, \beta$ や FFN の $W_1, W_2$ も全位置で共通です。

RNN も $W_x, W_h$ が全時刻で共通という同じ設計思想を持ちます。決定的な違いは「位置間に逐次依存がない」点：RNN はステップ $t$ が終わってから $t+1$ を計算しますが、Self-Attention は全 $T$ トークンに **同時並列** で同じ変換を適用できます。
```

### Scaled Dot-Product Attention

$$\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) V$$

- ① Query と Key の類似度を計算してスケール調整
- ② softmaxで重みに変換
- ③ Valueの加重平均を取る

**計算手順：**

**Step 1**: スコア行列を計算 $\quad S = QK^\top \in \mathbb{R}^{T \times T}$

$S_{t,i}$ = トークン $t$（Query）とトークン $i$（Key）の内積 → 「$t$ が $i$ にどれだけ注目すべきか」のスコア

**Step 2**: スケール $\quad S' = S / \sqrt{d_k}$

```{note}
**なぜ $\sqrt{d_k}$ で割るか**

$d_k$ 次元のランダムベクトル同士の内積の分散は $d_k$ に比例します。
次元が大きいと内積の値が大きくなり、softmax が極端な分布（ほぼ one-hot）になります。
$\sqrt{d_k}$ で割ることで分散を 1 に正規化し、softmax が均衡した分布を保てるようにします。
```

**Step 3**: softmax で正規化 $\quad A = \text{softmax}(S') \in \mathbb{R}^{T \times T}$

各行が確率分布（行和 = 1）。$A_{t,i}$ は「トークン $t$ がトークン $i$ に注目する重み」。

**Step 4**: 加重和 $\quad \text{出力} = A \cdot V \in \mathbb{R}^{T \times d_k}$

各トークンの出力 = 全トークンの Value を Attention 重みで加重平均したベクトル。

**具体例**：

```
"The animal didn't cross the street because it was too tired."
                                            ↑
  "it" の Q が "animal" の K と高いスコア
  → A_{it, animal} が大きい（"it" は "animal" を強く参照）
  → "animal" の V が "it" の出力に大きく寄与
  → "it" の出力ベクトルに "animal" の情報が多く含まれる
  → 代名詞の照応関係が自然に捉えられる
```

問い②（各トークンが同じ系列内の他のトークンを参照し、文脈を取り込むには？）**解決**。

### RNN との比較

| 性質 | RNN | Self-Attention |
|:---|:---|:---|
| 情報経路の長さ | $O(T)$（$T$ ステップ直列） | $O(1)$（1ステップで全ペアを直接参照） |
| 並列計算 | 不可（$h_t$ は $h_{t-1}$ が確定してから） | 可能（全ペアを行列積で一括処理） |

RNN は $T$ ステップを直列に実行するため、**GPU の並列演算を活かせません**。Self-Attention は全 $T^2$ ペアを1つの行列積で並列処理できるため、GPU では実際の処理時間が大幅に短くなります。

ここまでの流れをまとめると、RNNブロック削除に伴う2つの問題のうち、①語順問題は Positional Encoding で解消されました。そして②同じ系列内を参照した文脈構築は Self-Attention で解消されました。この2つの技術はどちらも「全てのトークンに対して同時に処理する（並列処理）ことが可能」であり、劇的に計算効率が向上することになりました。

---

## Multi-Head Attention：複数の視点を並列に

Positional Encoding と Scaled Dot-Product Attention の導入により「RNNなしでも位置情報を保持しつつ文脈を捉える」ことが可能になりました。しかし実はまだ問題が残っています。

### 未解決問題：1つの Attention ヘッドの限界

Scaled Dot-Product Attention は1種類の「注目パターン」しか学習できません。実際のテキスト理解には、同時に複数種類の関係が必要です。

```
"The trophy didn't fit in the suitcase because it was too big."

同時に捉えたい関係:
  ① "it" → "trophy"（代名詞の照応）
  ② "fit" → "suitcase"（動詞-目的語の関係）
  ③ "big" → "trophy"（形容詞が修飾する名詞）
```

> **未解決問題（問い③）**: 同時に複数種類の関係を把握したい。

### Multi-Head Attention の計算

![multi-head attention](./figs/multihead-attention.png)

$h$ 個の「ヘッド」を並列に走らせ、それぞれが独自の視点を学習します。

$$\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h) \cdot W^O$$

$$\text{head}_j = \text{Attention}(Q W_j^Q,\; K W_j^K,\; V W_j^V)$$

- 各ヘッド $j$ は独自の射影行列 $W_j^Q, W_j^K, W_j^V \in \mathbb{R}^{d \times d_k}$ を持つ（$d_k = d / h$）
- $h$ 個のヘッドを結合（Concat）して $W^O \in \mathbb{R}^{h d_k \times d}$ で射影

```{note}
**ヘッドの解釈に注意**

「ヘッド1が照応を担当、ヘッド2が係り受けを担当」という役割分担は学習の結果であり、
設計時に指定するものではありません。解釈可能性研究では一部のヘッドが特定の言語的関係に
特化することが観察されていますが、全てのヘッドが明確な役割を持つわけではありません。
```

**Vaswani et al. (2017) の標準設定**：$h = 8$、$d = 512$、$d_k = 64$

**Single-Head vs Multi-Head の比較**：

| 方法 | ヘッド数 | 各ヘッドの次元 | 効果 |
|:---|:---:|:---:|:---|
| 1ヘッド | 1 | $d$ | 1種類の関係パターン |
| Multi-Head | $h$ | $d/h$ | $h$ 種類の関係パターンを独立に学習 |

計算量はほぼ同じ（$d_k = d/h$ なので全ヘッドの合計次元 = $d$）ですが、表現力が増します。

マルチアテンションに拡張することで未解決問題（同時に複数種類の関係把握）が**解決**。次はこれまでにも登場した勾配消失問題です。

> **問い④**：Multi-Head Attention を $N$ 層重ねて「深い」モデルにするとき、勾配消失は起きないか？

---

## Add & Norm：深さ方向の安定化

各サブ層（Self-Attention や FFN）の出力に**残差接続**（Add）と**Layer Normalization**（Norm）を適用します。

$$\text{出力} = \text{LayerNorm}(x + \text{Sublayer}(x))$$

**Add（残差接続）**：

- 入力 $x$ をサブ層の出力に加算して「バイパス」を作る
- 逆伝播時に勾配がバイパスを直接通る → 深い層にも勾配が届く
- Week 10 の ResNet と同じ設計原理

**Norm（Layer Normalization）**：

$$\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \varepsilon}}, \qquad y_i = \gamma\, \hat{x}_i + \beta$$

- 各サンプルの特徴次元方向で平均・分散を正規化
- $\gamma, \beta$ は学習可能なスケール・シフトパラメータ
- バッチサイズや系列長に依存しないため、可変長系列の NLP に適合

問い④（勾配消失問題）が**解決**。

## Feed-Forward Network（FFN）

Self-Attention が「どのトークンからどの情報を集めるか」を決め、各トークンの表現が文脈を反映した混合表現になりました。しかしこの混合は Value の加重平均（線形な操作）です。先ほどの Add & Norm を導入することでアテンション機構を積み重ねても学習することはできるようになったのですが、線形変換だけを積み重ねる操作ではモデルの自由度は向上しません。例えば、「it が trophy に相当し、trophy は物理的に大きい」のような、混合後の情報を使った非線形な推論は実現困難です。

**FFN は非線形変換によりモデルの表現力を高め、「集めた情報で何を計算するか」を担当します。**

各 Attention 層の後に位置する 2 層の全結合NN：

$$\text{FFN}(x) = \text{ReLU}(x W_1 + b_1)\, W_2 + b_2$$

- Transformer原論文ではReLUだが、最近のLLMではGELUやSwiGLUなど別の活性化関数に置き換えられていることが多い。
- $W_1 \in \mathbb{R}^{d \times d_{ff}}$、$W_2 \in \mathbb{R}^{d_{ff} \times d}$（通常 $d_{ff} = 4d$）
- 全位置に**同じ重みを適用**（位置不変、RNN の重み共有と類似した設計）

**Self-Attention と FFN の役割分担**：

| | Self-Attention | FFN |
|:---|:---|:---|
| 処理の対象 | 位置間の関係（どこを・どれだけ参照するか） | 各位置の表現の変換（集めた情報で何を計算するか） |
| 位置間の依存 | あり（全ペアを参照） | なし（各位置を独立に処理） |

「何を取り出すか」に相当するのは V（Value）です。FFN の役割はそれとは異なります。Self-Attention が「情報の選択と混合」なら、FFN は「混合後の情報に対する推論・変換」です。

繰り返し用いている例文で考えると：

```
"The trophy didn't fit in the suitcase because it was too big."

Self-Attention:
  "it" は "trophy"（高い重み）と "suitcase"（低い重み）などを参照
  → "it" の出力ベクトルに "trophy" の情報が多く混ざる
    （V（Value）の加重平均）

FFN:
  "it が trophy に相当する" という混合済みの表現を受け取り
  → "trophy は物理的な物体" "big という形容詞が係る" などの
     パターンを非線形変換で強化・整理する
```

FFN は Self-Attention が「誰を参照するか」を決めた後、その「混合結果に対して何を計算するか」を担当します。

### 1つの Encoder ブロック

```
                        次ブロックへ
                              ↑
                        LayerNorm
                              ↑
                    ┌───────Add
                    │         ↑
                    │  Feed-Forward Network
                    │         ↑
                    └─────────┤（残差：Add & LayerNorm の出力をバイパス）
                              │
                        LayerNorm
                              ↑
                    ┌───────Add
                    │         ↑
                    │  Multi-Head Self-Attention
                    │         ↑
                    └─────────┘（残差：入力 x をバイパス）
                              ↑
                           入力 x
```

このブロックを $N$ 層重ねます（論文では $N = 6$）。

---

## Transformer の全体像

### Encoder の構成

```
 Encoder 出力（全位置の文脈表現ベクトル列）
       ↑
 ┌─── Encoder Block × N ───┐
 │  Add & Norm             │
 │  Feed-Forward           │
 │  Add & Norm             │
 │  Multi-Head Self-Attn   │
 └─────────────────────────┘
       ↑
 [Embedding + Positional Encoding]
       ↑
原言語トークン列
```

Encoder の出力は「原言語の各トークンについて、文全体の文脈を反映したベクトル列」です。

### Decoder の構成と特殊な Attention

Decoder には Encoder にはない2種類のサブ層が加わります。

```
 Linear + Softmax → 次トークンの確率分布
       ↑
 ┌─── Decoder Block × N ─────────────────────┐
 │  Add & Norm                               │
 │  Feed-Forward                             │
 │  Add & Norm                               │
 │  Multi-Head Cross-Attention               │  ← ②
 │    Q: Decoder の状態                       │
 │    K, V: Encoder の出力                    │
 │  Add & Norm                               │
 │  Masked Multi-Head Self-Attention         │  ← ①
 └───────────────────────────────────────────┘
       ↑
 [Embedding + Positional Encoding]
       ↑
目的言語トークン列（生成済み）
```

**① Masked Multi-Head Self-Attention**：

翻訳中は「まだ生成していないトークン」を見てはいけません（情報漏洩）。

$$M_{ij} = \begin{cases} 0 & (j \leq i) \\ -\infty & (j > i) \end{cases}$$

未来の位置に $-\infty$ を加えてから softmax を取ると、その位置への重みは実質的に 0 になります。

**② Multi-Head Cross-Attention**：

Week 12 の Attention（Decoder が Encoder の全状態を参照）と対応します。

| Week 12（Attention） | Transformer（Cross-Attention） |
|:---|:---|
| Decoder の現在状態 $h'_t$ | $Q$（Decoder の状態から射影） |
| Encoder の各状態 $h_i^{enc}$ | $K, V$（Encoder 出力から射影） |
| $c_t = \sum \alpha_{t,i} h_i^{enc}$ | $\text{Attention}(Q, K, V)$ |

「Week 12 の Attention をそのまま Q/K/V 記法で書き直したもの」です。

### 今日の積み上げまとめ

| 問い | 解決策 |
|:---|:---|
| RNN を取り除くと語順が消える | Positional Encoding |
| 同系列内の文脈を捉えたい | Self-Attention |
| 複数の関係を同時に捉えたい | Multi-Head Attention |
| 深い積み重ねで勾配が消える | Add（残差接続）+ LayerNorm |
| 各位置の表現をさらに豊かにしたい | FFN |
| Decoder が未来を見てしまう | Masked Self-Attention |
| Decoder が原文を参照したい | Cross-Attention |

![Transformers](./figs/trasformers.png)

```{tip}
Decoder Only = 条件付き言語モデル = GPT
```

---

## まとめと次回へ

### 今日の技術マップ

```
[Week 12 の残課題]
  RNN の逐次処理 → 並列化できない
          ↓「Attention だけで再設計したら？」
  Positional Encoding
  位置情報を埋め込みに加算し、語順情報を保持
          ↓
  Self-Attention (Scaled Dot-Product)
  全トークン間の関係を O(1) で直接参照
          ↓
  Multi-Head Attention
  複数の注目パターンを h 個のヘッドで並列学習
          ↓
  Add & Norm
  残差接続と LayerNorm で深い積み重ねを安定化
          ↓
  FFN
  各位置の表現を非線形変換
          ↓
  Encoder-Decoder 構造
  Masked Self-Attn + Cross-Attn で翻訳を実現
          ↓
[次回への問い]
  「この Transformer を大量テキストで学習させると？」
```

### Week 12 vs Week 13 の比較

| | seq2seq + Attention（Week 12） | Transformer（今日） |
|:---|:---|:---|
| 系列処理 | RNN（逐次） | Self-Attention（並列） |
| 長距離情報 | RNN の隠れ状態を辿る | 直接参照（$O(1)$） |
| 深化の安定性 | LSTM でも限界あり | Add & Norm で数十層 |
| 並列化 | 不可 | 可能（GPU で大規模学習） |

**次回の内容**：Transformer を大量テキストで学習させると「GPT」（Decoder のみ・次トークン予測）や「BERT」（Encoder のみ・マスク言語モデル）が生まれます。Week 14 では事前学習・多段階学習（SFT・RLHF）・RAG の理論的基盤を扱います。

---

## 演習問題

**Q1**：「RNN を取り除くと語順情報が失われる」と説明しました。では Positional Encoding を加えない場合、"猫 が 走る" と "走る 猫 が" の Self-Attention 出力は同じになりますか？その理由を述べてください。

**Q2**：Scaled Dot-Product Attention で $\sqrt{d_k}$ で割る理由を、「softmax の飽和」という観点から説明してください。

**Q3**：Multi-Head Attention で $h=8$、$d=512$ の場合、各ヘッドの次元 $d_k$ はいくつになりますか？また、全ヘッドを Concat して $W^O$ で射影した後の出力次元は？

**Q4**：Decoder の Masked Self-Attention でマスクを使わないと（マスクなしの Self-Attention を使うと）、学習時にどのような問題が起きますか？

**Q5**：Week 12 の seq2seq + Attention の「文脈ベクトル $c_t = \sum_i \alpha_{t,i} h_i^{enc}$」は Transformer の Cross-Attention の $\text{Attention}(Q, K, V)$ に対応します。Q・K・V にそれぞれ何が対応するか説明してください。

**Q6**：Transformer の FFN は「全位置で同じ重みを共有」します。RNN の「全時刻で同じ $W_h, W_x$ を共有」という設計との類似点と相違点を考えてみましょう。

**Q7**：Week 14 では Transformer をベースにした事前学習モデルを扱います。GPT は Decoder のみ、BERT は Encoder のみを使うと言われています。Encoder と Decoder の構造的な違い（Masked Self-Attention の有無など）から、それぞれがどのようなタスクに向いているか予想してみましょう。

---

## 参考文献

- Vaswani, A. et al. "[Attention Is All You Need](https://arxiv.org/abs/1706.03762)," NeurIPS (2017). ← Transformer 提案論文
- Bahdanau, D. et al. "[Neural Machine Translation by Jointly Learning to Align and Translate](https://arxiv.org/abs/1409.0473)," ICLR (2015). ← Week 12 の Attention（参照元）
- He, K. et al. "[Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385)," CVPR (2016). ← 残差接続（ResNet）
- Ba, J. et al. "[Layer Normalization](https://arxiv.org/abs/1607.06450)," arXiv (2016). ← LayerNorm
- 岡崎直観 et al.「[自然言語処理の基礎](https://www.ohmsha.co.jp/book/9784274229400/)」オーム社 (2022). ← Transformer の日本語解説
