分かった気持ちになるディープラーニング

この記事はMDアドベントカレンダーの14日のやつです。
昨日の記事はまくくまとさんたさんのくりしますものがたり(β)でした。
まくくまはとてもゆめのあるいきものです。




はじめに

こんにちは、明太子熊です。夢の無い方の熊です。MDアドベントカレンダーは3回目です。
誰?って思う方もぼちぼち多くなってきてると思いますが、誰なんでしょうね本当に。

実態ですが、眼鏡忍者先輩でお馴染み、ざわ氏の高校時代からの友人です。
たまに曲を作って公開してます。昨日、最近作った曲をsoundcloudに載せました。よろしくお願いします。
毎週ブログ書くという習慣を体得しました。一年続いたので多分ずっと続けると思います。
最近はさまざまな方に影響を与えられているようで、皆さんも是非やってみてください。
職業ですが、無職です。

今回は、とーやさんのbotで遊んでいろいろ懐かしい気持ちになった話と、bot*1を楽しくするディープラーニングの話をします。


bot楽しいよね

わかる〜〜~~〜って感じ。
botとおしゃべりするのも楽しいし、bot作るのはその100倍くらい楽しいです。

koguma-goya.hatenablog.com


僕もbotが好きすぎてこんな記事を書いたりしました。
ちょっと読みづらいので、これはそのうちいくつかに章立てして書き直します。

botとの出会いみたいなエモい話はまたいつかすることにして。
5日目担当のとーやさんが卒業制作で作ってるLINEbotを触って、ああー、こういうbot久しぶりでいいですねえーってなった。

話を聞いている・実際に触ってみた限り、中身はおそらくルールベース*2で頑張って応答リストを作っていて、それに加えて特定単語とか対話頻度に応じて好感度を設定しているっぽい。
また、応答リストも時刻によって変動するっていう手の込んだ内容となっていて、昔ツイッターでよく遊んだbotを彷彿とさせる素晴らしい出来となっています。ぜひ皆さんも遊んでみてください。
一度同じようなものを作ったことがある身としては、本当に地味でしんどい作業が目に見えて労いの言葉しか出ない。

僕も昔、Twitterbotでアイドルチックなの作ろうとして、応答スクリプト対をつくるためのアプリケーション用意したところでモチベ途切れてやめました。
その後、アイドルのツイートをクロールしてそれっぽいツイートを生成して吐き出すだけのbotとなり、一か月ほどで停止しました。すまん。


なぜbotは魅力的か

かわいいから。


ディープラーニングの話

さて、ルールベースのbotの長所であり短所として挙げられる点として「用意された応答リストに沿った動作しかしない」があります。
商用の案内システムや、恋愛シミュレーションのように好感度を上げていくゲームとしての運用であれば、これ以上が求められることはありません。

しかし、もし他愛ないおしゃべりを目的としたbotを作るのであれば、想定していなかった発話に対しても、そこそこそれっぽい返答ができる必要があります。
マイクロソフトの「りんな」にも見られるように、どんな発話にも対応できる。そういうシステムが現状、求められているような気がします。
(りんなはルールベース部分がうるさいので微妙だよねって話したらMSの人に嫌な顔された)

想定外の発話に対応する方法の一つとして、流行りのディープラーニングが挙げられます。
良いですよね、バズワードとしてのディープラーニング。とりあえず使っておけみたいな気持ちわかります。

ということで、この記事の後半では「なんでディープラーニングが想定外の入力にも応答できるのか」という話を超簡単に説明します。
高校受験以来数学に触れてない人向けの内容ですので、
この先、専門の人は読むの禁止です。
数学が好きな人も読むの禁止です。嘘ばっかり書きます。

明日のアドベントカレンダーは15日目、karingityouさんの「ギャグ思い付かなかったら真面目な話かな~」です。
面識有りませんが、ギャグの方を120%で期待しております。おたのしみに!




きもちでわかるでぃーぷらーにんぐ

想定外の入力に対して、それっぽい出力を得たいという要望に、ディープラーニングは応えてくれます。
ここでは、超簡易化した"""ディープラーニング"""を用いてその気持ちを理解することを目的とします。

突然ですが、以下の表をご覧ください。

x 0 1 2 3 4
y 1 3 5 ? 9

この表は、入力としてxが与えられた時、望まれる出力がyであることを表しています。
たとえば、0が入力されたら1、1が入力されたら3が出力されるようなルールがあって、それを表しています。

この表を見た上で、「では3が入力されたら何が出力されますか?」という質問に答える方法を考えましょう。
表は、以下のようにプロットされます。

f:id:mentaiko_guma:20171213122522p:plain

このプロットを見ながらxが3の時のyを選択するために、以下のような線を引いて見る人がほとんどでしょう。

f:id:mentaiko_guma:20171213124015p:plain

こうすることで、各点と同じようなルールに基づいて、だいたいyは7くらいじゃない?という結論が得られるかと思います。

ここで、「事前に準備していない入力に対して、それっぽい出力を得られた」という点に着目してください。

事前に準備したいくつかの入力と出力から、それっぽいルールを見つけ出し、グラフを書きました。
そのグラフを用いることで、未知の入力に対して出力を与えることができるのです。

どうやってそのルールを見つけ出すか、という点が非常に面倒くさくなるので一切触れませんが*3
これをさらに複雑にしたものがディープラーニングと言っても間違いではありません*4



話をbotに戻しましょう。
先ほどは入出力に数字を用いていましたが、今度は自然言語にしてみます。

以下のような入出力の組を考えます。

x おはよう おやすみ こんにちは だいすき
y おはよ! また明日! やっほー! やったー!

ユーザーが「おはよう」と入力すると、「おはよ!」と返してくれるようなルールだと思ってください。

これを先ほどと同様、グラフ上にプロットします。
細かいことは気にしないでください。私がそこにプロットするといったらするのです。

f:id:mentaiko_guma:20171213183146p:plain


これらの点を、滑らかにつないだ以下のグラフを描いてみます。
線を引くのが下手くそですが、許してください。

f:id:mentaiko_guma:20171213183718p:plain

上の例で、未知の入力3からそれっぽい出力を得たのと同じように、
このオレンジ色の線を用いて、未知の入力「おはよーん」への出力を考えてみます。

この入力は、グラフを描くために使ったデータには含まれていないため、学習したモデルでの予測が必要になります。
おそらく「おはよーん」の入力は「おはよう」の近くになるはず*5なので、それを元にして出力を考えます。

f:id:mentaiko_guma:20171213184617p:plain

こんな感じで、「おはよ!」の近くの出力が期待されることがわかります。
あるいは、期待される出力に最も近い「おはよ!」をそのまま出力してもいいでしょう。
同じようにして、「おやすーーーーみ!」みたいなのにも、「また明日!」を返すことができるでしょう。

さらに複雑な空間で考えることで、ディープラーニングはこれをいい感じに学習してくれるのです。






・・・





f:id:mentaiko_guma:20171213184144p:plain







その気持ちはとてもよくわかる

ただ聞いてほしい、実際にうまくいくこともあるんだ。
そこが実際運用する僕らとしても不思議なんだけど、なぜかうまく行くんだ。

この話はとっても簡易化されていて、グラフもxだけからyを求める二次元平面上でしか考えていない。
実際に使う時には、もっと200次元空間(軸が200個ある空間だと思ってください)とかでの話になるんだ。
もっと複雑なグラフの元で、自然言語みたいなものが何らかの形で学習されて、それっぽい返答をしてくれるプログラムがあるんだ。

意味わからないよね、本当に意味わからない。
だから僕はディープラーニングが好きじゃない。でも楽しいんだ。
そういう気持ちを少しでも分かち合いたいんだ。

人工知能の代名詞みたいになってるディープラーニングは謎の生命体じゃなくて、ただの大規模な関数でしかない。
それが、僕らの計算能力の追いつかないところに居心地のいい解を見つけて学習が収束する。
さあ、興味を持ったら始めよう、ディープラーニング

明太子熊は初めての機械学習を支援します。




明日のアドベントカレンダーは、karingityouさんの「ギャグ思い付かなかったら真面目な話かな~」です。
お楽しみに!

*1:中に人がいないタイプのものに限定することにします。

*2:「おはよう」に「おはよう!」と応答するリストを、全てルールで決めておくスタイルをルールベースと呼ぶことにします。

*3:非線形回帰」とかでググってください。

*4:文句は受け付けません。

*5:「単語分散表現」でググってください。