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

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

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 では、同じ逆伝播を ステップ方向にも 行う呼び名が BPTTBPTT の定着と勾配消失)です。

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

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

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

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

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

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

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

意味 … 上の 逆伝播 のうち、損失(誤差)を明示的に使う 学習向けの呼び方。中身は 順伝播と逆伝播(基本用語) の逆伝播と同じ系統です。系列の RNN では 時間方向にも 行う版を BPTTBackpropagation 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 より難しめ。

関連