ニューラルネットワークを用いた自然言語処理の基礎


## 言語モデルとは？

言語モデルとは、**文章の出現しやすさを確率としてモデル化するもの**です。適切に構成された言語モデルは、人間が自然であると感じるような文に高い確率を割り当てます。

例えば、

- 「私はパンを食べた」
- 「私は家を食べた」
- 「私にパンを食べた」

この中で、「私はパンを食べた」が最も自然であり、言語モデルはこの文に最も高い確率を与えるべきです。

文の確率は、トークン（単語や記号など）の列と考え、以下のように分解されます：

```
p(S) = p(w₁, w₂, ..., wₓ) = ∏ p(wᵢ | cᵢ)
```

ここで、cᵢはトークンwᵢの文脈（context）であり、前のトークン列です。つまり、**文脈に対するトークンの出現確率**をモデル化するのが、言語モデルの本質です。

---

## ニューラルネットワークとは？

ニューラルネットワークは、**神経回路を模した機械学習モデル**であり、層（layer）と呼ばれる構成単位からなります。各層には**活性化関数（activation function）**が用いられ、以下のような非線形変換を導入します：

- Sigmoid
- ReLU
- GELU

これらの関数は出力の性質を決定する重要な要素であり、学習可能な**パラメータ**（重み）を含むことで問題に適応します。

---

## 多クラス分類と損失関数

自然言語処理の文脈下では、ある文脈に続く単語を複数の候補から選ぶタスクを**多クラス分類**として扱えます。

出力はカテゴリ数（語彙数）と同じサイズのベクトルであり、Softmax関数を通じて確率分布に変換されます。

損失関数としては、**クロスエントロピー損失**が一般的であり、正解ラベルとの誤差を以下のように表現します：

```
L = \frac{1}{m} \sum_{i=1}^{m} L(y_i, l_i)
```

---

## ニューラル言語モデルの構成

- **入力層（Embedding）**：各トークンをベクトルに変換し、意味的特徴を数値化。
- **出力層**：語彙数サイズの出力を生成し、Softmax関数で出現確率を得る。
- **学習データ**：正解トークンを含む文脈ペア（例：「これ」「は」→「テスト」）を用いて学習。
- **分散表現とコサイン類似度**：

```
sim(x, y) = \frac{x \cdot y}{|x||y|}
```

---

## Word2Vec

Word2Vecは2013年に提案された、**効率的に単語の分散表現を学習する手法**です。以下の2つのモデルがあります：

### CBOW（Continuous Bag-of-Words）

文脈から中央の単語を予測します。

```
v(C) = \frac{1}{2C} \sum_{w_i \in C} v(w_i)
```

### Skip-Gram

中央の単語から周囲の文脈単語を予測するモデル。CBOWとは逆の因果関係で、局所的な文脈の学習に強いとされます。

---

## Word2Vecの問題点

Word2Vecは「**1単語1ベクトル**」という性質上、**多義語や文脈の違いに対応できない**という課題があります。

例：「上手に立つ」と「上手な料理」では、「上手」の意味が異なるが、Word2Vecでは同じベクトルになります。

---

## ELMo（Embeddings from Language Models）

ELMoは2018年に提案された、**文脈に応じて単語ベクトルが変化するモデル**です。

ELMoでは同じ単語でも前後の文脈によって異なる分散表現が与えられます。これを「**文脈化単語埋め込み（Contextualized Word Embedding）**」と呼びます。

---

## 文脈によって意味が変わる単語

例：「play」

- **スポーツのプレイ**（"a spectacular play on Alusik’s grounder"）
- **演劇の舞台**（"a Broadway play for Garson"）

Word2Vecのような「1単語＝1ベクトル」の表現では、こうした文脈の違いを捉えることができません。

---

## 再帰型ニューラルネットワーク（RNN）

RNNは、系列データ（例：単語列）における**時間的依存関係**を捉えることができます。以下のように、時刻ごとに入力と前の出力を使って新たな出力を生成します：

```
h_i = ϕ(Ax_i + Bh_{i-1} + b)
```

### 双方向RNN（Bidirectional RNN）

順方向だけでなく、逆方向（未来の情報）も加味して文脈を捉えるモデル。ELMoではこの双方向RNNがベースになっています。

---

## 多層RNNとその拡張

複数のRNN層を重ねることで、より深い特徴を学習できます。

```
h_i^{(2)} = ϕ(A h_i^{(1)} + B h_{i-1}^{(2)} + b)
```

---

## Long Short-Term Memory（LSTM）

### RNNの課題

- 長期依存の記憶が困難
- 勾配消失により情報が忘れられる

### LSTMの仕組み

LSTMは、**記憶セル（cell）**を導入し、「いつ情報を記憶・忘却・出力するか」をゲート機構で制御します：

- **入力ゲート**：現在の入力を取り込む割合
- **忘却ゲート**：過去の記憶を消す割合
- **出力ゲート**：出力へ反映する割合

---

## ELMoのモデル構造

### モデル概要

ELMoは、**双方向LSTM**（Bidirectional LSTM）を用いて文脈を捉えるモデルです。

前方向と後方向のLSTM出力を組み合わせて、各単語に対応する**文脈化された分散表現**を構築します：

```
z_i = [順方向LSTM出力, 逆方向LSTM出力]
```

---

## ELMoによる単語予測

文中の任意の単語を予測するタスクを通じて学習されます。

損失関数：

```
- ∑ log p(w_i | 前文脈) + log p(w_i | 後文脈)
```

---

## 応用と活用例

- 文書分類、感情分析、QAなどの下流タスク
- 文章類似度、ベクトル比較
- 多義語の意味変化分析

---

## 補足とまとめ

- ELMoは**文字単位**に分割して入力
- 多層LSTM間に**Residual Connection**を導入し学習安定化
- 「固定埋め込み → 文脈化埋め込み」への転換点となった

---

## 参考文献（抜粋）

- Peters et al., “Deep contextualized word representations”, NAACL 2018
- Mikolov et al., “Efficient Estimation of Word Representations”, ICLR 2013
- Sanjeev Arora et al., “A Simple but Tough-to-Beat Baseline”, ICLR 2017

---

## BERT（Bidirectional Encoder Representations from Transformers）解説

BERTは、2018年にGoogleによって提案された革新的な自然言語処理モデルであり、様々なNLPタスクにおいて既存手法を大きく上回る性能を記録しました。

---

## BERTの構造

### Transformer Encoder

BERTはEncoder部分のみを用いて構成されています。以下の要素から成り立ちます：

- Multi-Head Attention
- Feedforward Network
- Residual Connection
- Layer Normalization

### Scaled Dot-Product Attention

```
Attention(Q, K, V) = Softmax(QK^T / √d) V
```

### Multi-Head Attention

複数の視点から情報を抽出し、それぞれのヘッド出力を結合して線形変換します。

---

## BERTの入力形式

### トークン化

- `[CLS]`：文頭トークン
- `[SEP]`：文末・文間トークン

```
[CLS] 今日 の 天気 は 雪 だった 。 [SEP]
```

### ベクトル化

- トークン埋め込み（token embedding）
- セグメント埋め込み（segment embedding）
- 位置埋め込み（position embedding）

---

## BERTの学習方法

### 事前学習（Pre-training）

#### Masked Language Model（MLM）

トークンの15%をマスクし予測タスクを行う。

#### Next Sentence Prediction（NSP）

2文が連続しているかを予測。

---

## まとめ

BERTは、Transformerベースの双方向言語モデルとして、文脈を考慮した柔軟な表現を学習可能にしました。次回は、BERTの**ファインチューニング**と**応用タスク**への活用方法について解説します。