リカレントニューラルネットワークとは、時系列データやシーケンシャルデータに特化したモデルであり、時系列を考慮した解析を可能とするモデルです。リカレントニューラルネットワークの代表的なモデルであるLSTMなどはご存じの方も多いのではないでしょうか。今回はそんなリカレントニューラルネットワークの中でも最も基本的なモデルである単純リカレントニューラルネットワークについて解説しました。

リカレントニューラルネットワーク(RNN)とは

リカレントニューラルネットワークは時系列を考慮した機械学習モデルです。具体的には、判断材料として前の状態を考慮して判断を行う設計になっています。その構造によって、前の時系列の判断が重要となるタスクに強いモデルとなっています。

例えば、上記の画像のような翻訳タスクなどは過去の入力を考慮した翻訳が必要となるため、RNNなどが適しているとされていました。また株価予測や音声データ解析も時系列データであるためRNNが得意とするタスクです。

リカレントニューラルネットワーク(RNN)の構造

今回はリカレントニューラルネットワークの中でも最も基本的である単純リカレントニューラルネットワークについて解説していきます。下記の図がRNNの概要図になります。

リカレントニューラルネットワークは時系列ごとに入力(\(x_{t-1}\))と前時刻の情報(\(h_{t-1}\))を受け取り、出力(\(y_t\))と次の層へ伝える情報(\(h_t\))を生成します。前時刻の情報(\(h_{t-1}\))を伝える性質によって、過去の結果を考慮した解析が可能になるわけです。

もう少し細部を見てみましょう。

下記の図は入力(\( x_{t}\))と前時刻の情報(\( h_{t}\))をどのように処理して次の層へ伝える情報(\( h_{t+1}\))を生成するかを具体的に表したものです。式にすると\( h_{t+1} = tanh(W_h h_t + W_x x_{t} + b)\)となります。

このようにして過去の情報を考慮した処理を実現しています。

単純リカレントニューラルネットワークの実装

単純リカレントニューラルネットワークの実装方法について解説していきます。

単純リカレントニューラルネットワークに必要な機能は大きく2つ分けられます。

  • 重みやバイアスの定義
  • ステップごとに中間層と出力の計算

SimpleRNNは単純な構造であるため、たったこれだけで実装できます。この方針に基づいてクラスを定義すると以下のようになります。

class SimpleRNN:

    def __init__(self, units, input_dim, output_dim, activation='tanh'):
        self.units = units
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.activation = tf.keras.activations.get(activation)

        # 重みとバイアスの初期化
        self.Wx = tf.Variable(tf.random.normal((input_dim, units), stddev=0.1), trainable=True)
        self.Wh = tf.Variable(tf.random.normal((units, units), stddev=0.1), trainable=True)
        self.bh = tf.Variable(tf.zeros((units,)), trainable=True)

        self.Wy = tf.Variable(tf.random.normal((units, output_dim), stddev=0.1), trainable=True)
        self.by = tf.Variable(tf.zeros((output_dim,)), trainable=True)

    def call(self, inputs):
        batch_size = tf.shape(inputs)[0]
        h = tf.zeros((batch_size, self.units))  # 初期の隠れ状態

        # 時間ステップごとに計算
        for t in range(inputs.shape[1]):  # time_steps
            x_t = inputs[:, t, :]  # 現在の時間ステップの入力
            h = self.activation(tf.matmul(x_t, self.Wx) + tf.matmul(h, self.Wh) + self.bh)

        # 出力層
        output = tf.matmul(h, self.Wy) + self.by
        return output

次に実際にこのモデルを学習させて性能をテストしてみましょう。

下記は先ほど作成した単純リカレントニューラルネットワークに2015~2023年までの各月の平均気温の変動を学習させて、入力データとして2024年の1~6月までの平均気温を与え、7~12月までの平均気温を予想するタスクを与えたものです。結果は以下のようになりました。

 

8月以降急激に気温が下がるという傾向を学習できていることが分かると思います。

まとめ

今回は時系列データに強みを持つRNNについて基本的な構造から実装まで解説しました。特に今回紹介した単純RNNはLSTMなど現在使用されているモデルの原点となっているモデルなのでぜひ覚えていてください。

\ シェア /

E資格スピードパッケージ2023#2修了者合格率100%達成

zero to one E資格 jdla

zero to oneの「E資格」向け認定プログラム

日本ディープラーニング協会の実施するE資格の受験ならzero to oneの「E資格」向け認定プログラム (税込165,000円) をおすすめします。当講座は、東京大学大学院工学系研究科の松尾豊教授と東北大学大学院情報科学研究科の岡谷貴之教授が監修する実践的なプログラムとなっています。
厚生労働省の教育訓練給付制度対象のE資格認定プログラムの中では最安値※となり、実質負担額49,500円~(支給割合70%の場合)で受講可能です。※2023年弊社調べ zero to one E資格 jdla

人工知能基礎講座を提供中

人工知能の第一人者である東京大学の松尾豊教授が監修した人工知能基礎講座を受講してみませんか? 人工知能の歴史から自然言語処理、機械学習、深層学習といった最先端のトピックやAIに関わる法律問題まで網羅しているので全てのビジネスパーソン・AIの初学者におすすめです。

サンプル動画

人工知能基礎講座はこちら↓ zero to one G検定 人工知能基礎 jdla

AI初学者・ビジネスパーソン向けのG検定対策講座

G検定受験前にトレーニングしたい方向けの問題集「G検定実践トレーニング」も提供中です。 zero to one E資格 jdla