このページは、単純リカレントと誤差逆伝播 を、初学者向けに短く整理するノートです。時系列の背景は リカレントと系列モデル史 を参照してください。「系列」「時間」がいまいち掴めない読者 は、数式より先に下の「系列とは」「まず『時間』とは何を指すか」を読むとよいです。
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 要素(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 の例では、次がすべて順伝播です。
- トークン ID → 埋め込み (x_t)
- (h_t = f(W h_{t-1} + U x_t + b)) でメモを更新
- 必要なステップで出力層から予測(次トークン・ラベルなど)
- 設計した位置で 損失 (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 → 2 → … → T を 前から 計算する
- 損失 … 設計した位置で 予測と正解 を比べ、損失を 1 個(または複数個→まとめることも多い)出す(順伝播の最後の一段)
- 逆伝播(BPTT) … その損失から 計算グラフを逆にたどり、(W, U, b) 用の勾配を求める
例
| タスク | 「どこか」=損失を付ける位置 | 正解の出どころ |
|---|---|---|
| 系列分類(文全体のラベル) | 最後の (h_T) のあと、出力層 | 文ラベル 1 個 |
| 次トークン予測 | 各ステップの (h_t) のあと(多くは全ステップ) | 同じ文章の次のトークン |
| seq2seq | デコーダ各ステップの出力 | 出力文の各トークン |
複数ステップで損失が出ても、実装では loss_1 + loss_2 + … のように 1 つにまとめてから 逆伝播することが多いです。
誤差逆伝播はプロンプトと回答ペア専用か
いいえ。 必要なのは 損失を定義できること だけです。プロンプトと回答が別ファイルでペア になっている必要はありません。
- 記事・生テキスト … 次トークン予測(正解は文中の次の語)でも誤差逆伝播で学習する。これは 自己教師あり と呼ばれることが多い(教師信号はデータ自身から取る)。
- 指示 + 返答ペア … 指示チューニング など 後段 の典型。ここでも誤差逆伝播は使う。
データ型の表は 埋め込み・隠れ状態・学習と出力 の「学習データは『プロンプトと回答』だけか」を参照してください。
単純リカレントと誤差逆伝播で何をしているか
たとえば短い音声を「フレーム 1 → フレーム 2 → …」と 順に 渡し、今どの音素に近いか当てる問題を考えます。3 番目のフレームを処理するとき、ネットワークは 1〜2 番目までの情報を (h_2) にまとめて持っている、というイメージです。
- 系列を ステップ 1, 2, 3, … に分け、各ステップの入力ベクトル (x_t) を用意する。
- 各ステップで (h_t = f(W h_{t-1} + U x_t + b)) のように メモを更新 する((h_0) は初期値)。
- 必要なステップの (h_t) から、音素ラベルや次の音など 出力 を計算する。
- 正解との誤差から BPTT で重み (W, U, b) を更新する(後ろのステップの誤差が、前のステップまで伝わる)。
- ステップ数が非常に多いときは 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 より難しめ。
関連
- 深層学習モデルとは(順伝播と逆伝播・全モデル共通の入口)
- 埋め込み・隠れ状態・学習と出力((x_t) と (h_t)、学習・生成の補足)
- 単純リカレントと誤差逆伝播
- リカレントと系列モデル史
- リカレントと系列モデルとは(系列全体の入口)
- リカレントと系列モデル