2025-12-23

ラビット・チャレンジ - Stage 3. 深層学習 前編 (Day 3)

提出したレポートです。

絶対書きすぎですが、行間を埋めたくなるので仕方ない。


Rabbit Challenge - Stage 3. 深層学習 前編 (Day 3)

1. 再帰型ニューラルネットワークの概念

1.1. RNN 全体像

再帰型ニューラルネットワーク(Recurrent Neural Network : RNN)は、時系列データを扱うことを目的として設計されたニューラルネットワークである。

通常の多層パーセプトロンや畳み込みニューラルネットワークでは、入力データ同士が独立であること(i.i.d.)を暗黙的に仮定している。

一方で、自然言語や音声、時系列信号などでは、過去の入力が現在の出力に影響を与えるという性質が本質的である。

RNN はこの性質をモデル化するために、過去の情報を内部状態として保持し、それを次の計算に再利用する 再帰構造 を導入している。

1.1.1. RNN とは

RNN とは、各時刻において入力と同時に直前の中間状態(隠れ状態)を入力として受け取るニューラルネットワークである。

時刻 $t$ における隠れ状態 $\boldsymbol{h}_t$ は、現在の入力 $\boldsymbol{x}_t$ と直前の隠れ状態 $\boldsymbol{h}_{t-1}$ を用いて計算される。

$$ \boldsymbol{h}_t = f\left( W_x \boldsymbol{x}_t + W_h \boldsymbol{h}_{t-1} + \boldsymbol{b} \right) $$

ここで、

  • $W_x$:入力に対する重み
  • $W_h$:再帰(隠れ状態)に対する重み
  • $\boldsymbol{b}$:バイアス
  • $f(\cdot)$:活性化関数

である。

このように、RNN は「現在」と「過去」を結びつけることで、 系列全体の文脈を内部状態として表現する。

1.1.2. 時系列データ

時系列データとは、時間的な順序を持ち、順序を入れ替えることができないデータである。

代表例として、

  • 自然言語(単語列)
  • 音声信号
  • 株価・センサーデータ

などが挙げられる。

これらのデータでは、単一の入力だけでなく「どの順番で現れたか」が意味を持つため、入力同士を独立に扱うモデルでは十分な表現ができない。

RNN は、この「順序依存性」を内部状態に埋め込むことで、時系列データを扱うことを可能にしている。

1.1.3. RNN について

RNN の特徴は、同一の重みを全時刻で共有する点にある。

時間方向に RNN を展開すると、「重みを共有した非常に深いネットワーク」として解釈できる。

この重み共有により、

  • パラメータ数を抑えられる
  • 任意長の系列を扱える

という利点が得られる一方で、後述する 勾配消失・勾配爆発問題 を引き起こす原因ともなる。

1.2. BPTT(応用学習)

1.2.1. BPTT とは

BPTT(Backpropagation Through Time)とは、RNN に対して誤差逆伝播法を適用するための手法である。

RNN は再帰構造を持つため、そのままでは通常の誤差逆伝播を適用できない。

そこで、時間方向にネットワークを展開し、各時刻を一つの層とみなして誤差逆伝播を行う。

この「時間方向への展開」を考慮した誤差逆伝播が BPTT である。

1.2.2. BPTT の数学的記述

RNN を時間方向に展開すると、損失関数 $L$ は各時刻の損失 $L_t$ の和として表される。

$$ L = \sum_t L_t $$

再帰重み $W_h$ に対する勾配は、各時刻における勾配が連鎖的に伝播したものの総和となる。

このとき、活性化関数の微分や重み行列の積が時間方向に繰り返し現れるため、勾配が指数的に減衰または増大する可能性が生じる。

1.2.3. BPTT の全体像

BPTT によって、RNN は理論上は長期依存関係を学習できる。しかし実際には、

  • 勾配消失問題
  • 勾配爆発問題

により、長い系列に対する学習は困難である。

この問題を構造的に解決するために提案されたモデルが、次章で扱う LSTM である。

実装演習

まず、3_1_simple_RNN_after.ipynb の実行結果が、以下の通り。

stage_3_3_01.png

学習初期には損失が緩やかに減少し、その後 3,000〜4,000 iteration 付近で急激に損失が低下していることが確認できる。

これは、モデルがデータの基本的な構造を段階的に学習した後、判別に有効な特徴表現を獲得できたためと考えられる。

また、学習後半では損失がほぼ 0 に近い値で安定しており、発散や大きな振動は見られない。このことから、本設定では勾配爆発や学習率過大による不安定化は生じておらず、学習が安定して進行しているといえる。

以上より、これは適切なハイパーパラメータ設定により、単純な全結合ネットワークであっても十分に収束することを示しており、以降の try 実験における比較の基準(ベースライン)として妥当な結果である。

[try] weight_init_std や learning_rate, hidden_layer_size を変更してみよう

stage_3_3_02.png

まず、学習率を過大に設定した条件(lr too high)では、学習初期に損失が急激に増大し、その後も高い値で不安定に推移している。これは勾配更新が過剰となり、最適解付近を行き過ぎることで学習が収束しなくなる典型的な例であり、学習率が学習の安定性に強く影響することを示している。

次に、重み初期値の分散を大きく設定した条件(std too big)では、学習初期に非常に大きな損失が発生し、その後も振動を伴いながらゆっくりと減少している。この挙動は、初期段階で活性値や勾配が過大になり、学習が不安定化した結果と考えられる。

一方、適切な分散で初期化されたベースラインでは、損失が滑らかに減少しており、初期化の重要性が確認できる。

また、隠れ層のユニット数が極端に小さい場合(small hidden)では、損失は比較的早期に収束するものの、最終的な損失はベースラインより高く、表現能力不足による性能低下が示唆される。

一方で、隠れ層を過度に大きくした条件(large hidden)では、学習初期の収束はやや遅くなるが、最終的な損失は低く抑えられており、モデル容量の増加が表現力向上に寄与していることが分かる。

以上より、学習率・重み初期化・隠れ層サイズはいずれも学習の安定性および収束性能に大きな影響を与える要素であり、これらを適切に設定することが深層学習モデルの学習を成功させるために不可欠であることが、本実験結果から確認できる。

[try] 重みの初期化方法を変更してみよう

stage_3_3_03.png

分散の大きい標準正規分布による初期化(std_bad)では、初期損失が非常に大きく、学習中の損失変動も大きいことが確認できる。これは、初期重みが過度に大きいため、順伝播・逆伝播の段階で活性値および勾配が不安定になるためである。

一方、Xavier 初期化および He 初期化では、初期から損失が比較的低く抑えられ、学習も安定して進行している。特に ReLU を用いた場合には He 初期化が理論的に適しており、勾配の分散が層間で適切に保たれていると考えられる。

この結果から、初期化手法は最終性能だけでなく、学習初期の安定性や収束速度に大きく影響することが分かる。

[try] 中間層の活性化関数を変更してみよう

stage_3_3_04.png

ReLU を高い学習率で用いた場合、学習初期に損失が急激に増大するスパイクが観測され、その後も損失が高止まりする傾向が見られる。これは、ReLU が正の領域で勾配が一定であるため、学習率が大きいと重み更新が過剰になり、勾配爆発を引き起こしやすいためである。

一方、tanh を用いた場合は損失が滑らかに減少し、安定した学習が行われている。tanh は出力が $[-1,1]$ に制限されるため、勾配の大きさも抑制され、学習が安定しやすい。

この結果から、活性化関数の特性と学習率の組み合わせが学習安定性に大きく影響することが確認できる。

確認テスト

RNN のネットワークには大きくわけて 3 つの重みがある。1 つは入力から現在の中間層を定義する際にかけられる重み、1 つは中間層から出力を定義する際にかけられる重みである。残り 1 つの重みについて説明せよ

RNN の重みは大きく 3 つある。

  1. 入力 → 中間層(隠れ状態) を計算する重み(例:$W_x$)
  2. 中間層 → 出力 を計算する重み(例:$W_y$)
  3. 中間層 → 次時刻の中間層(再帰) を計算する重み(例:$W_h$ または $U$)

設問の「残り 1 つの重み」とは、③の 中間層から次の時刻の中間層へつながる再帰重みである。

下図の $y_1$ を $x, z_0, z_1, W_{in}, W, W_{out}$ を用いて数式で表せ

図に示された RNN において、出力 $y_1$ を $x, z_0, z_1, W_{in}, W, W_{out}$ を用いて数式で表す。

まず、時刻 $0$ における中間層(隠れ状態)$z_0$ は、初期状態として与えられているものとする。

時刻 $1$ における中間層 $z_1$ は、入力 $x_1$ と直前の中間層 $z_0$ を用いて計算される。

中間層にはシグモイド関数 $g(x)$ を作用させるため、$z_1$ は次式で表される。

$$ z_1 = g(W_{in} x_1 + W z_0 + b) $$

ここで $b$ はバイアスである。

次に、出力 $y_1$ は中間層 $z_1$ から出力層への重み $W_{out}$ を用いて次式で表される。

$$ y_1 = W_{out} z_1 + c $$

ここで $c$ は出力層のバイアスである。

以上より、$y_1$ は

$$ y_1 = W_{out} \cdot g(W_{in} x_1 + W z_0 + b) + c $$

と表される。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.188 - 190

Truncated BPTT(Truncated Backpropagation Through Time)は、RNN における誤差逆伝播を時間方向に無制限に行うのではなく、一定の長さで打ち切って行う手法 である。

通常の BPTT では、系列全体に対して誤差を逆伝播させるため、系列が長くなるほど計算量やメモリ使用量が増大し、学習が現実的でなくなるという問題がある。また、長い系列では勾配消失や勾配爆発が発生しやすい。

Truncated BPTT では、RNN の順伝播は連続した時系列として行う一方で、逆伝播の計算は一定ステップごとに区切って実行する。これにより、過去すべての時刻に対して誤差を伝播させる必要がなくなり、計算コストとメモリ使用量を大幅に削減できる。

ただし、逆伝播を打ち切るため、非常に長期の依存関係を直接学習することは困難となる。そのため、Truncated BPTT は計算効率と表現能力のトレードオフを考慮した、実用的な RNN 学習手法として位置づけられる。


2. LSTM

LSTM(Long Short-Term Memory)は、RNN における勾配消失問題を解決することを目的として提案されたモデルである。

LSTM では、情報の通り道を明示的に分離し、勾配が長時間にわたって伝播しやすい構造を持つ。

2.1. CEC

CEC(Constant Error Carousel)は、LSTM における セル状態 に相当する。

セル状態は、加算を中心とした更新構造を持ち、誤差が減衰しにくい経路として機能する。

この構造により、勾配が時間方向に安定して伝播し、長期依存関係の学習が可能となる。

2.2. 入力ゲートと出力ゲート

入力ゲートは、新しい情報をセル状態にどの程度書き込むかを制御する。

出力ゲートは、セル状態の情報をどの程度外部に出力するかを制御する。

これらのゲートはシグモイド関数によって $0 \sim 1$ の連続値を出力し、情報の流れを滑らかに制御する。

2.3. 忘却ゲート

忘却ゲートは、セル状態に保持されている過去情報をどの程度残すかを制御する。

このゲートの導入により、

  • 不要になった情報を明示的に捨てる
  • 長期的に重要な情報のみを保持する

ことが可能となり、LSTM の表現力と安定性が大きく向上した。

2.4. 覗き穴結合

覗き穴結合(Peephole Connection)は、セル状態を直接ゲート計算に利用する拡張構造である。

これにより、セル状態の値そのものを参照した、より精密なゲート制御が可能となる。

実装演習

なし。

確認テスト

以下の文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。このような場合、どのゲートが作用すると考えられるか

文中の「とても」という語は、空欄に入る語の予測において重要な意味情報を持たず、予測に影響を与えないと考えられている。

このような場合、LSTM では 忘却ゲート が主に作用すると考えられる。

忘却ゲートは、セル状態に保持されている過去の情報のうち、どの情報を残し、どの情報を破棄するかを制御する役割を持つ。

「とても」は強調を表す副詞であり、文全体の意味や空欄に入る語(例:食事内容など)を決定するうえで本質的な情報ではないため、忘却ゲートによって影響が小さくなる、あるいはセル状態から除去されると考えられる。

したがって、本問のように「予測に不要な語の影響を抑える」状況では、忘却ゲートが作用している と説明できる。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.244

LSTM は、RNN における勾配消失問題を緩和するために、セル状態 $c_t$複数のゲート機構 を導入したモデルである。

1 ステップにおける LSTM の計算は、以下のように整理できる。

まず、入力 $x_t$ と直前の隠れ状態 $h_{t-1}$ に対して、4 種類のアフィン変換を行う。

  • 忘却ゲート

$$ f_t = \sigma(x_t W_x^{(f)} + h_{t-1} W_h^{(f)} + b^{(f)}) $$

  • 入力候補

$$ g_t = \tanh(x_t W_x^{(g)} + h_{t-1} W_h^{(g)} + b^{(g)}) $$

  • 入力ゲート

$$ i_t = \sigma(x_t W_x^{(i)} + h_{t-1} W_h^{(i)} + b^{(i)}) $$

  • 出力ゲート

$$ o_t = \sigma(x_t W_x^{(o)} + h_{t-1} W_h^{(o)} + b^{(o)}) $$

次に、これらのゲートを用いてセル状態を更新する。

  • セル状態の更新

$$ c_t = f_t \odot c_{t-1} + g_t \odot i_t $$

ここで、$\odot$ は要素ごとの積(アダマール積)を表す。

最後に、セル状態から隠れ状態を計算する。

  • 隠れ状態

$$ h_t = o_t \odot \tanh(c_t) $$

このように、LSTM では

  • 忘却ゲート $f_t$ により過去情報の保持量を制御し
  • 入力ゲート $i_t$ と入力候補 $g_t$ により新しい情報を書き込み
  • 出力ゲート $o_t$ により外部への出力を制御する

という役割分担が、計算式レベルで明確に分離されている。

この構造により、セル状態 $c_t$ は加算を中心とした更新となり、勾配が時間方向に減衰しにくい経路(CEC)として機能する。


3. GRU

GRU(Gated Recurrent Unit)は、LSTM を簡略化した再帰型モデルである。

GRU では、

  • セル状態と隠れ状態を統合
  • ゲート数を削減

することで、構造を単純化しつつ LSTM に近い性能を実現している。

計算量やパラメータ数を抑えたい場合に有効であり、タスクによっては LSTM と同等の性能を示す。

実装演習

なし。

確認テスト

LSTM と CEC が抱える課題について、それぞれ簡潔に述べよ

LSTM が抱える課題 は、構造が複雑でパラメータ数が多く、計算コストおよび学習コストが大きくなりやすい点である。

入力ゲート・忘却ゲート・出力ゲートに加えてセル状態を持つため、単純な RNN と比較して計算量が増加し、学習に時間がかかる。また、データ量が少ない場合には過学習を起こしやすいという課題もある。

CEC(Constant Error Carousel)が抱える課題 は、情報を長期間保持できる一方で、不要な情報まで保持し続けてしまう可能性がある点である。

CEC は誤差を減衰させずに伝播させる構造を持つが、そのままでは情報の取捨選択ができないため、重要でない情報がセル状態に残り続ける問題が生じる。

このため、LSTM では CEC 単体ではなく、忘却ゲートなどのゲート機構を組み合わせることで、必要な情報のみを保持し、不要な情報を適切に除去できるようにしている。

LSTM と GRU の違いを簡潔に述べよ

LSTM と GRU の違い は、主に構造の複雑さとゲート機構にある。

LSTM は、セル状態(CEC)を中心に、入力ゲート・忘却ゲート・出力ゲート の 3 つのゲートを用いて情報の書き込み・保持・出力を制御する。

この構造により長期依存関係を安定して学習できる一方、パラメータ数が多く、計算コストが高いという特徴を持つ。

一方、GRU は 更新ゲートとリセットゲート の 2 つのゲートを用い、セル状態と隠れ状態を統合した簡略化構造を持つ。

LSTM と比べてパラメータ数が少なく、学習や計算が高速である点が特徴である。

このように、表現力と制御の細かさを重視する場合は LSTM、計算効率や実装の簡潔さを重視する場合は GRU が適している。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.394

GRU(Gated Recurrent Unit)は、LSTM を簡略化した再帰型ニューラルネットワークであり、セル状態を持たず、隠れ状態のみで情報を管理する 構造を持つ。

LSTM が「隠れ状態」と「記憶セル」の 2 系統を扱うのに対し、GRU は隠れ状態 $h_t$ のみを用いる点が特徴である。

GRU における 1 ステップの計算は、以下のように整理できる。

まず、更新ゲート $z_t$ とリセットゲート $r_t$ を計算する。

  • 更新ゲート

$$ z_t = \sigma(x_t W_x^{(z)} + h_{t-1} W_h^{(z)} + b^{(z)}) $$

  • リセットゲート

$$ r_t = \sigma(x_t W_x^{(r)} + h_{t-1} W_h^{(r)} + b^{(r)}) $$

次に、リセットゲートを用いて中間状態 $\tilde{h}_t$ を計算する。

  • 中間状態

$$ \tilde{h}_t = \tanh(x_t W_x + (r_t \odot h_{t-1}) W_h + b) $$

ここで、$\odot$ は要素ごとの積(アダマール積)を表す。

最後に、更新ゲートを用いて隠れ状態を更新する。

  • 隠れ状態の更新

$$ h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t $$

この式から分かるように、更新ゲート $z_t$ は

  • 過去の隠れ状態 $h_{t-1}$ をどの程度保持するか
  • 新しく計算した中間状態 $\tilde{h}_t$ をどの程度採用するか

を制御する役割を持つ。

GRU は、LSTM と比較してゲート数が少なく、計算式も単純であるため、計算コストが低く、学習が高速になりやすい という利点を持つ。一方で、セル状態を明示的に分離していないため、タスクによっては LSTM の方が安定した性能を示す場合もある。


4. 双方向 RNN

双方向 RNN は、過去から未来への情報未来から過去への情報 を同時に扱うモデルである。

通常の RNN では、過去の情報しか利用できないが、双方向 RNN では系列全体を文脈として扱うことができる。

特に自然言語処理において、文全体の意味を考慮する必要がある場合に有効である。

実装演習

なし。

確認テスト

なし。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.360 - 362

双方向 RNN(Bidirectional RNN)は、系列データを 順方向と逆方向の両方から同時に処理 することで、各時刻における表現に前後の文脈情報を反映させる手法である。

特に自然言語処理の分野では、単語の意味が前後関係に強く依存するため、双方向処理が有効であることが知られている。

通常の RNN や LSTM では、系列を左から右へ一方向に処理するため、ある単語に対応する隠れ状態には、その単語より前の情報しか含まれない。

これに対し、双方向 RNN では、

  • 左から右に処理する RNN
  • 右から左に処理する RNN

の 2 つを並列に用い、それぞれの隠れ状態を統合することで、各時刻の表現に両方向の文脈情報を含めることができる。

実装上は、同一構造の RNN(または LSTM)を 2 つ用意し、一方には元の系列を、もう一方には逆順にした系列を入力する。その後、各時刻における 2 つの隠れ状態を 連結(concatenate) することで、最終的な隠れ状態ベクトルを得る方法が一般的である。

この点から、双方向 RNN は新しい計算構造を導入するというよりも、既存の RNN を組み合わせた拡張手法 として理解できる。

なお、双方向 RNN は系列全体を事前に観測できることを前提とするため、リアルタイム処理やオンライン推論には不向きである。一方で、機械翻訳や文章分類、系列全体を一括で処理できるタスクにおいては、高い表現力を発揮する。

このように、双方向 RNN は

  • 系列全体の文脈を考慮した表現が必要な場合に有効であり
  • Attention 機構と組み合わせることで、より精度の高い系列変換を実現できる

という点で、seq2seq や Attention モデルの Encoder 側を強化する重要な技術として位置づけられる。


5. seq2seq

seq2seq(Sequence to Sequence)モデルは、系列から系列への変換を目的としたモデルである。

Encoder と Decoder という二つの RNN から構成される。

5.1. Encoder RNN

Encoder RNN は、入力系列を処理し、その情報を内部状態(文脈ベクトル)に圧縮する。

5.2. Decoder RNN

Decoder RNN は、Encoder が生成した文脈ベクトルをもとに、出力系列を逐次生成する。

5.3. HRED

HRED(Hierarchical Recurrent Encoder-Decoder)は、文や発話を階層的に扱う seq2seq モデルである。

5.4. VHRED

VHRED は、HRED に確率的潜在変数を導入したモデルであり、出力の多様性を表現可能にしている。

5.5. VAE

5.5.1. オートエンコーダー

オートエンコーダーは、入力を一度低次元空間に写像し、再構成するモデルである。

5.5.2. VAE

VAE(Variational Autoencoder)は、潜在変数を確率分布として扱う確率的オートエンコーダーである。

実装演習

なし。

確認テスト

下記の選択肢から、seq2seq について説明しているものを選べ

正解は (2) である。

seq2seq は、RNN を用いた Encoder–Decoder モデル の一種であり、入力系列を Encoder で内部表現に変換し、その表現を用いて Decoder が出力系列を生成する構造を持つ。

このため、機械翻訳や文章生成など、系列から系列への変換を行うタスクに利用される。

なお、

  • (1)は双方向 RNN の説明
  • (3)は構文木を用いる再帰型ニューラルネットワーク(Recursive Neural Network)の説明
  • (4)は LSTM の説明

である。

seq2seq と HRED、HRED と VHRED の違いを簡潔に述べよ

seq2seq と HRED の違い は、文脈の扱い方にある。

seq2seq は単一の入力系列を Encoder で固定長ベクトルに変換し、それを用いて Decoder が出力系列を生成するモデルであり、各入力文を独立に扱う構造である。

一方、HRED(Hierarchical Recurrent Encoder-Decoder) は、文単位の Encoder に加えて、複数文の流れを扱う **上位の RNN(文脈 RNN)**を持つ階層構造を採用している。

これにより、対話などにおいて過去の発話履歴を文脈として保持しながら応答を生成できる。

HRED と VHRED の違い は、確率的表現の有無にある。

VHRED(Variational HRED)は、HRED に 潜在変数 を導入し、文脈表現を確率分布として扱うモデルである。

この構造により、同一の文脈に対しても多様な応答を生成でき、出力の単調化を防ぐことが可能となる。

まとめると、

  • seq2seq は単文処理向けの基本モデル
  • HRED は文脈を考慮した階層型モデル
  • VHRED は文脈に確率的多様性を導入した拡張モデル

である。

VAE に関する下記の説明文中の空欄に当てはまる言葉を答えよ

空欄に当てはまる語は 確率分布 である。

VAE は、自己符号化器(オートエンコーダ)の潜在変数に 確率分布 を導入したモデルであり、潜在空間を確率的に扱うことで、多様なデータ生成を可能にしている。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.287 - 291

seq2seq における Encoder–Decoder 構造の整理

seq2seq は、Encoder と Decoder の 2 つの RNN 系モデル を組み合わせることで、ある時系列データを別の時系列データへ変換するモデルである。機械翻訳を代表例とし、入力系列と出力系列の長さが異なる場合にも対応できる点が特徴である。

Encoder は、入力された文章を単語単位で処理し、時系列全体を 固定長のベクトル表現 $h$ に変換する役割を担う。具体的には、RNN(一般には LSTM や GRU)を用いて入力系列を順に処理し、最終時刻の隠れ状態を文章全体の要約表現として出力する。この処理は、可変長の文章を固定次元のベクトルへ圧縮する操作と捉えることができる。

Decoder は、Encoder が出力したベクトル $h$ を初期状態として受け取り、目的とする文章を 1 単語ずつ逐次的に生成 する。各時刻において、Decoder は直前に生成した単語と内部状態をもとに次の単語の確率分布を計算し、Softmax を通して出力単語を決定する。このとき、文の開始と終了を制御するために、特殊記号(例:<eos>)が用いられる。

seq2seq の特徴的な点は、Encoder と Decoder が 隠れ状態ベクトル $h$ を介して接続されている ことである。順伝播では、Encoder で圧縮された情報が Decoder に渡され、逆伝播では、その経路を通じて誤差が Encoder 側へと伝播する。このため、Encoder と Decoder は独立したモデルではなく、一体のネットワークとして同時に学習される。

一方で、この構造では、入力系列のすべての情報を固定長ベクトル $h$ に集約する必要があるため、文章が長くなると情報の欠落が生じやすい。この問題を緩和するために、後に Attention 機構が導入され、Encoder の各時刻の隠れ状態を Decoder が直接参照できるよう拡張されている。


6. word2vec

word2vec は、単語を高次元ベクトルとして表現する手法である。

単語間の意味的類似性をベクトル空間上の距離として表現できる点が特徴であり、RNN や seq2seq における入力表現として広く用いられる。

実装演習

なし。

確認テスト

なし。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.101 - 106

word2vec は、単語を固定長の実数ベクトルとして表現する 分散表現(word embedding) を学習する手法である。本来はツール名であるが、一般にはその内部で用いられる CBOW モデル および skip-gram モデル を含めて指すことが多い。

CBOW(Continuous Bag-of-Words)モデルは、周囲の単語(コンテキスト)から中央の単語を予測することを目的としたニューラルネットワークである。入力は one-hot 表現された複数のコンテキスト単語であり、それぞれが同一の重み行列 $W_{\text{in}}$ によって変換される。

入力層から中間層への変換は、全結合層ではなく 行列積(MatMul) として実装される。このとき、one-hot ベクトルと $W_{\text{in}}$ の積は、対応する単語の行ベクトルを取り出す操作に等しい。すなわち、$W_{\text{in}}$ の各行が、各単語の分散表現そのものに対応している。

複数のコンテキスト単語が与えられる場合、それぞれの単語ベクトルは平均され、中間層の表現となる。この平均操作により、CBOW モデルは 単語順序を考慮せず、周辺語の集合(bag-of-words)として文脈を扱う構造を持つ。

中間層から出力層への変換では、別の重み行列 $W_{\text{out}}$ が用いられ、各単語に対応するスコアが計算される。これらのスコアに Softmax 関数を適用することで、中央単語が各語である確率分布が得られる。学習では、正解単語の確率が高くなるように重みが更新される。

この学習過程を通じて、意味的に似た文脈で出現する単語同士は、似たベクトル表現を持つように $W_{\text{in}}$ が更新される。最終的に得られる単語ベクトルは、人間が直接解釈できるものではないが、意味情報を圧縮して保持する表現となる。この点で、CBOW モデルは「エンコード」を通じて意味を数値化し、「デコード」を通じて予測を行う構造を持つと捉えることができる。


7. Attention Mechanism

Attention Mechanism は、seq2seq における 固定長ベクトルの限界 を解決するために提案された。

出力生成時に、入力系列のどの部分に注目すべきかを重みとして計算することで、長い系列に対しても有効な情報参照が可能となる。

実装演習

なし。

確認テスト

RNN と word2vec、seq2seq と Attention の違いを簡潔に述べよ

RNN は、時系列データを扱うためのニューラルネットワークであり、過去の入力を隠れ状態として保持しながら系列全体を処理するモデルである。主に文脈情報を考慮した系列処理を目的とする。

word2vec は、単語を意味的な特徴を持つ固定長のベクトルに変換する手法であり、文脈を直接処理するモデルではない。単語間の意味的類似性をベクトル空間上で表現することを目的とし、RNN などのモデルへの入力表現として利用される。

seq2seq+Attention は、Encoder–Decoder 構造を持つ seq2seq モデルに Attention 機構を導入したものである。出力生成時に入力系列の各要素へ重み付けを行い、重要な情報を動的に参照できるため、固定長ベクトルに依存する RNN や通常の seq2seq よりも長い系列に対して高い性能を示す。

まとめると、

  • RNN は系列処理の基盤モデル
  • word2vec は単語の分散表現手法
  • seq2seq+Attention は系列変換を高精度に行う応用モデル

である。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.325 - 348

Attention 導入の動機

従来の seq2seq モデルでは、Encoder が入力文全体を 固定長のベクトル に圧縮し、その情報を Decoder に渡すことで文章生成や翻訳を行っていた。

しかしこの構造には、入力文が長くなるほど重要な情報が失われやすいという問題がある。特に自然言語処理では、文の後半に現れる単語や、文脈上重要な語が、固定長ベクトルへの圧縮過程で十分に反映されない場合がある。

この問題は「長文になるほど性能が劣化する」「入力文のどの部分を参照して出力しているのかが不明瞭である」といった形で顕在化する。

人間が翻訳や文章理解を行う際には、生成中の単語に応じて原文中の異なる箇所に注目しているが、従来の seq2seq モデルではこのような柔軟な参照ができなかった。

この固定長表現の制約を解消するために導入されたのが Attention 機構 である。

Attention の基本的な考え方

Attention 機構の本質は、「Decoder が出力を生成する各時刻において、Encoder のどの時刻の情報をどの程度参照するかを動的に決定する」点にある。

Encoder は入力系列の各時刻ごとに隠れ状態ベクトルを出力する。Attention を用いない場合、これらの情報は最終時刻の隠れ状態に集約されるが、Attention 機構では 全時刻の隠れ状態を保持したまま Decoder に渡す。

Decoder は、現在の内部状態と Encoder の各隠れ状態との「関連度」を計算し、それらを重みとして正規化する。この重みは Attention 重み と呼ばれ、どの入力単語にどれだけ注目しているかを数値として表す。

得られた重みを用いて Encoder の隠れ状態を加重平均したベクトルを コンテキストベクトル とし、これを Decoder の次の出力計算に利用する。これにより、Decoder は出力単語ごとに異なる入力位置の情報を重点的に参照できるようになる。

Attention 機構の仕組み(概念的説明)

Attention の計算は、大きく以下の流れで行われる。

  1. スコア計算

    Decoder の現在の状態と、Encoder の各時刻の隠れ状態との類似度を計算する。

  2. 正規化

    得られたスコアに Softmax 関数を適用し、重みの総和が 1 となるように正規化する。

  3. 重み付き和の計算

    正規化された重みを用いて Encoder の隠れ状態を加重平均し、コンテキストベクトルを生成する。

  4. 出力生成への利用

    このコンテキストベクトルを Decoder の入力や出力計算に組み込み、次の単語を生成する。

この一連の処理を Decoder の各時刻で繰り返すことで、出力単語ごとに参照する入力情報を柔軟に切り替えることが可能になる。

Attention 導入による効果

Attention 機構を導入することで、以下のような利点が得られる。

  • 入力文が長くなっても情報を保持しやすくなる
  • 出力単語と入力単語の対応関係を明示的に扱える
  • 翻訳や要約などで性能が大きく向上する
  • 「どの単語に注目しているか」を可視化でき、モデルの解釈性が向上する

このように、Attention は単なる性能向上のための工夫ではなく、系列変換モデルの表現能力そのものを拡張する重要な機構である。

まとめ

Attention 機構は、従来の seq2seq モデルが抱えていた「固定長ベクトルによる情報圧縮」という制約を克服するために導入された。

Encoder が出力する各時刻の情報を保持し、Decoder が必要に応じて参照先を選択することで、より柔軟で高精度な系列変換を実現している。

この考え方は後に Transformer へと発展し、現在の自然言語処理モデルの基盤となっている。

8. VQ-VAE

8.1. VQ-VAE 導入の背景と動機

変分オートエンコーダ(VAE)は、入力データを潜在変数へ写像し、その潜在空間からデータを生成する確率的生成モデルである。

しかし、通常の VAE では潜在変数が連続値で表現されるため、画像や音声に含まれる離散的・カテゴリ的な構造を十分に捉えにくいという課題がある。

また、Encoder が出力する潜在変数が Decoder に十分利用されなくなる posterior collapse と呼ばれる問題も知られている。

これらの問題に対し、潜在表現を離散化することで表現力を高めることを目的として提案されたのが VQ-VAE(Vector Quantized Variational AutoEncoder) である。

VQ-VAE は、潜在変数を連続空間ではなく、有限個の埋め込みベクトルから選択される離散表現として扱う点に特徴がある。

8.2. VQ-VAE のモデル構成

VQ-VAE は、Encoder、Vector Quantization(コードブック)、Decoder の三つの要素から構成される。

まず Encoder は、入力データ $x$ を連続値の潜在表現 $z_e(x)$ に変換する。次に、この $z_e(x)$ はコードブックと呼ばれる有限個の埋め込みベクトル集合と比較され、最も距離が近いベクトルが選択される。この処理により、潜在表現は

$$ z_q(x) = e_k $$

という離散的な表現へと量子化される。最後に Decoder は、この量子化された潜在表現 $z_q(x)$ を用いて元の入力データの再構成を行う。

このように VQ-VAE では、潜在空間が明示的に離散化されており、入力データが「コード列」として表現される点が従来の VAE と大きく異なる。

8.3. 損失関数の構造

VQ-VAE の学習は、以下の三つの損失項から構成される。

$$ \mathcal{L} = \log p(x \mid z_q(x)) + \| \mathrm{sg}[z_e(x)] - e \|^2 + \beta \| z_e(x) - \mathrm{sg}[e] \|^2 $$

第一項は 再構成誤差 であり、Decoder が入力データをどれだけ正確に再現できているかを評価する。

第二項は コードブック損失 であり、選択された埋め込みベクトルが Encoder の出力に近づくよう更新される。この項では Encoder 側への勾配伝播は遮断される。

第三項は コミットメント損失 であり、Encoder の出力が特定の埋め込みベクトルに過度に離れないよう制約を与える役割を持つ。係数 $\beta$ はこの制約の強さを調整するハイパーパラメータである。

ここで用いられる $\mathrm{sg}[\cdot]$ は stop gradient を意味し、特定の経路での勾配伝播を遮断するために用いられる。

8.4. 勾配伝播と Straight-Through Estimator

ベクトル量子化処理は最近傍探索を含むため、数学的に微分不可能である。この問題に対処するため、VQ-VAE では straight-through estimator が用いられる。

具体的には、順伝播では量子化された $z_q(x)$ を Decoder に入力するが、逆伝播ではその勾配をそのまま Encoder の出力 $z_e(x)$ に流す。この近似により、量子化を含むモデルであっても Encoder と Decoder を同時に学習することが可能となっている。

8.5. VQ-VAE の意義と位置づけ

VQ-VAE は、VAE の枠組みを保ちつつ、潜在表現を離散化することで表現力を向上させたモデルである。KL ダイバージェンスを用いずに学習できる点や、潜在表現が明示的なコードとして扱える点は、画像生成や音声生成において大きな利点となる。

この考え方は、後続の VQ-VAE-2 や音声生成モデルなどへと発展しており、離散潜在表現に基づく生成モデルの基盤技術として重要な位置を占めている。

実装演習

なし。

確認テスト

なし。

参考図書 / 関連記事

VQ-VAE の特徴の一つとして、生成過程を二段階に分離している点が挙げられる。論文では

Whilst training the VQ-VAE, the prior is kept constant and uniform. After training, we fit an autoregressive distribution over z, p(z), so that we can generate x via ancestral sampling.

と述べられており、VQ-VAE 本体の学習中は prior を一様分布に固定し、潜在表現の獲得に専念する一方で、その後に潜在変数 z 上で自己回帰モデルによる prior を別途学習する、という構成が明確に示されている。

この構成により、生成時にはまず離散潜在空間上で自己回帰モデルによって潜在変数 z を生成し、その後 Decoder によってデータ空間へ写像するという二段階の生成過程が実現される。実際に論文中では、

Samples drawn from the PixelCNN were mapped to pixel-space with the decoder of the VQ-VAE.

と説明されており、生成処理が潜在空間とデータ空間の二段階で実行されていることが明示されている。

ここで重要なのは、VQ-VAE 本体は意味的に有用な離散潜在表現を学習する役割を担い、その潜在表現上に自己回帰的な prior を学習することで、はじめて意味的に一貫した生成が可能になる、という点である。

すなわち、VQ-VAE は高次元なデータ空間で直接生成を行うのではなく、一度学習された意味的に圧縮された潜在表現の空間上で生成を行い、その結果を Decoder によってデータ空間へ展開する、という設計思想を採用している。

このような prior と Decoder の役割分離は、強力な自己回帰モデルを Decoder 側に置くことで生じやすい posterior collapse を回避しつつ、高次元データの長距離構造を効率的にモデル化するための、VQ-VAE を特徴づける重要な設計思想である。


9. [フレームワーク演習] 双方向 RNN / 勾配のクリッピング

双方向 RNN は、時系列データを 過去から未来方向未来から過去方向 の両方向から同時に処理する構造を持つ。

通常の RNN では、各時刻の出力は過去の情報のみに基づいて計算されるが、双方向RNNでは系列全体の文脈を考慮した特徴表現を得ることが可能となる。音声認識のように、ある時刻の情報が前後の音素に強く依存するタスクにおいては、この双方向性が有効に働く。

一方、RNN 系モデルでは、時系列が長くなるにつれて 勾配爆発勾配消失 が発生しやすいという問題がある。この演習では、この問題に対する代表的な対策として 勾配のクリッピング を導入している。

勾配クリッピングとは、逆伝播時に計算される勾配の大きさがあらかじめ定めた閾値を超えた場合に、その値を制限する手法である。

実装では、最適化手法として Adam を用い、その引数として clipvalue を指定することで勾配クリッピングを適用している。これにより、学習初期や不安定な状況においてもパラメータ更新が過度に大きくなることを防ぎ、学習の発散を抑制する効果が期待できる。

このように、双方向RNNによる 文脈情報の拡張 と、勾配クリッピングによる 学習の安定化 は、いずれも実用的な時系列モデルを構築する上で重要な技術であり、本演習はそれらをフレームワークレベルで確認する内容となっている。

実装演習

3_4_spoken_digit.ipynb を実行した。

  • 双方向 RNN (LSTM) を使用したモデル

stage_3_3_05.png

model.summary() から、双方向 RNN では順方向と逆方向の RNN の出力が結合されるため、通常の RNN や LSTM と比較して出力次元およびパラメータ数が増加していることが確認できる。

双方向 RNN は、系列データを過去から未来方向だけでなく、未来から過去方向にも同時に処理することができるため、入力系列全体の文脈情報をより豊かに利用できるという利点を持つ。特に音声認識のように、前後の時間情報が重要となるタスクにおいて有効である。

一方で、パラメータ数の増加に伴い計算量が増大するため、学習コストが高くなる点には注意が必要である。本結果から、双方向 RNN は表現力を高める一方で、モデルの複雑化を伴う手法であることが確認できた。

  • 勾配のクリッピング

stage_3_3_06.png

勾配クリッピングは、逆伝播時に勾配の大きさを一定範囲に制限することで、勾配爆発を防止する手法である。

実行結果から、勾配クリッピングを設定したモデルでは学習が途中で発散することなく、安定して最後まで進行していることが確認できた。これは、RNN 系モデルで問題となりやすい勾配爆発が抑制され、パラメータ更新が過度にならなかったためであると考えられる。

このことから、勾配クリッピングは RNN や LSTM などの系列モデルにおいて、学習を安定化させるための有効な手法であることが分かる。

確認テスト

なし。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.232 - 233

勾配クリッピングは、RNN などの系列モデルにおいて問題となる 勾配爆発 への代表的な対策である。

逆伝播によって得られた勾配ベクトル全体のノルムが、あらかじめ定めたしきい値を超えた場合に、勾配の大きさを一定範囲内に収めるよう正規化を行う。

具体的には、全パラメータに対応する勾配を一つのベクトル $\boldsymbol{g}$ とみなし、その L2 ノルム $\| \boldsymbol{g} \|$ が $\text{threshold}$ を超えた場合、

$$ \boldsymbol{g} \leftarrow \frac{\text{threshold}}{\| \boldsymbol{g} \|}\boldsymbol{g} $$

のようにスケーリングを行う。この処理により、勾配の方向を保ったまま大きさのみを制限できるため、学習の発散を防ぎつつ安定した更新が可能となる。

勾配クリッピングはアルゴリズムとして単純でありながら、多くの RNN・LSTM 系モデルで有効に機能する手法である。特に系列長が長くなる場合や、学習初期に勾配が不安定になりやすい状況において、学習を継続可能な範囲に保つための基本的な対策として位置づけられる。


10. [フレームワーク演習] seq2seq

seq2seq(Sequence to Sequence)モデルは、入力系列を別の系列へ変換するためのニューラルネットワーク構造であり、主に Encoder–Decoder 構成 を採用する点に特徴がある。代表的な応用例として、機械翻訳、時系列予測、音声認識などが挙げられる。

Encoder は入力系列を時系列順に処理し、その情報を内部状態(隠れ状態)として要約する役割を担う。一方、Decoder は Encoder が出力した最終的な隠れ状態を初期状態として受け取り、目的とする出力系列を逐次生成する。この構造により、入力系列と出力系列の長さが異なる問題にも対応可能となる。

この演習では、sin 波を入力として cos 波を出力するタスクを通じて、seq2seq モデルの基本的な挙動を確認している。このような連続値の系列変換においても、Encoder が入力系列の時系列的特徴を内部表現に圧縮し、Decoder がその表現をもとに出力系列を再構成できることが示されている。

ただし、標準的な seq2seq モデルでは、入力系列全体の情報を固定長のベクトルに圧縮する必要があるため、系列が長くなるにつれて情報損失が生じやすいという課題がある。この問題は、後に導入される Attention 機構によって改善されることが知られている。

以上より、seq2seq は系列変換問題の基本構造を理解するうえで重要なモデルであり、Attention や Transformer といった発展的手法の基礎となる位置付けにある。

実装演習

3_5_Seq2Seq(Encoder-Decoder)_sin-cos.ipynb を実行した。

ここだけ、コードを修正する。

pred_d_state_in = tf.keras.layers.Input(shape=(NUM_HIDDEN_PARAMS,))
  • 学習の進行状況

stage_3_3_07.png

学習損失(loss)と検証損失(val_loss)は、ともに初期エポックで急激に減少し、その後は緩やかに低下しながら安定して収束している。この挙動から、Encoder–Decoder 型の seq2seq モデルが sin–cos の時系列変換タスクを適切に学習できていることが確認できる。

また、学習損失と検証損失の間に大きな乖離は見られず、過学習の兆候はほとんど確認されない。これは、タスクが比較的単純な連続値回帰問題であり、モデル容量とデータ量のバランスが適切であったためと考えられる。

  • 推論

stage_3_3_08.png

出力された波形(output)は、正解波形(correct)である cos 波と全体的に良く一致しており、振幅や周期といった特徴を適切に再現できていることが分かる。特に位相のずれが小さく、Encoder が入力系列(sin)から必要な時系列情報を潜在状態に圧縮し、Decoder がそれを用いて連続値系列を生成できている点は、seq2seq モデルの有効性を示している。

一方で、局所的にはピーク付近や谷付近でわずかな誤差が見られる。これは、固定長の潜在ベクトルに時系列全体の情報を圧縮しているため、細かな時間依存構造の再現に限界があることが原因と考えられる。この点は、Attention 機構を導入することで改善される典型的な課題である。

確認テスト

なし。

参考図書 / 関連記事

  • ゼロから作る Deep Learning ② - 自然言語処理編(斎藤 康毅 著)
    • p.310 - 313

seq2seq モデルでは、入力系列を固定長の内部表現に圧縮する構造上、系列の先頭に位置する情報ほど出力との距離が長くなり、勾配が伝わりにくくなるという問題がある。これにより、学習の進行が遅くなり、精度が伸びにくくなる場合がある。

この問題に対する簡易的な改良手段の一つが、入力系列を時間方向に反転させる 方法である。入力を反転させることで、出力に強く関係する入力要素が Decoder に近い位置に配置され、逆伝播時の勾配がより直接的に伝わるようになる。

テキストに掲載されている実験結果からも、入力系列を反転させただけで学習の進みが明確に改善し、正解率が大きく向上することが確認できる。これはモデル構造を変更せず、前処理のみで効果が得られる点で実用的である。

以上より、入力系列の反転は seq2seq モデルにおける 勾配伝播を改善するための有効な工夫の一つ であり、Attention 機構のような構造的改良が導入される以前に用いられてきた、基本的かつ重要な手法である。


11. [フレームワーク演習] data-augmentation

11.1. Data Augmentation の目的

Data Augmentation(データ拡張)とは、既存の学習データに変換を加えて擬似的にデータ数を増やす手法である。

主な目的は以下のとおりである。

  • 学習データ不足の緩和
  • 過学習(訓練データへの過度な適合)の抑制
  • 入力のわずかな変動に対する 頑健性(ロバスト性) の向上

特に画像認識や音声認識などでは、実データ収集が困難なため重要な手法となる。

11.2. Data Augmentation の基本的な考え方

データ拡張では、ラベルの意味を保ったまま入力のみを変形する。

例(画像)

  • 回転
  • 平行移動
  • 拡大・縮小
  • 左右反転
  • 明るさ・コントラスト変更

これにより、モデルは「特定の見た目」ではなく「本質的な特徴」を学習しやすくなる。

11.3. フレームワーク(TensorFlow)での実装位置

TensorFlow / Keras では、Data Augmentation は以下の形で実装されることが多い。

  • tf.keras.layers による、前処理レイヤとしての組み込み
  • 学習時のみ有効(推論時は適用されない)

これにより、

  • 学習データを事前に保存し直す必要がない
  • GPU 上で効率よく処理できる

という利点がある。

11.4. Data Augmentation の効果と注意点

効果

  • validation loss の悪化を抑制しやすい
  • 汎化性能が向上しやすい

注意点

  • 変換が強すぎると、元のラベルと意味的に矛盾する場合がある
  • すべてのタスクに有効とは限らない(例:数値データ)

そのため、「どの変換がタスクに適切か」を意識して設計する必要がある。

実装演習

3_6_data_augmentation_with_tf_add2.ipynb を実行した。

今回のノートブックは、そのままだと動かなかったため、以下のような修正を加えた。

  • RandAugment で、imgaug を使用せず Keras 標準の Data Augmentation を使用する
  • EDA で、stop_words が Pandas で読み込めないため、strip() で処理する

RandAugment

stage_3_3_09.png

RandAugment は、回転・平行移動・色変換などの複数の変換をランダムに合成して適用するため、同一ラベルのまま見た目が大きく異なる画像を作れる。

これにより、モデルが「背景・撮影条件・色味」といった偶然の要素に過適合しにくくなり、汎化性能(未知データへの強さ)を上げる方向に働く。

一方で、変換が強すぎると本来の識別に必要な手掛かりまで壊れる(例:物体の形状が崩れて別物に見える)ため、強度(magnitude)や適用回数はデータセットに合わせて調整が必要となる。

Synonym Replacement

stage_3_3_10.png

スクショの例では「類似→似る」「する→遣る」のように同義語置換が起きていますが、日本語ではこの手法が 意味を壊しやすい のが注意点である。

  • 良い点:
    • 語彙の揺れ(言い換え)にモデルを慣らし、表現が少し違っても同じ意味として扱えるようにする効果が期待できる
  • 悪い点:
    • 日本語は 活用・品詞制約 が強く、単純な単語置換だと文法が崩れやすい
    • 同義語辞書の粒度次第で「する→造る」のような 文脈不一致 が起き、ラベルノイズになり得る

実務的には、置換対象を「名詞・形容詞中心にする」「助詞や汎用動詞(する等)は除外」「置換候補の品詞一致を条件にする」などの制約を入れると安定する。

Random Insertion

stage_3_3_11.png

例では「行う」「保存」などが挿入され、文が「類似行うするデータ保存を…」のように不自然になっている。

  • 良い点:文の一部に余計な語が入っても意味を保つような頑健性(ノイズ耐性)を与えられる
  • 悪い点:挿入位置がランダムだと、特に日本語では 語順・係り受け が崩れて意味が変わりやすい

そのため、挿入は「同義語を近傍に入れる」「句読点単位で入れる」など、挿入位置のルール がないとノイズが強すぎて学習を邪魔する可能性がある。

Random Swap

stage_3_3_12.png

スクショでは「を⇔類似」「する⇔ます」などが入れ替わり、文がほぼ崩壊している。

Swap は語順を崩すため、英語のように語順依存が比較的弱い言語でも効果は限定的なことがあるが、日本語では助詞が重要で、助詞や語尾を入れ替えると意味が壊れやすい。

したがって日本語で使うなら、

  • スワップ対象を「内容語(名詞など)だけ」に限定
  • 「助詞・助動詞・句読点は対象外」のような制限がほぼ必須。制限なしだとデータ品質が落ち、性能低下に繋がり得る

Random Deletion

stage_3_3_13.png

例では「ます」が削除されて「…書いて。」となっている。

  • 良い点:一部の語が欠落してもクラス判定できるようにする(入力の欠損への頑健性)
  • 悪い点:削除確率が高いと、情報量が足りずに ラベルを支えられない文 が増える。特に短文では致命的になりやすい

実用上は p をかなり小さく(短文ほど小さく)し、さらに「全部消える」ケースをフォールバックで救う(今回入れている処理)は妥当。

  • EDA

stage_3_3_14.png

EDA は SR/RI/RS/RD を混ぜて複数文を生成するため、単一手法より多様性 が出る。

  • 良い点:データが少ないときに、軽量にバリエーションを増やせる(特にベースラインの底上げに向く)
  • 注意点:日本語では上述の通り、制約なしだと文法崩壊が起きやすく、水増ししたつもりがノイズを増やす 危険がある

そのため、EDA を日本語で使う場合は、

  • 置換/挿入の対象を内容語に限定
  • 助詞や「する」のような汎用語を除外
  • 生成文を目視 or ルールでフィルタ(文字数下限、記号だらけ除外など)といった品質管理が重要、という結論になる

確認テスト

なし。

参考図書 / 関連記事

以下は、1. Introduction より引用。

We demonstrate that the optimal strength of a data augmentation depends on the model size and training set size. This observation indicates that a separate optimization of an augmentation policy on a smaller proxy task may be sub-optimal for learning and transferring augmentation policies.

RandAugment では、データ拡張の「強さ」は一律に決めるべきものではなく、モデルの規模やデータセットの大きさに依存する ことが指摘されている。実際、論文では小規模モデルと大規模モデルでは最適な拡張強度が異なることが実験的に示されている。

この結果は、従来の AutoAugment のように、小さな proxy task 上で探索した拡張方針をそのまま大規模タスクへ適用する方法が、必ずしも最適でないことを意味している。

そのため RandAugment では、探索フェーズ自体を廃し、拡張回数 $N$ と強度 $M$ という 解釈可能な少数のハイパーパラメータ を、対象タスクに直接適用する設計が採用されている。


12. [フレームワーク演習] activate_functions

活性化関数は、各層での線形結合に非線形性を与える役割を担っており、モデルの表現能力および学習の安定性に直接影響する重要な要素である。

Sigmoid 関数は出力を 0〜1 の範囲に収める性質を持つが、入力の絶対値が大きくなると勾配がほぼ 0 となるため、勾配消失が起きやすい。この性質により、深いネットワークでは学習が進みにくくなる問題が確認できる。

tanh 関数は出力が −1〜1 に分布し、平均が 0 に近づく点で Sigmoid より改善されているが、同様に飽和領域では勾配消失が発生する。

一方、ReLU 関数は正の領域で勾配が一定であり、勾配消失が起きにくいため、深層学習において広く用いられている。ただし、入力が負の領域に入ると出力が常に 0 となるため、ユニットが更新されなくなる「Dying ReLU」の問題が起こり得る点には注意が必要である。

これらの結果から、活性化関数は単に非線形性を導入するだけでなく、勾配の流れや学習効率を左右する要因であることが分かる。

実務的には、隠れ層には ReLU 系の関数を用い、出力層ではタスクに応じて Sigmoid や Softmax、恒等関数を使い分けることが一般的である。

Swish 活性化関数について

この演習で新たに扱った活性化関数として Swish がある。

Swish は Google によって提案された活性化関数であり、ReLU の単純さと Sigmoid 系の滑らかさを併せ持つ特徴を持つ。

Swish の定義式は次の通りである。

$$ \mathrm{Swish}(x) = x \cdot \sigma(x) $$

ただし、$\sigma(x)$ は Sigmoid 関数であり、

$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$

で定義される。

この式から分かるように、Swish は入力 $x$ をそのまま通すのではなく、Sigmoid によって 入力に応じた重み付け を行った上で出力する関数である。

入力が大きく正の場合には $\sigma(x) \approx 1$ となり、出力はほぼ $x$ となる。一方、入力が負の場合でも $\sigma(x)$ は 0 にはならないため、ReLU のように完全に出力が遮断されることはない。

Swish の微分は次のように表される。

$$ \frac{d}{dx}\mathrm{Swish}(x) = \sigma(x) + x \cdot \sigma(x)\left(1 - \sigma(x)\right) $$

この式から、Swish は 全域で連続かつ滑らかな勾配 を持つことが分かる。 ReLU のような不連続点を持たず、負の領域でも勾配が完全に 0 にならないため、Dying ReLU の問題を緩和できるとされている。

また、Swish は単調増加関数ではなく、負の領域でわずかに出力が下がる非単調性を持つ。この性質により、ReLU よりも表現力が高くなる場合があり、深いネットワークにおいて性能向上が報告されている。

以上より、Swish は

  • ReLU の学習安定性
  • Sigmoid 系の滑らかさ

を併せ持つ活性化関数であり、特に深層モデルにおいて有効な選択肢となり得る。

実装演習

3_7_activation_functions.ipynb を実行した。

新たに出てきた Swish のみ、結果を確認する。

stage_3_3_15.png

図より、Swish は負の入力領域においても出力および勾配が連続的に変化しており、勾配が 0 に張り付かないことが確認できる。一方、正の領域では出力がほぼ線形に増加し、勾配も 1 付近に保たれている。

この挙動から、Swish は ReLU と同様の勾配伝播のしやすさを持ちつつ、負の領域での情報消失を抑える活性化関数であることが分かる。

確認テスト

なし。

参考図書 / 関連記事

活性化関数探索という視点

近年提案されている Swish 活性化関数は、従来のように人手で設計された関数ではなく、自動探索によって発見された活性化関数 である点に特徴がある。

Ramachandran らは、活性化関数の設計自体を探索問題として定式化し、強化学習および全探索を用いて有効な活性化関数を体系的に探索した。

これまでにも ReLU を置き換える活性化関数は多数提案されてきたが、多くの場合、特定のモデルやデータセットにおいてのみ有効であり、一貫した性能向上が得られない という問題があった。論文中でも、

none have managed to replace it due to inconsistent gains

と述べられており、ReLU が長年にわたって標準的な選択肢であり続けた理由が整理されている。

この背景を踏まえ、本研究では「どのような活性化関数が良いか」という人間の仮説に依存せず、関数の構造そのものを探索空間として定義 し、その中から性能の高いものを自動的に選択するという方針が採られている。

探索結果から得られた知見

論文では、探索によって得られた複数の活性化関数を比較し、性能の高い関数群に共通する性質が分析されている。その中で特に重要なのは、複雑な活性化関数ほど性能が高いわけではない という点である。

実際、探索結果からは、構造が過度に複雑な関数は最適化が困難となり、学習性能が低下しやすいことが報告されている。一方で、性能の高い活性化関数の多くは、1〜2 個の単純な演算から構成されており、Swish もその一例である。

Complicated activation functions consistently underperform simpler activation functions

という記述は、活性化関数設計において「表現力の高さ」よりも「最適化のしやすさ」が重要であることを示唆している。

ReLU の前提を再考する視点

さらに本論文では、Swish の成功が ReLU の持つ「勾配が 1 で流れる性質」が必須ではない可能性 を示している点も重要である。

残差接続や Attention 機構の導入によって、深層モデルにおける勾配伝播は構造的に改善されており、個々の活性化関数が厳密に勾配を保存する必要性は相対的に低下していると議論されている。

この点について論文では、

architectural improvements lessen the need for individual components to preserve gradients

と述べられており、活性化関数の役割が、従来の「勾配消失を防ぐための装置」から、「モデル全体の表現力を調整する構成要素」へと変化していることが示唆されている。

この演習との位置づけ

本演習で扱った Swish は、単に ReLU の代替として性能が良い活性化関数であるだけでなく、活性化関数設計そのものが自動化の対象となり得る ことを示した具体例である。

この点は、データ拡張やアーキテクチャ探索と同様に、深層学習における設計判断が経験則から探索・最適化へと移行しつつある流れを反映している。

以上より、Swish は活性化関数の性能向上という観点だけでなく、「人手による設計の限界」と「自動探索の有効性」 を示す事例としても重要であり、今後の深層学習モデル設計の方向性を考える上で示唆に富む手法である。

0 件のコメント:

コメントを投稿

ラビット・チャレンジ - Stage 3. 深層学習 前編 (Day 3)

提出したレポートです。 絶対書きすぎですが、行間を埋めたくなるので仕方ない。 Rabbit Challenge - Stage 3. 深層学習 前編 (Day 3) 1. 再帰型ニューラルネットワークの概念 1.1. RNN 全体像 再帰型ニューラルネットワーク(Re...