RNN(再帰型ニューラルネットワーク)は、文章、音声、時系列データのような系列を扱うために作られたニューラルネットワークです。各ステップで現在の入力と前のステップの隠れ状態を組み合わせるため、出力はそれ以前の情報に依存できます。

これが重要な考え方です。RNNは途中経過を保持する記憶を持っています。LSTMはゲート付きのRNNで、重要な情報を多くのステップにわたって保つ必要があるときに、その記憶をより慎重に管理します。

RNNが各時刻ステップで行うこと

時刻ステップ tt では、単純なRNNは次のような規則で隠れ状態を更新します。

ht=tanh(Wxxt+Whht1+b).h_t = \tanh(W_x x_t + W_h h_{t-1} + b).

ここで xtx_t は現在の入力、ht1h_{t-1} は前の隠れ状態、hth_t は新しい隠れ状態です。行列 WxW_xWhW_h、そしてバイアス bb は学習時に求められます。

モデルが各ステップで出力も生成する場合、よく使われる形は次です。

yt=Wyht+c.y_t = W_y h_t + c.

出力の正確な規則はタスクによって異なります。各ステップごとに1つの出力が必要な問題もあれば、最後の隠れ状態だけを使う問題もあります。

なぜ隠れ状態が重要なのか

フィードフォワードネットワークは1つの入力を見て処理を終えます。RNNは前の計算結果の一部を再利用します。この再利用こそが、文章、音声、時系列、その他の順序を持つデータに対してRNNを有用にしています。

隠れ状態は、モデルが各ステップの後に自分自身へ書き残す短いメモのようなものだと考えられます。次のステップではそのメモを読み、更新し、修正版をさらに先へ渡します。

同じ入力でも順序を変えると、隠れ状態もたいてい変わります。つまり、系列では順序が重要です。

RNNの具体例

実際のRNNでは、通常はベクトルや非線形活性化関数を使います。計算を見やすくするために、ここでは1つの数だけを持つ簡単な状態を使います。

ht=0.5ht1+xt,h0=0.h_t = 0.5 h_{t-1} + x_t, \quad h_0 = 0.

では、系列 x1=2x_1 = 2, x2=1x_2 = -1, x3=3x_3 = 3 を処理してみます。

最初のステップ:

h1=0.5(0)+2=2.h_1 = 0.5(0) + 2 = 2.

2番目のステップ:

h2=0.5(2)+(1)=0.h_2 = 0.5(2) + (-1) = 0.

3番目のステップ:

h3=0.5(0)+3=3.h_3 = 0.5(0) + 3 = 3.

ここで大事なのは、式そのものではありません。前の状態に依存していることです。ステップ2の更新では x2x_2 だけでなく、ステップ1から運ばれてきた情報も使っています。これがRNNの中核となる考え方です。

順序を入れ替えて x1=1x_1 = -1, x2=2x_2 = 2, x3=3x_3 = 3 とすると、次のようになります。

h1=1,h2=0.5(1)+2=1.5,h3=0.5(1.5)+3=3.75.h_1 = -1, \quad h_2 = 0.5(-1) + 2 = 1.5, \quad h_3 = 0.5(1.5) + 3 = 3.75.

同じ数が現れていても、最終状態は変わります。まさにこの点が、RNNが入力の集合をそのまま扱うモデルではなく、系列モデルである理由です。

なぜ基本的なRNNは長い系列が苦手なのか

基本的なRNNでは、古い情報は何度も繰り返される更新を通して生き残らなければなりません。系列が長いと、それは難しくなります。有用な信号は薄れてしまうことがあり、学習中の勾配も多くのステップをまたぐうちに小さくなりすぎたり大きくなりすぎたりします。

そのため、系列のかなり前の情報に依存するタスクでは、単純なRNNはうまくいかないことがよくあります。再帰という考え方自体が間違っているわけではありません。単純な隠れ状態の更新だけで長距離の記憶を保つのが難しいのです。

LSTMはRNNの記憶をどう改善するか

LSTMは long short-term memory の略で、ゲート付きRNNの一種です。より構造化された記憶の通り道を導入し、通常はセル状態と呼ばれます。さらに、どの情報を忘れ、どの新しい情報を書き込み、どの部分を出力として表に出すかを制御するゲートを持ちます。

要点を理解するのに、ゲートの完全な式を知る必要はありません。この設計によって、モデルは記憶をより細かく制御できます。ある情報を多くのステップにわたって保つべきなら、LSTMは通常のRNNよりもそれを維持しやすい構造になっています。

もちろん、LSTMがすべてを永久に覚えているという意味ではありません。情報を保持すべきときと捨てるべきときを学習しやすいアーキテクチャだという意味です。

RNNとLSTMの違いをやさしく言うと

基本的なRNNは1つの状態を持ち、それを繰り返し更新します。LSTMはその考え方の周りに、より強力な記憶の仕組みを加えたものです。

系列が短く、依存関係も近い範囲にあるなら、単純なRNNで十分なことがあります。タスクがかなり前の情報に依存するなら、LSTMのほうが安全な選択になることが多いです。

RNNとLSTMでよくある誤解

RNNは系列全体を一度に見ていると思うこと

通常はそうではありません。標準的なイメージは、状態を次へ運びながら1ステップずつ処理する形です。

LSTMなら記憶の問題を完全に解決すると考えること

長距離依存には役立ちますが、それでも有限の容量と実用上の限界を持つ学習モデルです。

系列の順序を無視すること

RNNは順序付きデータのために作られています。系列要素を並べ替えると計算結果も変わります。

隠れ状態を人が読める記憶だと考えること

隠れ状態は学習された数値表現であり、文章のようにきれいに読める要約ではありません。

RNNとLSTMはいつ使われるのか

これらは、言語モデリング、音声、手書き文字、センサーストリーム、時系列予測などの系列問題で使われます。現在では多くの言語タスクで代わりにTransformerが使われていますが、RNNやLSTMは系列の記憶をわかりやすく学べるため今でも重要であり、小規模または特化した場面では依然として有用です。

自分でも試してみよう

自分で4ステップの系列を作り、規則 ht=0.5ht1+xth_t = 0.5 h_{t-1} + x_t を適用してみてください。その後、2つの入力の順序を入れ替えて最終状態を比べます。この小さな実験をすると、再帰の役割が略語だけを見るよりずっとはっきりわかります。

別の例も見たいなら、このページをTransformerやマルコフ連鎖の解説と比べて、それぞれのモデルが過去の情報をどう扱うかに注目してみてください。

問題の解き方でお困りですか?

問題をアップロードすると、検証済みのステップバイステップ解答が数秒で届きます。

GPAI Solver を開く →