単純リカレントと誤差逆伝播とは

このページは、単純リカレントと誤差逆伝播 を、初学者向けに短く整理するノートです。時系列の背景は リカレントと系列モデル史 を参照してください。「系列」「時間」がいまいち掴めない読者 は、数式より先に下の「系列とは」「まず『時間』とは何を指すか」を読むとよいです。

1980〜1990 年代、Elman ネット や Jordan ネット が、ひとつ前のステップの結果 を次に渡す 単純なリカレント として系列をモデル化しました。BPTT(時間方向への誤差逆伝播) により、長さの違う系列も学習できるようになった一方、ステップが非常に多いと 勾配消失 が課題として知られるようになりました。

なぜ「単純リカレント」と呼ぶか(名前の由来)

日本語の 単純リカレント は、英語の simple recurrent (network) や vanilla RNN に対応する呼び方です。「単純」と「リカレント」は別の理由で付いています。

語 英語 意味(この文脈)
リカレント recurrent 繰り返し・戻る。ひとつ前のステップの 隠れ状態や出力 を、次のステップの計算に ループで戻す 配線があるから。
単純 simple 式や構造が 最小限 だから。数学が初級だからではなく、後の LSTM・GRU のようなゲート付き RNN と比べて 素朴な形 という対比。

典型的な更新は、だいたい次の1本だけです。

[ h_t = f(W h_{t-1} + U x_t + b) ]

  • 隠れ状態は1種類((h_t) のみ)
  • ゲート(いつ記憶・忘却するかを別経路で制御する仕組み)がない

Elman ネット や Jordan ネット は、隠れ状態や出力を どこに戻すか の配線の違いですが、中身の考え方は同じ 単純 RNN 族 です(下の「ざっくりいうと」も参照)。

日常会話で「RNN」だけと言うと、文脈によって LSTM なども含むことがあります。このリポジトリの 単純リカレント は、あえて 上の式のような基本形 を指す用語、と覚えると整理しやすいです。

系列(sequence)とは

系列とは、順番の付いたデータの並び のことです。英語では sequence。機械学習では、だいたい次の2点をセットで覚えるとよいです。

  1. 要素が複数ある(1 個だけなら「系列」と呼ぶ必要はほぼない)
  2. 並べ替えると意味やタスクの答えが変わる(順番が情報になる)

系列のたとえ

系列の例 1 要素(1 ステップ) 順番を変えると
文「私・は・猫」 単語 1 個 文の意味が変わる
1 週間の気温 1 日分の値 時系列の文脈が壊れる
短い音声クリップ ごく短い時間の波形 聞こえ方・認識結果が変わる

「りんご・みかん・バナナ」と「バナナ・みかん・りんご」を 同じ果物の集合 として扱う問題(順不同)なら、系列というより 集合・多セット に近いです。RNN が向くのは、主に 左から右へ読む順が効く タイプのデータです。

系列と「時系列」の関係

時系列(time series)は、系列のうち 順番がカレンダーや時計の時間に対応している 特別な例です。株価の日次データ、気温の毎時データなど。
RNN の文献では「時間」と書かれることが多いですが、必ずしも秒・分を学ぶわけではなく、「時系列=時間順に並んだ系列」と、「文=左から読む順に並んだ系列」を、同じ ステップ付きの並び として扱える、と理解するとつながります。

系列ではない(または系列扱いしない)例

  • 家賃の表(1 行=物件):行を入れ替えても同じ学習問題のことが多い → 典型は 特徴量設計(表) の N×d 行列
  • 画像 1 枚:画素は 2 次元に並ぶが、RNN より 畳み込み で近傍を扱うことが多い → 畳み込みと画像認識

長さがバラバラでもよい

系列データでは、サンプルごとに 要素の個数(系列の長さ)が違ってよい ことが多いです。

  • 文 A は 5 語、文 B は 12 語
  • 音声 A は 2 秒、音声 B は 8 秒

単純 RNN や BPTT が評価された理由のひとつは、長さの違う並び を、同じ枠組みで学習できるからです(短い系列はパディングなどで揃える実装もあります)。

系列と「時間(ステップ)」の関係

  • 系列 … 扱う データ全体(たとえば文全体、音声全体)
  • ステップ / 時刻 (t) … その中の 何番目の要素か

次の節「まず『時間』とは何を指すか」は、系列を 1 要素ずつ処理するときの番号 の話です。系列を理解したうえで読むと、(h_t) や BPTT のイメージがつかみやすくなります。

まず「時間」とは何を指すか

ここでいう 時間 は、物理学の「秒・分」だけを指すわけではありません。もっと素直に言うと、

並べた順番の何番目か(1 番目、2 番目、3 番目……)

を表す 番号 のことです。論文やコードでは慣習で 時刻 (t) と書かれるので紛らわしいですが、「読み進める順のインデックス」 と置き換えて読んでください。

日常のたとえ

データ 「時間」=何の順番か 1 ステップ=何か
英文 左から右へ読む順 単語 1 個
音声 波形を短く切った並び フレーム(ごく短い区間)1 個
株価 日付の古い→新しい 1 日分の値
動画 フレームの並び 画像 1 枚

「きのうの株価を見て、きょうを当てる」のように、過去の並びが未来に効く とき、RNN は「今まで読んだ分を小さなメモにまとめ、次の入力と一緒に使う」設計です。壁時計の時刻そのものを学ぶ必要はありません。

記号 (t) と (h_t) の読み方

  • (t) … 今、何番目のステップか((t=1) が最初、(t=2) が次……)。
  • (x_t) … その番号に対応する 入力(たとえば 3 番目の単語のベクトル)。
  • (h_t) … 1 番目から (t) 番目まで読んだあとでの 内部メモ(隠れ状態)。
  • (h_{t-1}) … ひとつ前のステップのあと に残っていたメモ。

だから「(h_t) は (h_{t-1}) に依存する」は、

いまのメモ = さっきまでのメモ + いま入ってきた新しい入力 を混ぜた結果

という意味に近いです。未来の (h_{t+1}) は、まだ読んでいないので使えません(左から順に読む前提)。

表形式データとの違い

家賃予測の表(1 行=物件 1 件)では、行同士に 順番の意味 がないことが多いです。一方、系列では 行の順を入れ替えると意味が変わる(「犬が走った」と「走った犬が」)ので、順番付きのリスト として扱います。RNN はそのリストを 先頭から 1 要素ずつ 処理するネットワーク、と考えるとよいです。

ざっくりいうと

  • 単純 RNN:各ステップで 内部メモ (h_t) を更新し、次のステップへ渡す、もっとも基本的なつながり。
  • Elman / Jordan:メモを どこに・どう戻すか の配線の違いを示す代表例(中身の考え方は同系統)。
  • BPTT:系列を「ステップごとに並べた長いネット」に見立て、通常の 逆伝播 で学習する手続き(「時間方向」=ステップの並び方向)。
  • 勾配消失:ステップが離れすぎると、学習信号(勾配)が弱くなり、遠い過去 の影響が届きにくくなる現象。

単純リカレントと誤差逆伝播は同じものか

同一ではありません。 セットで使う 構造 と 学習手続き の関係です。

単純リカレント 誤差逆伝播(系列なら BPTT)
何か ネットの形((h_t) をループで更新) 重み (W, U, b) を直す方法
比喩 エンジンの設計 そのエンジンを調整する手順

推論では単純リカレントの順伝播だけ動きます。学習では、順伝播のあと誤差逆伝播で重みを更新します。直すのは主に (h_t) そのものではなく (W, U, b) です((h_t) は計算の途中値で、別の文では作り直す)。用語の詳細は次の節。

順伝播と逆伝播(基本用語)

深層学習全般の入口は 深層学習モデルとは の同節も参照してください。ここでは 系列・RNN 向けに整理します。

対比(一覧)

順伝播 逆伝播
英語 forward propagation backward propagation(損失付きなら backpropagation=誤差逆伝播)
向き 入力 → 出力(ステップなら (t=1 \to T)) 出力側 → 入力側(RNN では (t=T \to 1) も)
何を計算するか (h_t)、予測、損失 (L) 各重みへの 勾配 (\partial L / \partial W) など
推論 使う 使わない(重みは更新しない)
学習 使う 使う(重みを更新する)

順伝播(フォワード)とは

順伝播は、入力から層・ステップを 順に 進め、中間結果と最終的な 予測 を計算する処理です。

単純 RNN の例では、次がすべて順伝播です。

  1. トークン ID → 埋め込み (x_t)
  2. (h_t = f(W h_{t-1} + U x_t + b)) でメモを更新
  3. 必要なステップで出力層から予測(次トークン・ラベルなど)
  4. 設計した位置で 損失 (L) を計算(予測と正解の比較)

推論だけ(チャット応答・分類の実行)では、だいたい ここまで で終わります。

逆伝播(バックワード)とは

逆伝播は、求めた 損失 (L) から出発し、連鎖律 で各パラメータへの 勾配 を求める処理です。計算グラフを 逆方向 にたどります。

  • 流れるもの … 勾配(「各重みをどちらに動かすと (L) が減りやすいか」)
  • 流れないもの … 各 (h_t) を正解ベクトルと 比べ直す 調査(誤解しやすい点)

重みの更新(イメージ):

[ W \leftarrow W - \eta \frac{\partial L}{\partial W} ]

(\eta) は 学習率(1 回の更新の歩幅)。(U, b) なども同様です。

系列の RNN では、同じ逆伝播を ステップ方向にも 行う呼び名が BPTT(BPTT の定着と勾配消失)です。

勾配(逆伝播で求めるもの)

勾配は、損失 (L) が各重み (w) をわずかに変えたときの変化率 (\partial L / \partial w) のまとまりです。逆伝播の出力 であり、順伝播の入力 ではありません。遠いステップで弱くなる現象が 勾配消失 です。

学習 1 ステップの流れ(まとめ)

順伝播: x₁…x_T → h₁…h_T → 予測 → 損失 L
逆伝播: L → ∂L/∂W, ∂L/∂U, … → 重みを少し更新

損失を付ける位置 はタスク設計で決まる(次節「損失を付ける位置」)。逆伝播は、その (L) から一度勾配を求める手続きです。

誤差逆伝播とは(読み方・意味)

読み方 … ごさ・ぎゃく・でんぱ(略して ぎゃく・でんぱ も多い)。英語由来では バックプロパゲーション(略 バックプロップ)。

意味 … 上の 逆伝播 のうち、損失(誤差)を明示的に使う 学習向けの呼び方。中身は 順伝播と逆伝播(基本用語) の逆伝播と同じ系統です。系列の RNN では 時間方向にも 行う版を BPTT(Backpropagation Through Time)と呼ぶ(BPTT の定着と勾配消失)。

よくある誤解

誤解 実際
各ステップの (h_t) を 回答ベクトル と直接比べる 比べるのは 出力層を通した予測 と、その位置の 正解((h_t) は中間メモ)
最後から 1 ステップ目まで 順に誤差を計算し直す 損失を付けた位置 で一度(または数箇所で)誤差を計算済み。逆方向 に流すのは 勾配(重み更新用)
「どこで外れたか」を人間がステップごとに探す デバッグ手法 ではなく、数学的に勾配を一括計算する

損失を付ける位置(「どこか」とは)

「どこか」= タスク設計で「ここで予測を出し、ここで正解と比べる」と決めたタイムステップ です。学習中に後ろから探して決めるわけではありません。

順番:順伝播 → 損失 → 逆伝播

順伝播と逆伝播(基本用語) の流れを、系列向けに短く書くと次のとおりです。

  1. 順伝播 … ステップ 1 → 2 → … → T を 前から 計算する
  2. 損失 … 設計した位置で 予測と正解 を比べ、損失を 1 個(または複数個→まとめることも多い)出す(順伝播の最後の一段)
  3. 逆伝播(BPTT) … その損失から 計算グラフを逆にたどり、(W, U, b) 用の勾配を求める

例

タスク 「どこか」=損失を付ける位置 正解の出どころ
系列分類(文全体のラベル) 最後の (h_T) のあと、出力層 文ラベル 1 個
次トークン予測 各ステップの (h_t) のあと(多くは全ステップ) 同じ文章の次のトークン
seq2seq デコーダ各ステップの出力 出力文の各トークン

複数ステップで損失が出ても、実装では loss_1 + loss_2 + … のように 1 つにまとめてから 逆伝播することが多いです。

誤差逆伝播はプロンプトと回答ペア専用か

いいえ。 必要なのは 損失を定義できること だけです。プロンプトと回答が別ファイルでペア になっている必要はありません。

  • 記事・生テキスト … 次トークン予測(正解は文中の次の語)でも誤差逆伝播で学習する。これは 自己教師あり と呼ばれることが多い(教師信号はデータ自身から取る)。
  • 指示 + 返答ペア … 指示チューニング など 後段 の典型。ここでも誤差逆伝播は使う。

データ型の表は 埋め込み・隠れ状態・学習と出力 の「学習データは『プロンプトと回答』だけか」を参照してください。

単純リカレントと誤差逆伝播で何をしているか

たとえば短い音声を「フレーム 1 → フレーム 2 → …」と 順に 渡し、今どの音素に近いか当てる問題を考えます。3 番目のフレームを処理するとき、ネットワークは 1〜2 番目までの情報を (h_2) にまとめて持っている、というイメージです。

  1. 系列を ステップ 1, 2, 3, … に分け、各ステップの入力ベクトル (x_t) を用意する。
  2. 各ステップで (h_t = f(W h_{t-1} + U x_t + b)) のように メモを更新 する((h_0) は初期値)。
  3. 必要なステップの (h_t) から、音素ラベルや次の音など 出力 を計算する。
  4. 正解との誤差から BPTT で重み (W, U, b) を更新する(後ろのステップの誤差が、前のステップまで伝わる)。
  5. ステップ数が非常に多いときは Truncated BPTT(途中までしか遡らない)や勾配クリッピングを検討する。

ステップの流れ(3 単語の例)

文「私・は・猫」だけを極端に短くすると、次のようになります。

ステップ (t) 入力 (x_t) 使うメモ 更新後のメモ
1 「私」 (初期値) (h_1)
2 「は」 (h_1) (h_2)
3 「猫」 (h_2) (h_3)

「猫」のあとに来る語を当てるなら、(h_3) には「私・は・猫」まで読んだあとの情報が入っている、と理解できます。

強みと限界(短く)

強み

  • 長さの違う系列を、順番を壊さず エンドツーエンドで学習できる道を開いた。
  • 後の LSTM・seq2seq の 思想的・実装の土台 になった。

限界

  • ステップが離れすぎる依存(文の最初と最後など)では 勾配消失 が起きやすい。
  • ステップを 1 つずつ 進めるため、大規模並列化は Transformer より難しめ。

関連