RNN(再帰型ニューラルネットワーク)とは?仕組みとKeras実装例

投稿日:2025年11月2日日曜日 最終更新日:

Google Colab Keras RNN

X f B! P L
アイキャッチ画像 RNN(再帰型ニューラルネットワーク)とは?仕組みとKeras実装例

RNN(Recurrent Neural Network、再帰型ニューラルネットワーク)は、「順番や時間の流れに意味があるデータ」を扱うのが得意なニューラルネットワークです。 文章、音声、株価などのように、時系列的な特徴を持つデータに広く利用されています。


RNNの基本アイデア

RNNは「前の出力を次の入力にも渡す」構造を持ち、時間の流れを考慮してデータを処理します。 これにより、文章の文脈や時間的な変化といった連続的な関係性を捉えることができます。

数式で見るRNNの動き(ざっくり)

h_t = tanh(W_hh * h_{t-1} + W_xh * x_t)
y_t = W_hy * h_t

このように、RNNは「前の状態 h_{t-1}」と「現在の入力 x_t」から新しい状態 h_t を計算し、出力 y_t を得ます。 つまり、時系列の「流れ」を内部状態に記憶しているのです。

KerasでRNNを実装してみる

ここでは、Kerasを使ってシンプルなRNNモデルを構築し、波形(sinカーブ)を学習させてみます。 学習が進むと、RNNが波のパターンを理解し、「次の値」を滑らかに予測できるようになります。

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, SimpleRNN, Dense
import matplotlib.pyplot as plt

# 1. sin波をデータにする
x = np.arange(0, 100, 0.1)
y = np.sin(x)

# 2. 入力と出力を作成
time_steps = 20
X, Y = [], []
for i in range(len(y) - time_steps):
    X.append(y[i:i+time_steps])
    Y.append(y[i+time_steps])
X = np.array(X).reshape(-1, time_steps, 1)
Y = np.array(Y)

# 3. モデル構築
model = Sequential([
    Input(shape=(time_steps, 1)),
    SimpleRNN(16, activation='tanh'),
    Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X, Y, epochs=30, batch_size=16, verbose=1)

# 4. 予測と可視化
pred = model.predict(X)
plt.plot(Y, label="True")
plt.plot(pred, label="Predicted", linestyle="dashed")
plt.legend()
plt.show()

実行結果

Epoch 1/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 6s 27ms/step - loss: 1.5942
Epoch 2/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - loss: 0.0402
Epoch 3/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 6ms/step - loss: 0.0069
Epoch 4/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 0.0027
Epoch 5/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 7ms/step - loss: 0.0017
Epoch 6/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.0012
Epoch 7/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 9.9220e-04
Epoch 8/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - loss: 9.1542e-04
Epoch 9/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - loss: 7.8031e-04
Epoch 10/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 13ms/step - loss: 6.9832e-04
Epoch 11/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - loss: 5.7768e-04
Epoch 12/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 11ms/step - loss: 5.4913e-04
Epoch 13/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 10ms/step - loss: 4.5958e-04
Epoch 14/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 10ms/step - loss: 4.5213e-04
Epoch 15/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 6ms/step - loss: 3.8581e-04
Epoch 16/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 3.3423e-04
Epoch 17/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 3.0164e-04
Epoch 18/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 2.7173e-04
Epoch 19/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 2.3570e-04
Epoch 20/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 6ms/step - loss: 2.2146e-04
Epoch 21/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 2.0485e-04
Epoch 22/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 6ms/step - loss: 2.0207e-04
Epoch 23/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 1.6703e-04
Epoch 24/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 1.4592e-04
Epoch 25/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 6ms/step - loss: 1.3884e-04
Epoch 26/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 1.2777e-04
Epoch 27/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 5ms/step - loss: 1.1802e-04
Epoch 28/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 0s 7ms/step - loss: 1.1393e-04
Epoch 29/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 16ms/step - loss: 1.1006e-04
Epoch 30/30
62/62 ━━━━━━━━━━━━━━━━━━━━ 1s 12ms/step - loss: 9.2646e-05
31/31 ━━━━━━━━━━━━━━━━━━━━ 3s 58ms/step


RNN実行結果

このコードでは、20ステップの過去データを入力し、RNNで次の1ステップの値を予測しています。 実際には、株価、温度、センサー値などの連続データを入力に置き換えることで応用が可能です。

RNNが得意な分野

  • 📜 文章の次の単語を予測(自然言語処理)
  • 🔊 音声認識(波形を文字列に変換)
  • 📉 時系列予測(株価、気温、センサー値など)

RNNの課題と改良

RNNは「長い時系列」に弱く、勾配消失問題が起きやすいという課題があります。 この問題を解決するために開発されたのが、LSTM(長・短期記憶)GRU(ゲート付きユニット)です。 これらは「重要な情報を長期間保持する」仕組みを持ち、長期依存関係をよりうまく扱えます。

まとめ

  • RNNは「時間や順序に意味のあるデータ」を扱うネットワーク。
  • 過去の情報を内部状態に保持して、次の出力に反映する。
  • 長期依存の課題はLSTMやGRUで改善できる。

次回は、LSTM(長・短期記憶)とは? の記事で、RNNの発展モデルを詳しく紹介します。