【Python】BidirectionalRNNを使って文章を自動生成

[python]BidirectionalRNNを使って文章を自動生成

こんばんはエンジニアの眠れない夜です。

今回はBidirectionalRNNを使って文章を自動生成してみます。

前回、前々回の記事はこちらをご参考ください。

【Python】機械学習で文章を自動生成する方法

【Python】LSTMを使って文章を自動生成

BidirectionalRNNってなに?

まずは「bidirectional」の日本語訳は

双方向的な、双方向性の、二方向

です。RNNは前から順番に文字を読み込んで次に出てくる文字を予想したりするのですが、BidirectionalRNNは前と後ろから読んで次に出てくる文字を予想します。

インプット  アウトプット(予測)
はじめまし → て
てしまめじ → は

こんな感じで前と後ろから学習することで前からだけ学習したときよりも精度が良くなるというアルゴリズムです。

めっちゃざっくり(笑)

BidirectionalRNNをKerasで使ってみよう!

自分で実装するとなるとそれはそれは大変だと思いますが、Kerasなら1行で書けます。

前回のLSTMを使ったときは下記のように書きました。

model.add(LSTM( HIDDEN_SIZE , return_sequences = False , input_shape = ( SEQLEN , nb_chars ),unroll = True ))

 

LSTMの部分をBidirectional()で囲ってあげればOKです。

model.add(Bidirectional( LSTM(HIDDEN_SIZE, input_shape=(SEQLEN , nb_chars))))

 

※ 次のDense層とshapeが合わなかったので return_sequences = Falseは消しました。

実際に動かしてみたい方はRNN_alice_pub_003をお試しください。

どんな文章が生成される?

※ エポック ≒ 学習回数

10エポック
crowded to the seemed to the seemed to the seemed to the seemed to the seemed to the seemed to the seemed to

に見えたに見えたに見えたに見えたに見えたに見えた

怖いです(笑)何が見えたというのでしょうか…(;´Д`)?


20エポック
if you don’t know what is the same thing is to see it again!’ said the king, ‘i can’t here was so great

同じことが何であるかがわからない場合は、もう一度見てください。」と王は言いました。

すごい!わずか20エポックで文章になっている。


30エポック
wo and two the players with the project gutenberg-tm electronic works provide a shall before, and he said to

woと2人のプロジェクトgutenberg-tmエレクトロニック・ワークスのプレーヤーは前に必要条件を提供し、彼は言った

一部謎な単語が生まれましたが、全体として文章になっています。


40エポック
day,’ said the dormouse some of the other side of the way into alice’s heard something of the stick, and the

その日、アリスへの道のりの反対側にいる寮の住人は、何かの杖を聞いた、そして

なんか物語っぽいです。


50エポック

ow what to see in such a prept time before the words and a great dear!’ said the mock turtle went on in a deep

言葉の前のこのような準備の時間と親愛なる皆さん、何を見るべきなのでしょう。


 

と、まぁ前回お話したように意味不明になるのは仕方がないとして、確かに文章が作れている気がします。LSTMのときよりも早く文章ぽいものができるようになりました。

この辺りのがBidirectionalRNNの力が発揮されているところですね!

個人的には47エポック目がアリスの要素を含みながらいい感じに文章生成されていると思いました。

the countily side in a little while the dormouse shook itself, and thought it over after a fashion, and she

ヤマネが震えながらおしゃべりをしてしばらくしてから郡側

最後に

文章生成を試してみたい方はぜひこちらから動かしてみてくださいね^^

RNN_alice_pub_003 学習に利用するファイルを変えるだけでいろんな文章を作成できます。

利用できるのは英語だけなので時間が許せば日本語の文章生成ができるものを作ってみようと思います。

エンジニアの眠れない夜Twitterのフォローもお忘れなく(^^)v

 

これまでは英語を対象にしてきましたが日本語も「分かち書き」というものを使って文章を単語で区切る方法があります。

この方法を使えば日本語も同じ要領で生成できます。Google Colabで誰でも動かせるようにしているので、ぜひこちらもご覧ください。

[Python]MeCabで誰でも簡単に分かち書きをする方法

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください