Python

RNN(リカレントニューラルネットワーク)の概要とPython実装方法を分かりやすく解説!

RNNとは
記事内に商品プロモーションを含む場合があります
ウマたん
ウマたん
当サイト【スタビジ】の本記事では、ディープラーニングを時系列にも対応させたRNN(リカレントニューラルネットワーク)について解説していきます。RNNの仕組みや応用場面と一緒にPythonでの実装をしていきます。これからの応用が期待される領域なんですよー!

こんにちは!データサイエンティストのウマたん(@statistics1012)です!

自然なコミュニケーションができるようになることは、真の人工知能を実現するために非常に重要。

ディープラーニングの日進月歩の進化により、数年前と比較して飛躍的に言語処理能力が上がっています。

ロボたん
ロボたん
一昔前まで使い物にならなかったGoogle翻訳もだいぶ精度よくなってきてるもんなー!
ウマたん
ウマたん
その裏にはディープラーニング領域の発展が隠されているんだよー!

そんな自然言語処理の世界で現在使われている最先端技術の基となっているのがRNN(Recurrent neural network)。

この記事では、そんなRNNについて徹底的に見ていきます!

RNNとは

まずはRNNについて簡単に見ていきましょう!

以下のYoutube動画でも詳しく解説していますよ!

RNNとはディープラーニングの一種で、Recurrent neural networkの頭文字を取った手法です。

日本語では回帰的ニューラルネットワークとか再帰的ニューラルネットワークと呼ばれます。

まずは、RNNの概要、そして仕組みについて見ていきましょう!

RNNの概要

通常のディープラーニングでは、時系列要素のあるデータを上手く扱えないという欠点があります。

通常のディープラーニングでは時系列要素はなくシンプルにいくつかの同列要素のインプットに対して重みパラメータを変化させて出力を調整します。

よくある図ですが、イメージはこんな感じ。

3層構造のニューラルネットワーク

通常のディープラーニングの説明は割愛しますので、知りたい方は以下の記事を見てみてください!

【入門】ディープラーニング(深層学習)の仕組みとPython実装のやり方!当サイト【スタビジ】の本記事では、ディープラーニングの仕組みやPythonでの実装方法について解説していきます。ディープラーニングってなんとなくブラックボックスなイメージがあるかもしれませんが、実はシンプルなアルゴリズムなんですよー!...

そんなディープラーニングの構造に対して、時系列要素を加えて順番を考慮しようよというのがRNNの考え方。

時系列処理はテキストの文脈を読み取る上で非常に重要です。

例えば英語で、he said “I’m () ” という文章があった時、()の中身を当てるのは相当難しい。

ロボたん
ロボたん
I’m the king of the world!!じゃない??
ウマたん
ウマたん
おっとぉ!それはタイタニックの有名なシーン、ディカプリオが叫ぶセンテンスだね!

ロボたんの戯言は置いておいて、正直可能性は無限大にあって分かりません。

しかし、その後ろにこんな文脈があったらどうでしょう?

Tom came home, and he said “I’m () “.

()の中にどのような文章が入るかほとんどの人が分かると思います。

おそらくTom came home, and he said “I’m home “でしょう。

このようにテキストの文脈からワードを推論するのは周りの文脈が非常に重要なんです。

それを実現できるのがRNNと考えてください。

詳しく知りたい場合、「RNN」の論文を読んでみるとよいでしょう!

Time underlies many interesting human behavior. Thus, the question of how to represent time in connectoinist models is very important. In this approach, hidden unit patterns are fed back to themselves; the internal representations which deveolp thus reflect task demands in the context of prior internal states.

引用:Google-“Finding Structure in Time”

RNNの仕組み

RNNの概念が分かったところでRNNの仕組みについて見ていきましょう!

文脈を読み取るモデルが作りたい!しかし通常のディープラーニングでは難しそうです。

ロボたん
ロボたん
通常のディープラーニングではなぜ難しいの?
ウマたん
ウマたん
実は、現状のモデルでもある程度推論はできるんだけど時系列要素を持たせることができないんだ

例えば、ディープラーニングによってワードの分散表現を獲得する手法であるword2vecと呼ばれる手法があります。

RNNよりもだいぶ後に提案された手法で分散表現(ベクトル化)に特化しています。

簡単にどんな手法か見ていきましょう!

word2vecでは前後関係からのみワードを推論します。

つまりTom () home, and he said “I’m home”とあった場合、Tomとhomeの間に入るワードがcameであるという教師データを与えて学習するというもの。

大量のセンテンスを学習させることでモデルの精度を上げていきます。

この時、ワードをベクトル変換するためword2vecと呼ばれています。

こんなイメージ

word2vec

1つのワードから前後を予測するタイプもあり、それぞれCBOWモデルとskip-gramと呼ばれます。

さてさて、しかしこのword2vecでは単語をベクトル化することに特化しているため文意全体を読み解くのは非常に難しいです。

そこで登場するのがRNNの考え方。

今までのディープラーニングでは、それぞれのインプットがそれぞれの中間層に与えられていましたが、RNNでは同一の中間層を用いて再帰的にインプットが行われます。

再帰的という部分がReccurentと言われるゆえんです。

こんなイメージ

rnnの概念

同じレイヤーh1を用いているのがミソです。

これにより前のワードの情報をレイヤに記憶させ後続へとつなぐことができます。

RNNの改善手法と応用場面

メモ

RNNは同じレイヤに情報を再帰させることで時系列要素をレイヤに記憶させることに成功していました。

しかしRNNも万能ではありません。

ここでは、RNNの欠点と改善手法・応用ケースについて見ていきましょう!

RNNの欠点と改善手法

そんなRNNですが、実はいくつかの欠点があるんです。

それは時系列要素を繋いでいくことで勾配が爆発もしくは消失してしまうこと。

ディープラーニングでは重みパラメータを勾配法で計算するため勾配の値が非常に重要です。

通常のディープラーニングでも初期値を正しく与えないと勾配消失や勾配爆発が起きますが、RNNでも起きやすい。

そこを改善しなくてはいけません。

ロボたん
ロボたん
勾配消失??勾配爆発??
ウマたん
ウマたん
細かい説明は省くけど、それによって学習が上手くできなくなってしまうんだ!

勾配爆発に関しては、勾配クリッピングという方法が一般的です。

勾配クリッピングでは、勾配がある閾値を超えた場合勾配をルールに従って修正する方法。

そして勾配消失に関しては、LSTMと呼ばれる手法が一般的に用いられます。

LSTMはLong short term memoryの略で、長い記憶も短い記憶も継続させます。

シンプルに言うとLSTMでは通常の勾配とは別に記憶用の記憶セルを作り伝播させていきます。

以下の記事で詳しく解説しています!

LSTM
RNNの派生型LSTMについて分かりやすく解説!時系列データをPythonで分析していこう!当サイト【スタビジ】の本記事では、時系列・自然言語処理領域において利用されてきたRNNの派生型モデル「LSTM」について解説していきたいと思います!最終的には時系列シミュレーションデータを発生させてPythonでモデル構築していきます。...
AIモデルを用いた需要予測 事例とPython実装例を解説!
AIモデルによる需要予測の事例と手法を紹介!Pythonで実装してみよう!当サイト【スタビジ】の本記事では、AIモデルによって顧客の需要を予測する手法とその事例について紹介します!また、Pythonで簡単な実装も行っていきましょう!...

また、詳しくは以下の書籍を参考にしてみてください。

created by Rinker
オライリー・ジャパン
¥3,960
(2024/04/28 03:08:54時点 Amazon調べ-詳細)

ここでおさえておきたいのは、RNNを改善した最新の手法はあるが基本的な考え方は同じということ。

そして便利なことにPythonを使えば、最新の手法でもフレームワークで実装できるということ。

RNNの応用場面

さて、そんなRNNは現実世界のどのような場面に応用されているのでしょうか?

どのようなことができるのでしょうか?

Google翻訳

RNNの考え方の延長線上に時系列データを別の時系列データに変換する「seq2seq」があります。

それにより、Google翻訳のような日本語の文意を読み取り英語に変換するというアプリケーションが開発されています。

自動応答

流行りのチャットボットや音声AIなども同じくseq2seqをベースにしています。

ある質問に対して自然な回答をすることは完璧なAIを作り出す上で日々研究されている分野です。

画像→テキスト変換

現在の技術では、非常に高い精度で画像データをテキストデータに変換することができます。

neural image caption(引用元:Google-“Show and Tell: A Neural Image Caption Generator“)

これを見るとかなりの高精度で画像データを読み取りテキスト変換することが出来ていることが分かります。

ロボたん
ロボたん
わー!ほんとだ!こんなに高精度なのか!ディープラーニングってすごいなー!
ウマたん
ウマたん
ディープラーニングのポテンシャルは無限大なんだ!

RNNを実際にPythonで実装してみよう

PC

さて、RNNの概況について理解できたところで実際にPythonを使って実装していきましょう!!

使うデータセットはKaggleのホームページが落とせる航空会社の乗客数データ!

1949年から1960年までの月別乗客数がデータとして入っています。

149行2列のシンプルなデータセット。

モデル構築は以下のサイトを参考にしています。

1変数の時系列データを基に過去のデータから未来の値を予測します。

この時、tflearnというライブラリを使ってRNN(正確にはLSTM)を実装していきます。tflearnはkerasと似たようなライブラリでディープラーニングの実装が感覚的に容易にできます。

実際にモデルを構築していきましょう!

最終的な評価はRMSE(Root Mean Square Error)で算出しています。

細かい実装ポイントについて見ていきましょう!

def create_dataset(dataset, steps_of_history, steps_in_future):
    X, Y = [], []
    for i in range(0, len(dataset)-steps_of_history, steps_in_future):
        X.append(dataset[i:i+steps_of_history])
        Y.append(dataset[i + steps_of_history])
    X = np.reshape(np.array(X), [-1, steps_of_history, 1])
    Y = np.reshape(np.array(Y), [-1, 1])
    return X, Y

def split_data(x, y, test_size=0.1):
    pos = round(len(x) * (1 - test_size))
    trainX, trainY = x[:pos], y[:pos]
    testX, testY   = x[pos:], y[pos:]
    return trainX, trainY, testX, testY

ここでは、データセットを時系列モデルに適した形に変形する関数と、学習データ予測データに分ける関数を作っています。

net = tflearn.input_data(shape=[None, steps_of_history, 1])
net = tflearn.lstm(net, n_units=6)
net = tflearn.fully_connected(net, 1, activation='linear')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
        loss='mean_square')

model = tflearn.DNN(net, tensorboard_verbose=0)

model.fit(trainX, trainY, validation_set=0.1, batch_size=1, n_epoch=150)

ここが実際にRNN(LSTM)モデルを構築している部分。

ちなみに初回モデル構築は問題ないですが、再度パラメータを変えて処理を回そうとするとJupyter notebookではエラーをはいてしまうので、7行目に初期化するような記述を入れています。

tensorflow.reset_default_graph() #モデルを初期化

これだけでRNNが実装できちゃうんです!簡単!

この時、RMSEは0.10079201となりました。それなりに良い予測ができてる!

ちなみに層を増やしてみると・・・

net = tflearn.input_data(shape=[None, steps_of_history, 1])
net = tflearn.lstm(net, n_units=6, activation='relu',return_seq=True )
net = tflearn.lstm(net, n_units=6, activation='relu')
net = tflearn.fully_connected(net, 1, activation='linear')
net = tflearn.regression(net, optimizer='adam', learning_rate=0.001,
        loss='mean_square')

RMSEは0.16051404に悪化してしまいました・・・

簡易的なデータセットに複雑なモデルで当ててもあまり意味がなさそう。

ちなみに過学習を防ぐためにDropoutなどのパラメータで調節することも可能です!

ロボたん
ロボたん
こんなに簡単なの!?すごい!
ウマたん
ウマたん
ディープラーニングもだいぶ身近になったよねー!

RNNについて勉強する方法

Check

さて、ここまでRNNについて徹底的に見てきました。

ロボたん
ロボたん
RNNの可能性は非常に感じるけど、どのように勉強していったらいいのー?
ウマたん
ウマたん
良質な情報自体は書籍から学べるよ!だけど本腰入れて勉強するならプログラミングスクールも視野に入れておいた方がよいかも!

正直、書籍ベースで非常に深い部分まで突っ込んで学ぶことが可能です。

先ほども紹介しましたが、RNNまわりを勉強するなら以下の書籍が圧倒的にオススメです!

created by Rinker
オライリー・ジャパン
¥3,960
(2024/04/28 03:08:54時点 Amazon調べ-詳細)

有名どころですが、もしディープラーニングの基本から勉強したいのであれば以下の書籍を読むとよいでしょう!

こちらは画像認識の話がメインです。

ただ、書籍だけでメンターサポートがないとなかなか進めるのが難しいと思うのでその場合はプログラミングスクールを活用するとよいでしょう!

僕の場合はテックアカデミーで書籍も使いながらメンターサポートいただいて学習を進めました!

テックアカデミー本体のカリキュラムは微妙なので期待しない方がいいですが、メンターサポートは充実しているので自分でメンターの人に要望を出しながらガツガツ進められる人にはオススメ!

AIコースを見てみる無料体験を見てみる

以下で僕の体験談を記事にしています。

【体験談】テックアカデミー評判は?3か月本気受講してみたので徹底レビュー!当ブログ【スタビジ】では、様々なプログラミングスクールの中からテックアカデミーのメリット・デメリット・評判について3か月の体験談をもとに赤裸々にレビューしていきます。...

他のプログラミングスクールもあわせてオススメを以下の記事で紹介しています!

データサイエンティスト スクール
【徹底比較】データサイエンティストのための学習ができるスクール9選! スクール名 オススメ度 価格の安さ サポート体制 公式サイト テックアカデミー ...

RNN まとめ

RNNはこれからも進化を続ける分野であり、まさに音声AIの領域は世界のIT企業GAFAが凌ぎを削っている部分。

人間と同等レベルの思考・会話が出来る日も遠くはないでしょう。

それが実現した未来はどんな世界になるのでしょうか。

ロボたん
ロボたん
AIの実現はそう遠くないと言われているけど本当にあるのかなー??
ウマたん
ウマたん
そこは色んな専門家が議論を重ねている領域だから難しいよね・・

当サイトでもシンギュラリティ(AIが人間を超えるタイミング)について言及している記事がありますのでよければ目を通してみてください!

【5分で解説】シンギュラリティ(技術特異点)が来ないと思う理由!当サイト【スタビジ】の本記事では、シンギュラリティについて論じていきたいと思います。シンギュラリティは人工知能が人間の知能を超えるタイミングとされ1説によると2045年に来ると言われています。果たして本当にシンギュラリティは来るのでしょうか来ないのでしょうか?...

ディープラーニングを使って、世界を変えていきましょう!

ディープラーニング、機械学習、データサイエンス、Pythonの勉強法については以下の記事でまとめていますのであわせてチェックしてみてください!

【初心者向け】ディープラーニングの勉強ロードマップまとめ!当サイト【スタビジ】本記事では、ディープラーニングの学習方法について詳しくまとめていきます!ディープラーニングは難しいと思われがちですが、アルゴリズムは意外とシンプルで実装自体も非常に簡単なんです!Pythonでの実装もおこなっていきますよー!...
機械学習独学勉強ロードマップ
【5分で分かる】機械学習の独学勉強ロードマップを徹底的にまとめていく!当サイト【スタビジ】の本記事では、機械学習の独学勉強ロードマップについて徹底的にまとめていきます。機械学習をいきなり理論からしっかり勉強しようとすると挫折しかねません。そこで、この記事ではなるべく挫折しないロードマップをお伝えしてきますよ!...
【5分で分かる】データサイエンティストに必要なスキルと独学勉強ロードマップ!当サイト【スタビジ】の本記事では、データサイエンティストに求められるスキルとそれを身に付けるための勉強法について徹底的にまとめていきます!入門者でも、しっかりデータサイエンティストについて理解しある程度独学で駆け出しの状態までいけることを目指します。...
Python独学勉強法
【Python独学勉強法】Python入門を3ヶ月で習得できる学習ロードマップ当サイト【スタビジ】の本記事では、過去僕自身がPythonを独学を駆使しながら習得した経験をもとにPythonを効率よく勉強する方法を具体的なコード付き実装例と合わせてまとめていきます。Pythonはできることが幅広いので自分のやりたいことを明確にして勉強法を選ぶことが大事です。...
スタビジアカデミーでデータサイエンスをさらに深く学ぼう!

スタアカサービスバナースタビジのコンテンツをさらに深堀りしたコンテンツが動画と一緒に学べるスクールです。

プレミアムプランでは私がマンツーマンで伴走させていただきます!ご受講お待ちしております!

スタビジアカデミーはこちら