機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

【ガメハチ】ポケモン名っぽい駅名 part02 Character-level Recurrent Neural Networkの学習【一発ネタ】

前回はポケモン名を一部に含む駅名を抽出する単純な実験を行いました。今回は、自然言語処理技術を導入してポケモン名をモデル化します。

select766.hatenablog.com

モデルの構造として、Character-level Recurrent Neural Network (Character-level RNN)というものを用いました。簡単に言えば、文字列が与えられたときに次の文字を予測してくれるようなモデルf再帰的に使う手法となります。ポケモン名で例えます。「サンド」「サイホーン」などがいることを考えると、最初の文字が「サ」のとき次の文字は「ン」や「イ」となるのが自然です。それを確率的なモデルで表現すると、f(サ) => ン=40%, イ=30%, ...というような入出力になります。「サンド」や「サンダー」がいるので、最初の2文字が「サン」のとき、次は「ド」や「ダ」が来るのが自然です。f(サン) => ド=60%, ダ=30%,...というような入出力であればこれが表現できます。「サンド」が先頭に来るポケモン名は「サンド」か「サンドパン」しかいないので、単純に完全一致で考えるとf(サンド) => EOS=50%, パ=50%というモデルになります。ここでEOSはEnd-of-sentenceで、文章(今回は1単語だけの特殊な文章になります)の終わりを表す特殊な文字です。これがモデルから出力されたら文章生成を終了します。このモデルだと実在するポケモン名がそのまま出てきて終わりになってしまい、実在しないがポケモンっぽい名前を表現できていません。そこで条件を緩和して、「サンド」の続きの文字ではなく「ンド」の続きの文字を考えると、「ネンドール」や「ペンドラー」もいますので、「サンドー」や「サンドラ」のような文字列もポケモンっぽいと考えてみます。f(サンド) => EOS=25%, パ=25%, ー=10%, ラ=10%, ...というようなモデルの出力が実現されれば、ポケモンっぽさを残しつつ実在しないポケモン名を生成できます。

Character-level RNNは以上のような「与えられた文字列に自然に続くような文字を生成」することができるモデルです。このモデルをポケモン名で学習させます。 実装はPyTorchのチュートリアルを改造することで行いました。Character-level RNNの正しい理解にはここでは説明していない隠れ状態などの説明が必要ですので、技術的な詳細はリンク先をお読みください。

pytorch.org

チュートリアルでは、言語(英語、フランス語など)を条件としてその言語風の人名を生成するという課題を解いていますが、日本語のポケモン名だけを使うので言語を条件として与える部分を取り払います。 文字の集合はアルファベットから、ポケモン名に使われているカタカナに置き換えました。具体的にはァアィイウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロワンヴーの79文字です。隠れ層のチャンネル数ですが、学習サンプル数が最大でポケモン数である887しかないので、5-fold cross validationの結果、かなり小さい8チャンネルとすることにしました。

学習したモデルに対して先頭の文字を与えて、最大確率の文字を取り出して連結することを繰り返してポケモン名っぽいものを生成してみました。

ァイアージ
アルガメ
ィアスワル
イルフィニ
ウツハニ
ェリーズル
エルビール
ォクワムシ
オンドール
カブル
ガメハチ
キュワル
ギギル
クロバージョ
グマネイル
ケンターン
ゲチャヒメ
コロッチルト
ゴルバル
サンカイル
ザルガッチ
シャマッチ
ジャラッチ
スカメイル
ズマル
セクレロズン
ゼルガー
ソンプル
ゾロアージ
タイドー
ダージャー
チャラーダ
ヂムシャー
ッチャラー
ツボツボ
テティオス
ディアル
トゲキール
ドングランウ
ナイト
ニャラード
ヌメル
ネコアージ
ノズクル
ハリボール
バルビー
パルネコ
ヒメルキ
ビル
ピジョン
フードラ
ブルバッチャ
プリージ
ヘルガニ
ベルバクロー
ペルホール
ホエル
ボーフィオ
ポポッチ
マル
ミルホーン
ムシャード
メノコ
モリン
ャマツチルク
ヤミルホール
ュウワウズル
ユキワル
ョロボット
ヨーボッグ
ライワル
リージャー
ルビール
レジョッチ
ロバッチ
ワルビル
ングラン
ヴァディオ
ージャラー

ピジョン」、「ワルビル」のように一部実在のポケモン名が出てきてしまっていますが、なんとなくポケモン名っぽい文字列が生成できていることがわかります。「ー」(伸ばし棒)で終わる名前が多数出ていますが、実在するポケモン名は111種類が伸ばし棒で終わっているのでそれが自然であるということを学習していることが期待できます。ところで、公式にはポケモンの名前の由来は説明されていないものの、「ヒトデマン」「クヌギダマ」のように実在の生物の名前を含んでいるポケモン名が多数あります。ポケモン名として使われたことがない生物の名前をモデルに取り入れれば、ポケモンらしさを保ちつつより生成のバリエーションを増やせる可能性があります。

今回はポケモン名をCharacter-level RNNに学習させ、ポケモン名っぽい文字列を生成しました。次回は最終回で、もともとの問いであったポケモン名っぽい駅名を探します。