# 系列モデリングと Attention：「記憶」の進化と限界

---

## この資料の位置づけ

この資料は [Week 11「言語モデル」](./towards_deeplearning3.md)で確認した「n-gram の固定ウィンドウ限界」を出発点に、**RNN の隠れ状態という記憶の仕組み** → **seq2seq による系列変換** → **Attention による動的参照** という流れを、内部構造に踏み込みながら解説します。技術の「仕組み」を理解することを重視するため、各技術の数式と展開図を丁寧に追います。

---

## 学習目標

1. n-gram LM の「固定ウィンドウ」と RNN LM の「動的記憶」の違いを、数式レベルで比較できる。
2. RNN の隠れ状態更新式 $h_t = \tanh(W_h h_{t-1} + W_x x_t + b)$ の各項の役割を説明できる。
3. RNN が「重み共有」によって可変長系列を扱える理由を説明できる。
4. Encoder-Decoder 構造で系列変換を行う仕組みを（学習と推論の両フェーズから）説明できる。
5. 固定ベクトル $c$ のボトルネックが生じる理由を説明できる。
6. Attention スコアの計算（スコア関数 → softmax → 加重和）を手順として追うことができる。

---

## 振り返り：n-gram の「記憶」の限界

### 今日の位置づけ

Week 11 で導入した**技術の地図**を再確認します。

```
n-gram LM（カウントベース）
    ↓ 固定ウィンドウ・データスパース
Neural LM（Bengio 2003）
    ↓ 埋め込みで汎化・大規模コーパス対応
RNN LM        ← 今日はここから
    ↓
seq2seq + Attention
    ↓
Transformer（次回）
```

### n-gram の記憶は「直前 n-1 語のみ」

$$P(w_t \mid w_1, \ldots, w_{t-1}) \approx P(w_t \mid w_{t-n+1}, \ldots, w_{t-1}) \quad \text{（Markov 仮定）}$$

「長年 住んでいた 街 を 離れる 日 が 来た」という文で確認します。

| n | 参照範囲 | 推定される確率 |
|:---:|:---|:---|
| 2（bigram） | 「が」 | P(来た \| が) |
| 3（trigram） | 「日 が」 | P(来た \| 日 が) |
| 5（5-gram） | 「離れる 日 が」は参照、でも「長年 住んでいた」は無視 | P(来た \| 離れる 日 が) |

$n$ を大きくすれば「長年 住んでいた」という遠い文脈も原理上は参照できます。しかし $n$ を大きくするにつれ、語彙 $|V|$ の $n$ 乗に比例する計算量・記憶量が必要になり、また訓練データ中に長い n-gram が出現しなくなる「データスパース問題」が深刻化します。実用上 $n \leq 5$ 程度が限界であり、長距離の文脈は事実上無視せざるを得ません。

> **問い**：「過去に見た単語を全て（理論上）記憶しながら、次を予測できるモデルは作れるか？」

---

## 翻訳とは何か：系列変換問題

RNN の説明に入る前に、今日扱う「系列変換」というタスクを明確にしておきます。

### 言語モデルとの違い

| タスク | 入力 | 出力 | 出力の性質 |
|:---|:---|:---|:---|
| n-gram LM | 「猫 が」（直前 n-1 語） | 「走る」（次の1語） | 固定（常に1語） |
| RNN LM | 「猫 が 走る …」（全コンテキスト） | 「走る」（次の1語） | 固定（常に1語） |
| **翻訳（seq2seq）** | **「猫 が 走る」（日本語文）** | **"The cat runs"（英語文）** | **独立して可変** |

翻訳（および要約・対話・音声認識）は入出力の両方が「可変長の系列」です。これを **系列変換（Sequence-to-Sequence, seq2seq）問題** と呼びます。

### 翻訳の難しさ

```
「猫 が 走る」（3語）  →  "The cat runs"（3語）
「速く 走る 犬」（3語） →  "The dog that runs fast"（6語）
「彼女は昨日の夕方、駅の近くにある古い書店でその本を見つけた。」（長文）
                       →  "She found the book ..."（別の長さ）
```

難しい点：
- 入力と出力の**長さが変わる**（固定長 NN は直接使えない）
- **語順が言語によって異なる**（日本語 SOV / 英語 SVO）
- **文全体の意味**を掴まないと正確に訳せない

```{tip}
**翻訳の難しさには「文化的差異」という別の層もある**

「いただきます」「お疲れ様でした」のような表現は英語に直訳できません。敬語体系・ポライトネスの差異・文化固有の概念など、言語と文化の間の非対称性が翻訳をさらに困難にします。本資料では「入出力の長さが独立して変わる」という構造的な問題に焦点を当てます。
```

---

## RNN：進化する「メモ帳」としての隠れ状態

### 固定長 NN の限界の整理

全結合 NN は入力サイズが固定です。

```
MLP: y = f(W · [x_1, x_2, x_3] + b)   ← 3語固定
```

「今朝は」（2語）と「昨日の夕方に駅の近くで」（7語）は同じモデルで扱えません。

### RNN の更新式

Recurrent Neural Network（RNN）は前の隠れ状態を引き継ぐことで、**可変長系列**を処理します。

$$\boxed{h_t = \tanh(W_h \cdot h_{t-1} + W_x \cdot x_t + b)}$$

| 項 | 意味 |
|:---|:---|
| $x_t$ | 時刻 $t$ の入力（単語の埋め込みベクトル、例：word2vec で得た $d_x$ 次元ベクトル） |
| $W_x \cdot x_t$ | 今のトークン $x_t$ からの情報 |
| $W_h \cdot h_{t-1}$ | 前ステップの記憶からの情報 |
| $\tanh(\cdot)$ | 出力を $[-1, 1]$ に収める活性化関数 |
| $h_t$ | 更新された「ここまでの文脈のメモ」 |

```{note}
**$h_0$（最初のステップの前の状態）の初期化**

$t=1$ のとき、前の隠れ状態 $h_{t-1} = h_0$ がまだ存在しません。実装では通常 $h_0 = \mathbf{0}$（全要素がゼロのベクトル）として初期化します。「まだ何も読んでいない、文脈が空の状態」を表します。この初期状態は学習可能なパラメータとして扱う場合もあります。Encoder-Decoder の場合、Decoder の初期状態 $h_0^{dec} = c$（Encoder の最終状態）として設定するため、Decoder 側の $h_0$ は常にゼロではありません。
```

### 展開図：「同じセルを繰り返す」という設計

```
          x_1         x_2         x_3         x_4
           ↓           ↓           ↓           ↓
h_0 →  [RNN セル] → [RNN セル] → [RNN セル] → [RNN セル]
           ↓           ↓           ↓           ↓
          h_1         h_2         h_3         h_4
```

![RNN言語モデルにおける推論](./figs/rnn.png)

重要な設計選択：**全ての時刻で同じ重み $W_h, W_x, b$ を共有します。**

この「重み共有」により：
- 100 語の文でも 10 語の文でも同じパラメータで処理できる
- 系列長に依存せずパラメータ数が一定

n-gram の「組み合わせ爆発」と対照的です。

```{note}
**$W_h$ と $W_x$ は別のパラメータです**

$W_x \in \mathbb{R}^{d_h \times d_x}$（入力次元 $d_x$ → 隠れ次元 $d_h$）と $W_h \in \mathbb{R}^{d_h \times d_h}$（隠れ次元 → 隠れ次元）は形が異なる別の行列です。展開図の各 RNN セルが「同じ」というのは、$t=1, 2, \ldots, T$ の全ステップで**この2つの行列の組をそのまま使い回す**という意味です。コピーが複数あるのではなく、1つのセル（$W_h$・$W_x$・$b$ を持つ）を $T$ 回呼び出していると考えてください。
```

### 隠れ状態に情報が蓄積される仕組み

「今朝 は トースト と 卵焼き を 食べた」を RNN で処理すると：

| $t$ | 入力 $x_t$ | 隠れ状態 $h_t$ が表す（直感） |
|:---:|:---:|:---|
| 1 | 今朝 | 「今朝」という時間文脈が立ち上がった |
| 2 | は | 主語（省略）を期待する文脈 |
| 3 | トースト | 「今朝の食事」という枠組みに食べ物が入った |
| 4 | と | 並列が続く ― さらに食べ物が来そう |
| 5 | 卵焼き | 2つ目の食べ物 |
| 6 | を | 動詞を期待する文脈 |
| 7 | 食べた | 文の意味が完結 |

$h_7$ は「今朝、トーストと卵焼きを食べたという出来事」を（理論上）圧縮したベクトルです。

### n-gram LM と RNN LM の比較

| 観点 | n-gram LM | RNN LM |
|:---|:---|:---|
| 条件付き確率 | $P(w_t \mid w_{t-n+1},\ldots,w_{t-1})$ | $P(w_t \mid h_{t-1})$ |
| 文脈長 | 固定（n-1語） | 理論上無制限 |
| 推定方法 | カウント÷カウント（MLE） | NN パラメータを勾配降下で学習 |
| データスパース | あり（Laplace 等で対応） | 埋め込みで類義語に汎化 |
| PPL（Penn Treebank） | bigram: ~170、trigram KN: ~74 | RNN LM: ~130 前後 |

RNN LM は「固定窓」という本質的な制約を取り除いた Neural LM（神経的言語モデル）です。

```{note}
「RNN LM は n-gram LM より PPL が良い」とは言えないケースもあります。
RNN LM の強みは汎化（未知語への対応）と長距離文脈にあり、
短い文の次単語予測では n-gram KN がまだ競争力を持つことがあります。
```

---

## RNN で言語モデルを作る

### 出力層の追加

RNN LM では各時刻の隠れ状態 $h_t$ から次単語の分布を推定します。

$$y_t = \text{softmax}(W_y \cdot h_t) \in \mathbb{R}^{|V|}$$

$|V|$ は語彙数です。確率最大の単語が次の予測トークンになります。

**前節の RNN に出力層を加えた全体像：**

```
          x_1         x_2         x_3         x_4
           ↓           ↓           ↓           ↓
h_0 →  [RNN セル] → [RNN セル] → [RNN セル] → [RNN セル]
           ↓           ↓           ↓           ↓
          h_1         h_2         h_3         h_4
           ↓           ↓           ↓           ↓
        (W_y)        (W_y)        (W_y)        (W_y)   ← 同じ出力重み
           ↓           ↓           ↓           ↓
         P(x_2)      P(x_3)      P(x_4)      P(x_5)   ← 次単語の確率分布
```

各ステップで同じ $W_y$（出力重み行列）を使って $h_t$ を語彙サイズのベクトルに変換し、softmax で次単語の確率分布を得ます。$W_h, W_x$ と同様、$W_y$ も全時刻で共有されます。

### 学習の目標

訓練データ $w_1, w_2, \ldots, w_N$ に対してクロスエントロピー損失を最小化します。

$$L = -\frac{1}{N} \sum_{t=1}^N \log P(w_t \mid h_{t-1})$$

これは Week 11 で学んだ Perplexity（PPL）の対数尤度と同じ形です。

$$\text{PPL} = \exp\!\left(-\frac{1}{N}\sum_{t=1}^N \log P(w_t \mid h_{t-1})\right)$$

```{note}
**Word2vec と RNN LM の目的関数の比較**

| モデル | 目的関数（最大化） | 文脈 |
|:---|:---|:---|
| word2vec CBOW | $\log P(\text{中心語} \mid \text{周辺語})$ | 両方向固定窓 |
| RNN LM | $\log P(w_t \mid w_{<t})$ | 左側（一方向・無制限） |

どちらも「文脈から単語を予測する」SSL タスクですが、
RNN LM は「過去のみ参照」という因果的（autoregressive）制約を持ちます。
生成タスク（翻訳・対話など）には因果的言語モデルが必要です。
```

---

## seq2seq：Encoder と Decoder による系列変換

### 系列変換問題の定義

言語モデルは「次の1語を予測」しますが、翻訳は「可変長の原言語文 → 可変長の目的言語文」を出力します。

```
言語モデル: (x_1, ..., x_t) → x_{t+1}
seq2seq:    (x_1, ..., x_T) → (y_1, ..., y_{T'})    ← T ≠ T' でよい
```

![seq2seq](./figs/seq2seq.png)

### Encoder の役割

Encoder RNN は原言語系列を左から右に処理し、最終隠れ状態 $c = h_T^{enc}$ を作ります。

$$h_t^{enc} = \tanh(W_h^{enc} \cdot h_{t-1}^{enc} + W_x^{enc} \cdot x_t + b^{enc})$$

$$c = h_T^{enc}$$

$c$ は「原言語文全体の意味を圧縮したベクトル」です。

翻訳の具体例で Encoder の動作を確認します。「猫 が 走る」→ "The cat runs" の場合：

```
Encoder:
  h_0 → [猫] → h_1 → [が] → h_2 → [走る] → h_3 = c

Decoder:
  c      → [<BOS>] → h'_1
  h'_1   → ["The"] → h'_2   ← P(The | c) を計算、最大の語を選択
  h'_2   → ["cat"] → h'_3
  h'_3   → ["runs"] → h'_4
  h'_4   → ["<EOS>"]          ← 生成終了
```

$y_t$ の確率分布：$P(y_t \mid y_{<t}, c) = \text{softmax}(W_y \cdot h'_t)$

### Decoder の役割

Decoder RNN は $h_0^{dec} = c$ として Encoder の圧縮情報を受け取り、目的言語を1語ずつ生成します。

$$h_t^{dec} = \tanh(W_h^{dec} \cdot h_{t-1}^{dec} + W_x^{dec} \cdot y_{t-1} + b^{dec})$$

$$P(y_t \mid y_{<t}, c) = \text{softmax}(W_y \cdot h_t^{dec})$$

ここで $y_{<t} = (y_1, y_2, \ldots, y_{t-1})$ は時刻 $t$ より前に生成した全トークンの列を表す省略表記です。

**条件部のカンマについて**：$P(y_t \mid y_{<t},\, c)$ の $\mid$ の右側（条件部）のカンマは「かつ」を意味します。すなわち「$y_{<t}$（これまでの生成系列）と $c$（文脈ベクトル）という**性質の異なる2つの情報を同時に条件として固定**したうえで、$y_t$ の確率を求める」式です。$y_{<t}$ と $c$ は1つの系列をなしているわけではなく、それぞれ「何を生成したか」と「何を翻訳しているか」という独立した条件です。Week 11 で見た $P(w_1, w_2, \ldots, w_N)$ のカンマが「$\mid$ なし＝この系列全体の確率を求める」のとは、$\mid$ の有無で役割が異なります。

実装上は $h_{t-1}^{dec}$ が $y_{<t}$ の履歴を要約しているため、RNN の計算では条件付きの対象は実質 $h_{t-1}^{dec}$ と $c$ になります。

最初のステップでは $h_0^{dec} = c$、前の出力として `<BOS>`（文の始まり記号）を渡します。

エンドツーエンド学習：Encoder と Decoder の組み合わせ全体を損失関数で一括学習できます。

$$L = -\sum_{t=1}^{T'} \log P(y_t \mid y_{<t}, c)$$

翻訳の正解ペアがあれば、特徴量エンジニアリングなしに学習できます。

### Teacher Forcing

**学習時（Teacher Forcing）**：前のステップの出力として「正解トークン」を渡します。

```
正解系列: <BOS>  The   cat   runs  <EOS>
             ↓     ↓     ↓     ↓
Decoder: [h'_1]→[h'_2]→[h'_3]→[h'_4]
出力確率: P(The) P(cat) P(runs) P(<EOS>)
```

Teacher Forcing により学習が安定・高速化します（誤差の蓄積が起きない）。

**推論時**：前ステップの出力（予測トークン）を次の入力として使い、`<EOS>` が出るまで生成を続けます。生成戦略には主に2種類あります。

**Greedy Decoding（貪欲法）**：各ステップで確率が最も高いトークン1つだけを選択します。計算コストが低いですが、最初の選択誤りが後続全体を引きずる「局所最適」のリスクがあります。

**Beam Search（ビーム探索）**：上位 $k$ 個（beam width）の候補系列を並列に保持しながら生成を進め、最終的に最高スコアの系列を採用します。Greedy より良い訳が得られることが多く、実用システムでは beam width=4〜10 程度が使われます（Sutskever et al., 2014）。

```
k=2 の例:
  ステップ1: [("The", 0.6), ("A", 0.25)] を保持
  ステップ2: "The cat"(0.42), "A cat"(0.13), "The dog"(0.12), ... から上位2つへ絞る
```

```{note}
Teacher Forcing の欠点：
学習時と推論時で入力分布が異なる（Exposure Bias 問題）。
学習時は常に正解が入力されるが、推論時は自身の誤った出力が次の入力になる。
この乖離が推論品質を下げる場合があります。
```

---

## 記憶の圧縮限界：Attention の必要性

### ヒートマップで見る Attention

Attention が「なぜ必要か」を理解するために、まず Attention の「答え」を先に見ておきます。

```
（アライメントヒートマップのイメージ）

          The  cat  runs  fast  <EOS>
猫   が:  ■■■  ■■   □    □     □
速   く:  □    □    □    ■■■   ■
走   る:  □    □    ■■■  ■■    □
<EOS>:   □    □    □    □     ■■■

■ = Attention の重みが高い（この位置を参照）
□ = Attention の重みが低い（あまり参照しない）
```

**図の読み方**：横軸は目的言語（英語）の生成トークン、縦軸は原言語（日本語）のソーストークンです。各セルの濃さは「その英単語を生成するとき、その日本語単語をどれだけ参照するか」の重みを表します。「cat を生成するとき『猫』を多く参照」「runs を生成するとき『走る』を多く参照」という参照位置の**変化**がある。通常の seq2seq では固定ベクトル $c$ しか参照できないため、この「変化」が実現できません。

逆算すると、この図を出力するために必要なことが分かります：

| 必要なもの | なぜ必要か | 対応する技術 |
|:---|:---|:---|
| ① 各単語をベクトルで表す | 計算するためにはベクトルが必要 | word2vec 埋め込み（Week 10）|
| ② 原文を「順番に」処理する | 語順・文脈を保持するため | RNN |
| ③ 訳文を「順番に」生成する | 翻訳文を1語ずつ出力するため | seq2seq |
| ④ 生成中の状態と各ソース単語の関係を数値化する | ヒートマップの各セルを計算するため | Attention |

### 固定ベクトル $c$ の限界

seq2seq の文脈ベクトル $c$ は**1本のベクトル**です。長い文を1本のベクトルに圧縮しきれない問題があります。その背景には RNN の時間方向の逆伝播（BPTT）が抱える勾配消失の問題があります（詳細は後の {note} を参照）。

**実験的な確認**（Bahdanau et al., 2015 の Figure 2 より、英仏翻訳）：

```
文の長さ（語数）vs BLEU スコア:
  ≤ 10語: BLEU ≈ 30  ← 安定
  ≈ 20語: BLEU ≈ 20  ← 低下開始
  ≥ 30語: BLEU < 10  ← 急落
```

```{note}
**BLEU とは**

BLEU（Bilingual Evaluation Understudy、Papineni et al., 2002）は機械翻訳の自動評価指標です。生成した訳文と人手の参照訳文の **n-gram 一致率**をもとに 0〜100 で評価します（高いほど良い）。PPL は言語モデルとしての次単語予測精度の指標であり、同論文では翻訳品質の測定に BLEU が使われています。Week 11 で示した PPL 比較（Penn Treebank）は言語モデリング専用の数値であり、翻訳タスクの BLEU とは直接比較できません。
```

**「勾配消失」の歴史的な解決の試み**

RNN の長距離依存問題に対してさまざまな解決策が試みられてきました。

| 年 | 技術 | 何を解決したか | 限界 |
|:---:|:---|:---|:---|
| 1994 | Bengio et al. の理論分析 | RNN の時間方向勾配消失を定式化 | 解決策なし |
| 1997 | LSTM（Hochreiter & Schmidhuber） | ゲート機構で長距離依存を大幅緩和 | 非常に長い系列（50語超）では依然喪失 |
| 2010 | ReLU（Nair & Hinton） | 深さ方向の勾配消失を大幅緩和 | RNN の**時間方向**勾配消失には限定的 |
| 2016 | LayerNorm・ResNet | 深い FF 層の学習を安定化 | 同上 |
| 2014/15 | Attention（Bahdanau et al.） | 長距離でも動的参照で品質を維持 | 依然 RNN 逐次処理の問題は残る |

ReLU・LayerNorm・ResNet は「ネットワークの深さ方向」の勾配消失を解決しますが、RNN が抱える「時間方向の逆伝播（BPTT）」の勾配消失は別の問題です。LSTM のゲート機構はこれを大幅に緩和しましたが、非常に長い系列では LSTM も情報保持が困難です。Attention はその根本的な解決策として登場しました。

```{note}
**「深さ方向」と「時間方向」の勾配消失はなぜ別問題か**

**深さ方向の勾配消失（ReLU で大幅改善、超深層は ResNet も必要）**

深層 FFN では勾配が層を遡るたびに「活性化関数の微分 × その層の重み行列」が掛かります。

$$\frac{\partial L}{\partial W_1} \propto \underbrace{f'(z_n) W_n}_{\text{層}n} \cdots \underbrace{f'(z_2) W_2}_{\text{層}2}$$

sigmoid では $f'(z_k) \leq 0.25$ のため 10 層で消えます。ReLU に替えると $f'(z_k) \approx 1$ になり、残るのは**異なる行列の積** $W_n \cdots W_2$ のみです。ランダム初期化された異なる行列の積は「系統的にゼロへ収束する」という構造的保証がないため、数十層なら ReLU だけで大きく改善できます。ただし 100 層超では ResNet のスキップ接続が追加で必要でした。

**時間方向の勾配消失（ReLU では解決できない）**

RNN の逆伝播では、**同じ行列 $W_h$ を**繰り返し掛けます。

$$\frac{\partial h_T}{\partial h_t} \approx W_h^{T-t}$$

ReLU で活性化関数の問題を解消しても、**同じ行列の累乗** $W_h^{T-t}$ が残ります。$W_h$ の固有値が 1 より少しでも小さければ $W_h^{50} \approx \mathbf{0}$ になることが数学的に保証されており、行列自体を変えない限り改善できません。深層 FFN の「異なる行列の積」より構造的に難しい問題です。

これは RNN の強みと弱みの裏表でもあります。「全時刻で $W_h$ を共有する」おかげで可変長系列を扱えますが、その同じ共有が BPTT での系統的な勾配消失を引き起こします。

| 問題 | 原因 | 解決策 |
|:---|:---|:---|
| 深層 FFN（数十層） | 活性化関数の微分が小さい | ReLU |
| 深層 FFN（100層超） | 異なる行列の積でも縮小しうる | ResNet（skip connection） |
| RNN の時間方向 | **同じ行列の累乗**という構造的問題 | LSTM（バイパス）・Attention（迂回） |

**LSTM の対処法**：セル状態 $c_t$ を加算更新（$c_t = f_t \cdot c_{t-1} + i_t \cdot \tilde{c}_t$）することで「勾配の直通バイパス」を作り、$W_h$ の繰り返し乗算を回避。

**Attention の対処法**：時間をさかのぼる必要をなくし、過去の全隠れ状態を「直接参照」する。BPTT の問題を根本的に迂回する設計。
```

### Attention の設計

![seq2seq + Attentionで目指すゴール](./figs/seq2seq+attention-abst.png)

**鍵となるアイデア**：$c$（Encoder の最終状態1本）だけでなく、Encoder の**全ての**中間状態 $\{h_1^{enc}, \ldots, h_T^{enc}\}$ を保存し、Decoder がデコードするたびに参照する。

```
従来の seq2seq:
  Decoder → c（固定）

Attention 付き seq2seq:
  Decoder (ステップt) → c_t（ステップごとに変わる！）
                          = h_1^{enc}, h_2^{enc}, ..., h_T^{enc} の加重和
```

人間の翻訳者との対比でイメージをつかみます：

```
人間の翻訳者:
  "The"（冠詞）を訳す時   → 原文の「猫が」を見る
  "cat"（名詞）を訳す時   → 原文の「猫」を特に見る
  "runs"（動詞）を訳す時  → 原文の「走る」を特に見る
  （常に原文に戻って参照できる）

seq2seq:
  どのトークンを訳す時も c（同じベクトル）しか参照できない
  ← これがボトルネック
```

### Attention の計算手順

![seq2seq + AttentionにおけるAttentionスコア計算の流れ](./figs/seq2seq+attention-impl.png)

**Step 1：各位置のスコアを計算**

Decoder の現在状態 $h'_t$ と Encoder の各状態 $h_i^{enc}$ の「関連度」：

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

$v, W_1, W_2$ は追加の学習可能パラメータです。

**Step 2：softmax で正規化（Attention 重み）**

$$\alpha_{t,i} = \frac{\exp(e_{t,i})}{\displaystyle\sum_{j=1}^T \exp(e_{t,j})}$$

性質：$0 \leq \alpha_{t,i} \leq 1$、$\displaystyle\sum_{i=1}^T \alpha_{t,i} = 1$

**Step 3：動的文脈ベクトルの計算（加重平均）**

$$c_t = \sum_{i=1}^T \alpha_{t,i} \cdot h_i^{enc}$$

$c_t$ の直感：「このデコードステップで最も重要なソース位置からの情報を多めに取り込んだベクトル」


### Attention スコア関数の選択肢

| 名称 | 式 | 提案 |
|:---|:---|:---|
| 加法型（Additive） | $\mathbf{v}^\top \tanh(W_1 h'_t + W_2 h_i)$ | Bahdanau et al. (2015) |
| 内積型（Dot-product） | ${h'_t}^\top h_i$ | Luong et al. (2015) |
| スケール内積型 | ${h'_t}^\top h_i / \sqrt{d}$ | Vaswani et al. (2017) |

スケール内積型は内積の値が次元数 $d$ が大きいと大きくなりやすい問題を $\sqrt{d}$ で補正します。これが Transformer で採用される形式です。

### Attention の効果の直感：「アライメント」の自動学習

**アライメント（alignment）** とは、原言語の各単語と目的言語の各単語の「対応関係」のことです。例えば「猫 → cat」「走る → runs」のように、ソース側のどの語がターゲット側のどの語に対応するかを表します。統計的機械翻訳（SMT）では、このアライメントを別のモデルで明示的に推定する必要がありました。

Attention 重み $\alpha_{t,i}$ を行列として可視化すると、このアライメントが自動的に現れます。

```
       The  cat  runs  fast  <EOS>
  猫   [0.7  0.6  0.1   0.05   0.0 ]
  が   [0.15 0.3  0.1   0.05   0.0 ]
  速く [0.05 0.05 0.05  0.7    0.1 ]
  走る [0.1  0.05 0.75  0.2    0.0 ]
```

「cat を生成するとき、猫に高い重みが付く」という自然な対応が**データから自動で**学習されます。SMT がアライメントモデルを別途必要としたのに対し、Attention ではエンドツーエンド学習の副産物として翻訳アライメントが得られます。

Attention の効果を表で整理します：

| | seq2seq | seq2seq + Attention |
|:---|:---|:---|
| 短い文（≤10語） | 良好 | 同等 |
| 長い文（30語以上） | 急落 | 維持 |
| 情報の参照 | 常に同じ文脈ベクトル | ステップごとに動的 |
| 解釈可能性 | 低い | 高い（ヒートマップ可視化） |

**表の読み方**

- **長い文「急落」**: 30語を超えると、固定 $c$ への情報圧縮が破綻し、seq2seq の BLEU は 10 前後にまで落ちます。
- **長い文「維持」**: Attention を加えると、長い文でも BLEU 25〜30 程度を維持します（Bahdanau et al. 2015, Figure 2）。
- **解釈可能性「高い」**: $\alpha_{t,i}$ を行列として可視化すれば「なぜこの訳語を選んだか」が表示できます（上記の数値ヒートマップ）。

```{tip}
**Transformer での表記との対応（先読み）**

Week 13 では Attention を Q（Query）・K（Key）・V（Value）という3つの行列で統一的に書きます。seq2seq + Attention の各要素は次のように対応しています。

| Transformer の表記 | seq2seq + Attention での意味 |
|:---|:---|
| Q（Query：「何を探すか」） | Decoder の現在状態 $h'_t$ |
| K（Key：「何と照合するか」） | Encoder の各隠れ状態 $h_i^{enc}$ |
| V（Value：「何を取り出すか」） | Encoder の各隠れ状態 $h_i^{enc}$（K と同じ） |

seq2seq では K と V が常に同じですが、Transformer では $W_Q, W_K, W_V$ による線形変換で K と V を独立に設計できます。「Attention = Q と K の類似度で V を加重和する」という構造は Week 13 以降も変わりません。
```

---

## 問題点：Attention は解決したが、何が残ったか

Attention で長距離依存問題を大幅に解決しましたが、RNN アーキテクチャ自体の問題が残っています。

### 逐次処理の壁

RNN の本質的な制約：

```
h_1 確定 → h_2 確定 → h_3 確定 → ... → h_T 確定
（各ステップが前のステップの結果に依存するため並列化不可）
```

GPU は行列演算の並列化が得意ですが、RNN ではこの「依存関係の鎖」が並列化を阻みます。

現代の大規模言語モデル（数十億語のテキストで学習）では、RNN の逐次処理が計算時間の根本的なボトルネックになります。

### 「Attention だけで」という発想

Attention スコアの計算は「あるベクトルと他のベクトルの内積」です。内積計算はベクトル間の依存関係がなければ並列化できます。

```
Self-Attention（同一系列内での Attention）:
  w_1, w_2, ..., w_T それぞれが他の全ての単語との関連度を「同時に」計算できる
```

RNN を使わずに Self-Attention だけで系列を処理できれば、並列化が可能になります。

Self-Attention の具体例：

```
"The animal didn't cross the street because it was too tired."
  ↑                                                ↑
  "it" は "animal" を指している（文中の自己参照）
```

Self-Attention なら "it" と "animal" の関係を直接計算できます。

```{tip}
**次回へのブリッジ**:
「Attention が本質なら、RNN をやめて Attention だけで設計したらどうなる？」
→ これが Transformer（Vaswani et al., 2017）の問いです。
次回は Positional Encoding・Multi-Head Attention・Add&Norm・FFN を扱います。
```

---

## まとめと次回へ

### 今日の技術マップ

```
[n-gram LM の限界]
  固定ウィンドウ・遠い文脈を参照できない
          ↓ 「理論上無制限の記憶が欲しい」
RNN
  h_t = tanh(W_h h_{t-1} + W_x x_t + b)
  「進化するメモ帳」として過去の文脈を圧縮
          ↓ 「可変長入出力の変換が必要」
seq2seq (Encoder-Decoder)
  Encoder: 原言語 → c（固定ベクトル）
  Decoder: c → 目的言語（1語ずつ）
          ↓ 「長い文で c が情報を保ちきれない」
Attention
  c_t = Σ α_{t,i} h_i（動的文脈ベクトル）
  デコードするたびに参照位置が変わる
          ↓ 「RNN の逐次処理が並列化を阻む」
[次回] Transformer
  Self-Attention で RNN を置き換え → 並列化
```

### 各技術のまとめ

| 技術 | キーアイデア | 解決した問題 | 残った問題 |
|:---|:---|:---|:---|
| RNN LM | 隠れ状態の再帰更新 | 固定ウィンドウ超え | 長距離依存・逐次処理 |
| seq2seq | Encoder-Decoder 分業 | 可変長系列変換 | 固定 $c$ ボトルネック |
| Attention | 動的加重平均 | 長文のボトルネック | RNN 逐次処理の非効率 |
| **Transformer** | Self-Attention | 並列化・長距離 | — |

「Attention = Transformer専用」ではないことに注意！

---

## 演習問題

**Q1**：n-gram（3-gram）と RNN の「文脈の参照範囲」の違いを、同じ文「彼女は昨日公園で走った」を使って数式と言葉で説明してください。

**Q2**：RNN は「全時刻で同じ重みを共有する」と説明しました。これにより、10語の文と100語の文を同じパラメータ数で処理できます。では、重み共有によって失われるものは何でしょうか？（ヒント：各時刻に「位置特有の重み」を割り当てた場合との比較）

**Q3**：Teacher Forcing を使わずに、Decoder の前ステップ出力（モデルの予測）を次の入力として使いながら学習する場合（＝Exposure Bias の問題を直接体験する場合）、どのような問題が起きると考えられますか？

**Q4**：文脈ベクトル $c_t = \sum_i \alpha_{t,i} h_i^{enc}$ において、$\alpha_{t,i}$ が「one-hot ベクトル」（特定の1つの $i$ のみ 1、それ以外は 0）になった場合、$c_t$ はどのような意味を持ちますか？また、全ての $i$ で $\alpha_{t,i} = 1/T$（一様分布）になった場合は？

**Q5**：言語モデル（n-gram LM）と seq2seq の「入力と出力」の違いを具体的な日本語文を例に挙げて説明してください。

**Q6**：スケール内積型 Attention スコア $e_{t,i} = {h'_t}^\top h_i / \sqrt{d}$ で $\sqrt{d}$ で割る理由を考えてみましょう（ヒント：$d$ 次元のランダムベクトル同士の内積の期待値と分散を調べてみてください）。

**Q7**：Attention の重み $\alpha_{t,i}$ を可視化したヒートマップが「翻訳アライメント」として解釈できると説明しました。同じ仕組みを「英英要約（長い英語文を短い英語文に要約する）」タスクに使った場合、ヒートマップはどのような形になると予想しますか？翻訳のヒートマップと比較して考えてみましょう。

**Q8**：Self-Attention とは「同じ系列内の単語が、他の単語に注目するスコアを計算する」仕組みです。"The animal didn't cross the street because it was too tired." という文で Self-Attention を計算した場合、"it" が最も高いスコアを持つ単語はどれだと予想しますか？

---

## 参考文献

- Elman, J.L. "[Finding Structure in Time](https://onlinelibrary.wiley.com/doi/10.1207/s15516709cog1402_1)," Cognitive Science 14(2):179–211 (1990). ← RNN の古典論文
- Sutskever, I. et al. "[Sequence to Sequence Learning with Neural Networks](https://arxiv.org/abs/1409.3215)," NeurIPS (2014). ← seq2seq 提案論文
- Bahdanau, D. et al. "[Neural Machine Translation by Jointly Learning to Align and Translate](https://arxiv.org/abs/1409.0473)," ICLR (2015). ← Attention（加法型）提案論文
- Luong, T. et al. "[Effective Approaches to Attention-based Neural Machine Translation](https://arxiv.org/abs/1508.04025)," EMNLP (2015). ← Attention（内積型）提案論文
- Vaswani, A. et al. "[Attention Is All You Need](https://arxiv.org/abs/1706.03762)," NeurIPS (2017). ← Transformer 提案論文
- Hochreiter, S. & Schmidhuber, J. "[Long Short-Term Memory](https://www.bioinf.jku.at/publications/older/2604.pdf)," Neural Computation 9(8):1735–1780 (1997). ← LSTM 提案論文（発展）
- 岡崎直観 et al.「[自然言語処理の基礎](https://www.ohmsha.co.jp/book/9784274229400/)」オーム社 (2022). ← seq2seq / Attention の日本語解説
- 高村大也「[言語処理のための機械学習入門](https://www.coronasha.co.jp/np/isbn/9784339027518/)」コロナ社 (2010). ← RNN の日本語詳細解説
- [【Deep Learning研修（発展）】系列データモデリング　第5回「言語モデル、seq2seqモデル」](https://www.youtube.com/watch?v=erd9DLVc8Dw&list=PLbtqZvaoOVPA-keirzqx2wzpujxE-fzyt&index=5) by nnablaディープラーニングチャンネル
