コードノート

コードノートはwebを中心にテクノロジー・クリエイティブを伝えるWebメディアです。コードリンク代表、片岡亮が執筆しています。

Google Colaboratoryで学ぶ、LSTMを使ったAIの自動歌詞生成

f:id:moba13:20191027190921j:plain
なんとなくシリーズ化している、ディープラーニング勉強会の第4回目を実施したのでそのメモです。

これまでの振り返り

■第1回 [理論] 実際AIって今どんなことできるのよ?会。

blog.codelink.co.jp

■第2回 [実践] Googleの無料学習環境を使って、ポチポチGANとやらを体験してみよう会。

blog.codelink.co.jp

■第3回 [実践] AIに学習させるデータを加工するのにもプログラムを使うと良いよね会。

blog.codelink.co.jp

今回の概要

ディープラーニングラーニングの概要説明 → 画像処理ときたので、今回は文章処理編。

ちょうど先日、Googleが検索エンジンの一部に「BERT」と言われる、ディープラーニングによる文章解析システムを組み込んだニュースが発表されました。

jp.techcrunch.com
(関係ないですが、「BERT」の前身に「ELMo」というシステムがあり、セサミストリートのキャラ名が命名に含まれてますね。めちゃ蛇足。)

プログラミングによる文章処理はまとめて「自然言語処理 (NLP→natural language processing)」と総称されます。

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ―自然言語処理編

 

Google検索も世界中のwebサイトの文章を解析して検索結果を作っているので自然言語処理ですし、Google翻訳も入力した文章を解析して違う言語に変換するということで自然言語処理です。

いま、人工知能は「Google検索」を大きく変えようとしている|WIRED.jp

噂によると、一時のあいだ、シンハル氏は機械学習システムをGoogle検索に採用することに断固たる抵抗を示していたようだ。

これまでのGoogle検索は、人間の手による厳格なルールにもとづいたアルゴリズムを採用してきた。あるグーグル元社員によれば、ニューラルネットにおける解釈やその対応がより困難を極めるという懸念からだ。

ほんの2.3年前には、Google検索部門のトップの人も「ディープラーニングによる自然言語処理?まだまだ無理でしょ」って言っていたのは、今となるとなんだか不思議ですね。 

diamond.jp

2016年末には、AIによる東大の入学試験合格を目指すプロジェクト「東ロボくん」が、今のAIでは長文の文脈理解難しい、といった理由でプロジェクトを凍結しました。

しかしその2年後にはGoogleがBERTを発表し、そのさらに先端のシステム「T5」では人間以上とも言える文章読解スコアを出しています。すごい。

BERTについて詳しい解説はこちらなど。

ai-scholar.tech

RNN・LSTMって何?

そんな前振りがあってからの今回のお勉強会でしたが、「BERT」の前身「ELMo」にもLSTMは使われています。

qiita.com

f:id:moba13:20191027180744p:plain

RNN・LSTMについて僕が劣化コピーした解説をweb上にまき散らすのは嫌なので、詳しくは筑波大学の先生の講義動画がなぜか無料で見れるのでそちらを。

ocw.tsukuba.ac.jp

かなりざっくり言えば、ディープラーニングで時系列データを学習する時に利用されるモデルです。

「時系列データ」と言うと若干言葉がややこしいですが、平均気温の変化グラフや株価の変化、人の動作記録、会話データなど時間の変化があるデータは全部、時系列データです。

そんなデータを扱う時のベーシックなモデルがRNNです。そしてRNNだと長期の時系列データを学習できなかったので、その弱点を補ったのがLSTMです、みたいなかんじ。

今回のテーマは「AIの自動歌詞生成」ですが、「文章を書く」のも時系列があるデータ処理です。

人は皆、文章を書くとき、それまで書いた文章(過去)を元に、続く文章(未来)を想像しているのですから。

AI君にも、歌詞の導入が「会いたくて会いたくて」だったら、それに続く言葉はなんでしょう?とお題を出して答えてもらうわけです。

当然、いきなりそんな質問には答えられないので、事前にいっぱい歌詞のテキストデータを時系列データとして学習してもらいます。その学習を元に、AIが新しい歌詞を生みだしてくれるのです。

やってみよう

そんなこんなで、実際にAIによる自動歌詞生成を行った環境がこちらに。

毎度おなじみ、Googleが無料でディープラーニングの学習環境を貸してくれるサービス「Google Colaboratory」を使いながら、web上にある先人達のコードをほぼそのまま使わせていただきました。

colab.research.google.com

主に参考にさせていただいた記事。

cedro3.com

cedro3.com

qiita.com

後半、形態素解析も利用した学習例もありますが、正直蛇足かなぁという気もしています。

形態素解析は昔ながらの自然言語処理手法の一つで、文章を「意味を持つ最小限の単位(=単語)」に分割する方法です。

それを使い、AIに文章を1文字1文字渡すのでなく、前準備として文章を意味ごとに分割してから渡してみよう、という試みですが、効果があるかはなんとも言えません。

普通に考えると効果が高そうですが、ディープラーニングの学習は人間があれこれ手を加えたデータの方が良いのでは?と試行錯誤した結果よりも、データをそのまま与えた結果の方が良いことも多いのがまた不思議なところです。

ディープラーニングによる日本語解析の研究成果ってあまり公にされていないので、この辺実際どうなっているのかな?というのは、気になりポイントです。

データ準備・結果

コードはお借りしたものを使うので、学習用の歌詞データを集めるのが大変といういつものやつでした。

最初、30曲かそこらで学習したのですが、結果が芳しくなかったので、途中から適当にプログラムを書いて400曲(約20万字)ぐらい収集して入れたら良いかんじになりました。

(参考)

qiita.com

5曲10曲でも学習できないことはないですが、元の歌詞そのままのフレーズが出ることが多くあまり楽しくなかったので、良い結果を出したかったら最低100曲ぐらいはあると良いのかなぁと思います。

それでも歌詞は、そこまで文脈が必要なくとも"それっぽい"結果に見えるので対象として面白いですね。

例えば小説生成になると青空文庫といった権利的な問題もない大量のデータがあるのでやりやすいですが、小説における"それっぽい"文章はハードルが高くなりがちです。

僕がテストした時は、主にボカロ系のアーティスト楽曲をまとめたデータで学習させてみました。

学習元データの歌詞の文節ごとにスペースが入っていたため、通常のテキストを学習させる際よりも変な日本語が出づらかった気がします。改行が多いのも同様に。

プログラムからすると「スペース」も「改行」も一つの文字なので、「スペース・改行の次にはどんな文字が来る?」という質問が定期的に挟まり、その都度良い感じに内容がリセットされる印象でした。

逆にいえば、「それ」「君」「僕」「今日」など文頭によく出る単語が頻出し過ぎて、浅い文になりがちだったとも言えます。

その辺は元データのスペースや改行を一部削ったりすると、また違った結果になりそうです。すべては学習データしだい。