見出し画像

LSTMアルゴリズムを使った自動作文

牧野 浩二

当記事はInterface増刊 AI自習ドリル 第18回「LSTMアルゴリズムを使った自動作文」【PDF版】の一部を抜粋したものです.
ご購入はコチラ https://cc.cqpub.co.jp/lib/system/doclib_item/1610/

 今回は文章を学習して新しい文章を作る「自動作文」 を紹介します.この自動作文を実現するためには,リカレント・ニューラル・ネットワーク(RNN)を基にした「LSTM(Long Short Term Memory)アルゴリズム」を使います.ここでは1時間以内に学習が終わる文章を扱いましたが,たった1時間の学習でもある程度意味の通る文章を作ることができたので,ぜひ試してみてください.また,プログラムをチューニングして長短問わず,いろいろな文章を作ってみてください.

1.できること


自動作文では,ディープ・ラーニングの1つである リカレント・ニューラル・ネットワークという過去の情報をうまく使って次の情報を予測する技術を使います.こう聞くと何ができるのかイメージしにくいかと思いますが,身近な例を見るとリカレント・ニューラル・ネットワークがどのようなものなのかを想像できるかと思います.

● リカレント・ニューラル・ネットワークの身近な例

▲天気予報
 今日が20 ℃だったら次の日に0 ℃になったり35 ℃ になったりということはほとんどなく,大抵の場合は 直近の数日の気温に影響を受けます.

▲ 株価予測
 非常にまれな事例として,ブラック・マンデーのような大暴落はありますが,大抵の場合は前日や直近の 1週間の株価に影響を受けて推移します.

▲ 病気の拡散
 流行の風邪もゆっくり拡散していきます.これも直近の数日間の影響を強く受けます.

▲ 音楽
 音楽には流れがあります.つまり,少し前のリズムの影響を受けて次のリズムが決まります.これがないと調和のとれた音楽にはなません.

▲ 動画
 場面切り替えを除けば,動画も直近の数フレームの 影響を受けます.例えば,車が走っている映像の場合 は,次のフレームは少し進んだところに車が居ることになります.

● 自動作文の応用例

 自動作文ができるようになれば,以下のような応用が考えられます.
▲ 天気予報の記事
 天気予報は定型文が多く使われています.そして, 天気予報は毎日行われるのでデータも豊富にあります. これまでの天気予報を学習しておくことで天気や気温, 日付などを入力すると天気予報の記事を生成できます.

▲ クイズ問題
 クイズ問題もパターンがありそうです.パターンを覚えれば,さまざまな種類の問題を作れます.

▲ 好きな作家のスピンオフ
 例えば,太宰 治の作品はインターネット上にもたくさんあります.これを学習して,その雰囲気に近い 作品を作り上げることもできます.
 こんな取り組みもあります.公立はこだて未来大学 で行われている「気まぐれ人工知能プロジェクト 作 家ですのよ」というものがあり,ウェブ・サイト (https://www.fun.ac.jp/~kimagure_ai/)では, 「星新一のショートショート全編を分析し,エッセイなどに書かれたアイディア発想法を参考にして,人工知能に面白いショートを創作させることを目指すプロジェクトです」と紹介されています.

▲ 映画の台本
 映画や舞台の台本も書けるようになるかもしれませ ん.例えば,ジブリのような可愛いらしさとガンダムのようなカッコよさをうまく融合した作品も作ってくれるかもしれません.

●「自動作文×AI」で実現できること

 自動作文とAIを組み合わせれば,以下のようなことも実現できると思います.
▲ 質疑応答
 コール・センタ,サポート・センタ,ヘルプ・デス クなどは質問をするとその質問の意図を読み取って適切に答えてくれます.質問の意図を読み取る,という部分にAIを使うことでこれが実現できます.現在は質問と回答のセットを学習することで実現しようとし ています.これらは実際に使われつつあります.

▲ 文章から質問と答えを作る
 ユーザ・マニュアルを学習して重要な単語を抽出して,それを答えにするような質問を作るといったことです.これができると,先に示した質疑応答の模範解答を作ることにつながります.実は,これも実現しつ つあります.

▲記事や本のまとめ
 要約を作成することができると,記事や本の内容をざっくりと把握できます.興味があれば詳しく内容を読んでもらうといった,呼び水として使うことに応用できます.

▲ 文章から感情を判断する
 文章をうまく理解できれば,その文章がポジティブ なのかネガティブなのかといった判断もできるように なります.さらにこれを進めると感情も分析できると考えられています.

2.イメージでつかむ


先に述べた通り,リカレント・ニューラル・ネットワークは過去の情報をうまく使って,未来の情報を予 測できます.この「うまく使う」という部分を以下で 説明します.

● 天気予報を例に考える

 例えば,図2−1(a)のように春の気温が推移してい るときの明日の気温の予測を考えてみます.このグラフでは徐々に気温が上がっているので,何となく上がっていきそうな感じがします.
 しかし,同じ気温でも秋の日の気温変化の場合は図 2−1(b)のように気温が下がってきますし,図2−1(c)のように冬の日の20 ℃は突発的なもので次の日はまた寒さが戻ってきそうです.そのため,今日の気温(20 ℃)だけで明日の気温を予測することは難しいです.



▲ リカレント・ニューラル・ネットワークの予測方法
 リカレント・ニューラル・ネットワークは,図2−2 のように前日までの気温の情報も一緒にして予測します.また,

• 7日前のデータを入力することで6日前の予測値を得る
• 6日前の予測値と6日前のデータを使って5日前の予測値を得る

ということになり,さらに,6日前の予測値は7日前 のデータが含まれていますので,5日前の予測値は6 日前と7日前のデータが含まれているということになります.
 以上を繰り返していくと,明日の予測値は今日のデータだけでなく7日前からのデータも考慮した予測値となります.


▲ 情報の優先度を決める
 このとき,昔の情報は重要度を低く,直近の情報は 重要度を高くしていく仕組みがあるとよさそうです. そこで,予測値の重要度を入力データの重要度よりも低くしておくと,直近の情報は重要度が高く,古い情報はどんどん重要度が下がっていきます.これは昔の情報を徐々に忘れていくことに相当します.

● 文章予測を例に考える

  次の例として,文章も同じようにそれまでの文脈が重要となります.例えば以下の文章があった場合を考えます.

4月になり暖かくなってきた。天気が良かったので 河原を散歩していたら…

 この後に続く文章は,「友達と会った。」とか「つくしを見つけた。」などはありそうです.しかし,「雨が降ってきた。」とか「カブトムシを見つけた。」というのは少し微妙な感じがすると思います.
 また,「シロクマがいた。」はあり得ませんし,「アイロンがけをした。」など全く意味をなさない文章が入ることもなさそうです.

▲文章予測には直近の単語も必要
 文章の場合は直近の文章だけでなく,その少し前の単語も覚えておく必要があります.例えば,先ほど微妙に感じた「雨が降ってきた。」というのはその前の「天気が良かった」という言葉に矛盾がありますし,「カブトムシを見つけた」というのは冒頭の「4月」という言葉からあり得ないことが分かります.
 このように,文章の場合は直前の言葉だけでなく, 重要な単語を覚えておくことが必要になります.

▲ LSTMアルゴリズムなら記憶のバランスをとれる
 文章予測の問題を解決する方法がリカレント・ニュ ーラル・ネットワークの進化版であるLSTM(Long Short Term Memory)です.これは長/短期記憶とも呼ばれ,すぐに忘れる部分としばらく覚えておく部分の両方を併せ持つ特殊なリカレント・ニューラル・ネ ットワークです.

3.やってみよう



● 物語「桃太郎」を作文してみる 

 ここではsakubun_test.ipynbを使います.まずは,sakubun_test.ipynbをGoogle Colaboratory (以下,Colab)で開きます.
 次に,図3−1にあるように学習モデル(***.h5)と 単語リスト(***_vocab.txt)をアップロードします. ここでは,桃太郎(momotaro)を対象とします.
 その後,Colabのセルを上から順に実行していきます.最後まで実行すると,以下のように表示されます.

入力:桃太郎,出力単語数:20

桃太郎は、おばあさんが、かわるがわる、「もう桃太郎が帰りそうなものだが桃太郎さんが、声をそろえて、「万歳、万歳。」とさ けびまし

 なんとなく桃太郎にありそうな文章が出来上がっていますね.

▲ もう少し長い文章を作る
 これは以下のように,リストの中の作文する単語の数を設定している,s_lengthを変更します.

#作文する単語の数
s_length = 50

 以下は50にして文章を作ったものです.ただし,長くしすぎると後半部分は桃太郎のそのままの文章が出てきます.

入力:桃太郎,出力単語数:50

桃太郎さんが、声をそろえて、「万歳、万歳。」とさけびました。見る見る鬼が島が近くなって、もう硬い岩で畳んだ鬼のお城が見えました。いかめしいくろがねの門

▲ 単語を変えてみる
• 最初の単語を変える
 「桃太郎」と設定しているstart_wordを変えます.

#最初の単語
start_word = '桃太郎'

 「おばあさん」は「お ばあ さん」として単語分 けされているので,「ばあ」としました.

start_word = 'ばあ'

その出力結果が以下です.文章から,おばあさんが 鬼が島に行きそうなのが分かります.

入力:ばあ,出力単語数:50

ばあさんだんごをして、「お前どこへ行くのだ。」と
聞きました。「鬼が島へ鬼せいばつに行くのだ。」「お
腰に下げたものは、何でございます。」

• 文中の単語を変える

 「じい」や「鬼」に変えると以下が表示されます.

入力:じい,出力単語数:50

じいさんと、おばあさんも、うれしがって、こう言
いました。そこであわてておじいさんがお湯をわか
すやら、おばあさんが、かわるがわる、「もう桃太
郎が帰りそうなものだが。

入力:鬼,出力単語数:50

鬼のばつに、きじに、猿も、声をそろえて、「万歳、
万歳。」とさけびました。見る見る鬼が島へ、鬼せい
ばつに行くのだ。」「お腰に下げた

 「鬼」は桃太郎そのままの文章が出てきてしまいました.

● 他の作品に変える方法

 次に違う作品を対象としてみましょう.ここでは以下の作品を用意しました.

• 桃太郎(momotaro)
• 浦島太郎(urashima_tarou)
• 金太郎(kintaro)
• 一寸法師(issunboshi)
• 竹取物語(taketori_monogatari)
• 白雪姫(shirayukihime)
• 人魚姫(ningyono_hime)

 これらを使うためには,以下の2つのことを行います.
▲ 1,作品名の変更
 作品名は,以下の部分を変更します.
book_name = 'momotaro'
 ここでは「浦島太郎」に変更した例を示します.この名前は作品名の後にあるカッコ内の単語です.
book_name = 'urashima_tarou '

▲ 2,単語リストとモデル・ファイルのアップロード
 単語リスト***_vocab.txtとモデル・ファイル ***.h5 を アップロードしま す. ここで,*** は book_nameと同じものを用います.
 以上の2つを行った後,同じようにして実行すると文章が生成されます.

<プログラムの入手先>
https://www.cqpub.co.jp/interface/download/contents_ai.htm

本稿は著作物であり,著作権法により保護されています.本書の一部,または全部を著作権者に断りなく,複製または改変し他人に譲渡すること,インターネットなどに公開することは法律により固く禁止されています.違反した場合は,民事上の制裁および刑事罰の対象となることがあります.

.

この記事が気に入ったらサポートをしてみませんか?