はじめに
太宰治風の文章を自動生成する言語モデルをRNNを使って作る。こんな風に大見得を切るほど作り遂げる自信もないので「作ってみる」とかにしときます。とりあえずできるとこまでやってみる、といった感じです。開発の進行と同時にブログにも記事を投稿していくつもりですが、おそらくかなり行き当たりばったりなものになる気がします。
とにかく記念すべき第一回目の今回は作ろうと思った経緯と開発の大体の見通しについて説明していきます。見通しといっても本当に考え中といったものなので、今後変わる可能性も大いにあります。
追記(2020/02/12):(一応)完成しました↓
RNNが太宰治風の文章を自動生成してくれた―RNNで文章生成〈10〉
なぜ文章生成か
この夏に自然言語処理に関するリカレントニューラルネットワーク(RNN)関連の本を読みました。コチラの本です。
ゼロから作るDeep Learning ❷ ―自然言語処理編(Amazon) せっかく学んだわけだし自分でなんか作って実践してみるか、と思って何を作るか考えてみたところいくつか案が思いつきました。まず最初に思い付いたのが対話可能のAI。しかし大量の会話コーパスの入手とかも含めいろいろ難しそうなので却下。RNNと言えば時系列処理、時系列処理といえば機械翻訳だが、翻訳モデルは作ってもあんまり楽しくなさそうなので却下。そんなわけでいろいろ考えたところ、文章生成がよさそうだという結論に達しました。理由は三つあります。
一つはコーパスの収集の容易さ。今回は太宰治の小説によって学習させるつもりですが、青空文庫を使えば小説の電子データを簡単に入手できます。著作権が切れているので使用に関しても特に制約がないはず。
二つ目は、単純に完成したらどうなるか興味があるから。例えば、最初に「私」と単語を与えてそのあとに続く文を自動生成したらいったいどんな文章が出てくるのか...。まるで太宰の小説の主人公のような独白ができるのか...。考えるとワクワクします。作る理由としてはこれが最も大きいですね。
最後の理由は転移学習が使える(かもしれない)から。これはまだはっきりとはわからないのですが、公開されている日本語のword2vecなんかを使えば学習をより速く、効率的に進めることができるかもしれないので。
このような理由で、太宰治の小説というコーパスを利用して言語モデルを作ることにしました。
開発の流れ
開発の流れを大まかに書いてみます。途中で変わる可能性大。
1.言語モデルの設計
2.コーパスを収集&前処理
3.word2vecの入手&コーパス用に改良
4.モデルの実装
5.学習&ハイパーパラメータの調整
6.学習済みモデルで文章を自動生成
7.太宰治風の名文が完成!
必要なもの
開発に使用するツール等を備忘録として書いておきます。
・Python&各種ライブラリ
言語はPyhtonを使います。それとNumpyやMatplotlibなどの基本的なライブラリも。
・keras
上記の本はライブラリを使わずにRNNを実装するというコンセプトだったのですが、今回は開発を簡単にするために専用のライブラリを使うことにします。正直、数あるライブラリの中からどれを選べばいいのかほとんどわからなかったので、ググって評判のよさそうだったkerasを選びました。バックエンドはとりあえず有名なTensorFlowにします。
・青空文庫
コーパスの収集に使用します。
・MeCab
コーパスの前処理で単語ごとに区切る際に使用します。文章の区切り方には文字ごとに区切る方法などもありますが、今回は単語ごとに区切ることにします。理由としては、学習後に出力される文章を少しでも意味の通るものにしたいからです。文字ごとだと学習がうまくいかなかった場合にそもそも文として意味をなさないような出力になってしまいそうなので。せっかく作ったのに、生成されるのが文字化けしてるような文章だったら心が折れる...。
・word2vec
転移学習用。おそらくどこかに日本語用のものが公開されていると思うのでそれを使用させていただこうと思います。コーパスとで語彙の数が違うと思うので、その辺の改良もします。
・Google Colaboratory
無料でGPU環境が使用できるいうことなので。しかしいろいろと制約もあるらしいので学習の実行環境はまだ検討中です。自分のPCのCPUでは計算量的に多分無理ですよね。
まとめ
こんな感じで第一回目は終わりです。第二回はモデルの設計とその簡単な解説をしようと思います。ちなみにですが、上記の本の第一弾もニューラルネットワークの仕組みがわかりやすく説明されていて、とても面白かったです。
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装(Amazon)ではまた。
次回の記事↓
RNNを使った言語モデルを設計してみた―RNNで文章生成〈2〉