コードが書けない猫でもできるDeepLearningの文章自動生成(+ColaboratoryのTipsとSnippet)

Mizuki Kobayashi
Eureka Engineering
Published in
10 min readDec 22, 2018
DLわかり猫

はじめに、まじめに

この記事は eureka Advent Calendar 2018 22日目の記事です。

こんにちは。エウレカBIチームの小林です。

弊BIチームの業務としては、基盤構築から分析、機械学習の活用まで幅広くありますが、 私は後者の二つをメインでやらせていただいております。
分析業務から発生した産物として、15日の記事ではBigqueryStandardSQLのtips的なものを書かせていただきました。 今日の記事では、機械学習屋として筆を取らせていただきます。

当初の予定では、恋愛工学的な、(googleで検索して出てくるようないかがわしいものではない)、モテるための情報、いわゆる、データを分析した結果わかったユーザーの恋愛傾向のようなもので記事を書く予定でした。

しかし、センシティブな情報も含まれるため、クローズドな場所で発表した方が、誤解を与えず深いところまでちゃんと伝えられるのでは、と思い、そのような情報は今後ともクローズドな発表の場でやっていくスタイルでいきたいと思います。
興味のある方は発表を見に来るなど話を聞きに来るなどしてください。

そして今回は、最もオープンに発信していく情報として私が選びましたのは、最先端の技術。
DeepLearningファンボーイの私が2018年で最も感謝を述べたいツール、Google Colaboratory。今回はこのGoogle Colaboratoryをみなさんによく知って、使いこなしていただきたいと思います。

簡単な紹介、良いところ+Tips+Snippet、実ケース(文章自動生成)、の順でお送りしますので、COlaboratoryについて完全に熟知している方は序盤は飛ばしてください。

DeepLearning全くわからないけどやってみたい(だけどお金がなくて計算資源を用意できない)勢の方に向けた記事です。

Google Colaboratory

Google Colaboratory a.k.a 神の庭

Google Colaboratoryは、Googleが提供する、ブラウザ上だけで完結するJupyter Notebook環境です。
Jupyter Notebookとは何ぞやという人にざっくり説明すると、任意のセル単位で区切ってコードやマークダウンを記述、実行できる環境です。
詳しくはこちらをご覧ください。

Colaboratoryは、完全にブラウザ上で完結するので自分のPCに何かインストールする必要など全くございません。 敢えて言えば、Googleのアカウントを作成する必要があるくらいです。

ですが、たったそれだけで、無料で使えるGPU(あるいはTPU)をゲットすることができます。 いちいちややこいGPUドライバーやGPU計算用のライブラリ、DeepLearning系のライブラリなども(ある程度)最初から入ってますよ。神。

ノートブックインスタンスの最大起動時間が12時間などと色々制限はありますが、それを差し引いても最高です。

詳しい仕様や制限などは
こちらの記事(【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory)が詳しいです。

良いところ+Tips+Snippet

Colaboratoryの良いところはたくさんありますし、それを語る記事もいくつかあります。

その中で、あまり言及されていないけど私は個人的に便利だなと思った機能を紹介します。

スクラッチコードセル

そもそもノートブックのセルは、気軽に実行して結果を見て消して書き直してといったことが気楽にできますが、正しいコードと検証用のコードや変数などが混ざってしまい、カオスになりがちです。
そこで、スクラッチコードセルを用いると、ノートブックとは別の軸上でセルを実行することが出来ます。 これによって要らないセルの消去や修正をする回数が減るので、ノートブックを綺麗に保つことができます。

スクラッチコードセル

コードスニペット

Colaboratoryでは、スニペットが用意されており、用途で検索して使うことができます。 例えば、何かグラフを作成したいときに、 plot などと検索すると、このように出てきます。

スニペットの検索

基本的にplot系はAltairのものですが、他にも様々なスニペットが用意されていて心強いです。

また、このスニペットにはユーザーが独自のものを追加することもできます。 まず、スニペットをまとめたノートブックを作成します。

MySnippets

ノートブック内のセクションごとに別々のスニペットとして認識されます。

そして、ユーザー独自のスニペットを使いたい時には、 ノートブックを開いて、ツール → 設定 を開いて、 Custom snippet notebook URL の項目に、先ほど作成したスニペット用のノートブックのURLを貼り付けてください。 これで、スニペットの検索から、自作のスニペットが出てくるようになります。

自作のスニペットが一番上に出てくる様子

ただ、これを自動でノートブック作成時に行う設定や、複数のノートブックに一度に適用する方法は今のところありません。
なので、実際にはカスタムスニペットの機能はあまり使ってはいません。

一応、私の作成した、いくつかの見せられるスニペットを貼っておきますので、参考にしてください。

MySnippets

Plotlyを使うためのスニペットと、Mecab(mecab-ipadic-neologd)を一発で導入するコード(参考記事)が入っております。 有用ですので是非ご活用ください。

実践篇 ~文章自動生成~

熟知マンの方はこちらからお読みください

さて、ついにColaboratoryでDeepLearningを実際に動かして見ましょう。 せっかくなのでTPU(GPUより凄いやつ)を使って高速で学習させたいと思います。

突然ですが、DeepLearningがもし触れたらやってみたいことランキング、アンケートをとったところ、自動生成が一位でした。
やってみたいですよね、自動生成。

そこで今回は、Pairsユーザーのつぶやきを自動生成するタスクを解いてみたいと思います。

補足情報:
Pairsでは、自分に合う相手を探すために、様々な自己表現を行うことができます。自己紹介文、プロフィール、コミュニティなどあり、つぶやき機能というものも用意されています。
つぶやきでは短い文章を設定することができ、つぶやきはユーザーのプロフィール画面や、お相手を探す画面の一部に表示され、誰でも見ることができます。

今回の構造としては、3層LSTMを使って5個前までの文字から次の文字を推論するモデルで自動生成させたいと思います。

学習用データセットしては、ここ半年ほどの匿名化したつぶやきを持ってきて、適当にサンプリングしたデータを使いました。 つぶやきの長さは以下のようになっていますが、長さはある程度固定化したいので、25文字以下のつぶやきのみを使用しました

つぶやきの長さ(50文字まで細く存在する)

結果としては、以下のようになりました。

自動生成したつぶやき

日本語として読むことはできるが、ちゃんとしてるのとちょっとよくわからないのと、半々って感じですね。
知らない方のため念のため補足しておきますと、Pairsにはチケットと呼ばれる制度や機能はありません。
また、(辛くて)ハゲそうという類のつぶやきは男女ともいくつかあったのですが、ハゲたい旨のつぶやきはありませんでした。

そしてもちろん、実際のつぶやきはちゃんと皆さん文章として成立したものを書いている方がほとんどです。

今回使ったモデルを簡単に試せるように、無心で上から実行していけば試せるサンプルをこちらに用意しました。 文章の学習データとしたい文章群を改行区切りにしたもの(拡張子は問いません)をご用意ください。

https://colab.research.google.com/drive/1saGz-u5veDL0G0voQju-M_Ly6qZMgMlt

おまけ:SEEDBANK

神のGoogle様は、SEEDBANKなるものを用意してくれています。 様々な機械学習(DeepLearning含む)をすぐに自分のoColaboratory環境で実行して試せる形で公開してくれています。。

SEEDBANK

現在は、一般ユーザーが投稿できないので数はそこまで多くはないですが、それでも、手書き文字認識や、画像・音楽・文章の自動生成、翻訳など、楽しそうなものが沢山用意されています。

今までチャレンジしようにも自分のPCじゃ時間がかかる、今からPython覚えるの厳しいって方も、ただ上から順に実行していくだけでそれらが体験できるようになっています。

今後もどんどん種類は増えていくと思われるので、DeepLearningに興味のある方は是非要checkです。

--

--