BOTエンジンと機械学習
2016年 08月 04日
テクノロジーサービス部というところは、機械学習(ML)や自然言語処理(NLP)などの技術を使って自社のプロダクト支援を行うことを目的とした部署になります。
これまで、いくつかの開発を担当しましたが、代表的なプロダクトはWisteriaと名前の付いたレコメンドエンジンです。主にエキサイトニュース記事のレコメンデーションに利用されています。また、そのWisteriaは6月から開始しているExcite Publisher Trading Deskへの組み込みも予定されており、他社提供も含めてますます利用の範囲が広がって来ています。
また、エキサイト恋愛結婚という婚活のマッチングサービスでは、主にお相手の推薦ロジックの実装を行いました。
これらはそれなりに複雑なシステムなため、またあらためて別の機会に個別に詳しく解説させていただければと思っています。
今回は、現在試験的に取り組んでいるチャットBOT開発と機械学習についてお話ししたいと思います(技術の話は今回ほとんどありません)
みなさん、BOTと聞いて何を想像しますでしょうか?
おそらくAppleの「Siri」や「Googleアシスタント」、MSのLINE BOTである「りんな」などの会話ボットが思い浮かぶのではないかと思います。最近では、MSのBOTの「Tay」が不適切発言を連発して停止に追い込まれたといったニュースが記憶に新しいかと思います。これらはそれぞれ用途が異なったりしますが、総じて言えるのは、ある程度汎用的に会話もしくは質疑応答可能なロボットを目指している点です。これらのシステム構築の大前提には巨大な一般会話コーパス(データセット)が必要ですが、弊社の場合ここまでのリソースを用いるコストを負担できませんし、そもそも弊社で作る意味も今のところありません。
しかし、世間のBOTテクノロジーに対する期待はどんどん大きくなっているようですし、ひと昔に比べて確かにアルゴリズムやインフラが進化しており、おぼろげながら舞台は整いつつあるのかなと思います。
ただ、ご存知のとおり、まるで人間のように会話の流れに従って文脈を理解し適切な返答を返せるほどのボットは現在の技術ではまだ実現不可能です。(15年は先か?)よくメディアで見るロボットが流暢に会話している光景はたぶんある程度決まった質問をしているからだと思われます。試しにLINEのりんなと会話してみてください。その際りんなのペースに惑わされず、会話に矛盾が生じていないか意識して会話してみてください。途端に破綻していることに気づきます。そのような状況ですから、昔からそうですが現在のBOT技術においても、あるジャンルに特化した会話エージェントの域でどう役に立てられるかをまずは考えるべきと思います。アルゴリズムも一新され、ハードも進化し、希望の光が見えてきたのは間違いありません。
加えて自分たちの限界を知り、そこは謙虚に気をつけて設計しないと中途半端なプロダクトになってしまうことは容易に想像できます。弊社のようなC向けサービスを展開している企業では特に、ユーザー目線に立ってよいと思えないものは、どんな技術を使っていようが世の中に出すべきではないと思っています。私のようにエンジニアで毎日のように何か作ってたりすると「この技術ではここが限界だから、このあたりで良しとしよう」とか「まあ、変なところあるけど始めることが重要だよね」みたいにな考えになったりすることもありますが、それはいつのまにかユーザーとは別の方向を見てしまっていると言えるのではないかと思います。そういう時は今一度本当にそうか?これを使った時にユーザーどう思うだろうか?と考えるようにしています。自分が社会的常識人だと考えるのであれば、この問いかけをすることによりおおよそのケースで問題は明確になります。あるテクノロジー企業が自社サービスにBOTを導入したけど、ユーザー体験を損ねるという理由で止めてしまった、とのニュースを目にしたことがありますが、BOT熱冷め止まぬ中そろそろこういう具体的なネガティブな例が出始めています。このようにテクノロジーがユーザーの支持を得られず、もしくは当初の仮説とおりにうまくいかず潰れていくプロダクトが後を絶ちません。新技術を使ったサービス創出については全てはバランスですので、まずは最低限技術的に関係するところだけでも自分なりにユーザー目線でこの程度は許容できるという線をどこかに設定して開発を行っていくように意識しています。もちろん他者目線での調査も必要で、もし線を越えてしまうようであればあまり迷わず rm -rf * して、他のことを考えます。
とりわけ機械学習が絡むシステムについては線引きが難しいものです。とくに人と機械の関係において難しい側面があります。アルゴリズムがうまく機能しているかなどシステムに関する検証は機械的にできますが、サービス全体としてうまく機能しているかどうかは機械学習特有の汎化能力から来る曖昧さも手伝って、平均すると大きな問題はないが、それでも使う人によって捉え方が異なることがあるため検証が簡単ではないからです。また、もちろん事業的にどうなんだっていうのは、会社視点からすると別途存在するわけです。我々は長年の間、機械はミスをしないと経験してきたけど、「間違えることもあるのです、予測ですからね」と言われて心底納得して身を削れる人がどれだけいますかね?「1+1は2なんですよなぜなら数学でそう定義されてますから」と言ってくるシステムと、「1+1は2.01かもしれないし、1.99かもしれないです、その心は正直自分でもよくわかりません、だけどあなたがちょっと考えたレベルで結論は出してませんけどね」と言ってくるシステムのどちらに投資するでしょうか。さらに以前から指摘されているとおり、人は確率を過小・過大評価し、志向に左右されるなどのバイアスが存在するので余計に複雑です。ここ数年間機械学習系のプロジェクトやビジネスに携わっていてこのあたりの機械に対する人のマインドが障壁になることがあるなと感じます。なので、たぶん具体的な成果を出して徐々に浸透させていく必要があるのでしょうね。
さて、だいぶ話が断線して前置きが長くなりましたが、今回ある特定のジャンルについて一問一答形式で会話できるBOT構築を目指すことにします。
では実際どのような技術を用いるべきでしょうか?
大まかなにやりたいこと、そのやりたいことの本質について考え、自分や組織の引き出しの中の知識断片を取り出して当てはめていく作業をまずはやります。その断片とは元を辿れば先人の知恵と努力のおかげで客観的に検証され人類の役に立っているもしくは役に立つであろうシステムやアルゴリズムになりますが、それら知識の獲得にはやはり勉強しかないわけですね。そのためには本来は常にアンテナを張るべきなのですが、ML、とりわけ進歩の激しい深層学習(Deep Learning)の分野では毎日のように”xxxデータを使ってSOTA”などの論文が発表されている状況に、正直なところ物理的にも頭もついていけていない現実があります。弊社のような研究所を持たない企業は、ある程度市民権を得たアルゴリズムやシステムをどのように活用していくのかを考えることにフォーカスすべきなのでしょう。
ここでは、”テキストでの一問一答”がやりたいことの本質であり、必要な知識のほとんどは”機械学習のアルゴリズム”になるかと思います。webサーバー必要かな?とか、facebookやLINEのメッセンジャーのAPIってどんな感じかなとか、そういうのは本質じゃないので最初に考えなくてよいはずです。
とにかくそうやって大雑把に”あたり”をつけたら次は、やりたいことを具体的に幾つかのフェーズに分けて調査します。
今回は以下4点にまずは分けてみました。
・ひとつの質問を受け付け、BOTなりに理解し、ひとつの固定の回答を返す
・どのようなジャンルのBOTも、一定のルールで実装可能
・常識の範囲の応答時間
・各メッセンジャープラットフォームで利用可能
最初の2つについては、下記のようにしました。
質問を受け付け回答するためのモデルには、Recurrent Neural Network(RNN)で使われるLong Short Term Memory(LSTM)ベースを採用しました。単語間のつながりを長期保存学習し、かつ文全体としての意味獲得が期待できるからです。今回はなるべく正確な回答を返したかったので固定の回答、つまり入力となる質問文(sequence)に対して分類クラスを返すようにしたいと思います。RNN系でよくあるたとえば自動翻訳で使われるsequence to sequenceモデルやその拡張であるattentionモデル等だと固定の回答(sequence)になるとは限らないので、やりたいイメージとしては sequence to categoryです。調べたところあります。
Recurrent Convolutional Neural Networks for Text Classification
embed(ベクトル埋め込み)された形態素を入力とし、RNNで学習した後に各出力をmax-poolingで圧縮し、最後にsoftmaxでクラス確率に落とし込む。その際、RNN層は対象を時系列的に双方向につなげることにより、より意味を捉えやすくする。とのこと。RNN層のmax-poolingは画像系処理のDNNでいうところの畳み込みに相当するんですかね?またRNN内部の双方向結合については、単語の前後の共起を考慮する方法でNLPではよくある考えかたですが応用力なんだよなあと。有名なword2vecもそうだった気が。
コーパスは今回は試験なのでなんでもよいのですが、特定ジャンルを手動で用意してみました。一レコードが以下のようなフォーマットを読み込みます。とにかくたくさん質問&回答のセットを考えます。ジャンルが限られているので無限ではないと信じて作り続けます。
質問テキスト[TAB]回答クラスラベル[改行]
また、今回は単語ごとにembedしたいので形態素解析でMeCabを利用しました。
テストコードは普段から使っているChanierで書きました。(googleがTensorFlowに最適化したCloudを出すとの情報があるので、使えるようになったら徐々に移行かなとは思っていますが、とにかく今はChanierで勉強してきたこともあり、Define-by-Runな設計思想もすばらしく、私のようなプログラマーからするとたいへん入りやすく大好きです!勉強目的でスクラッチからNNライブラリを実装した時にはChanierのソースを参考にさせていただきましたが本当に見やすく、 NNのアルゴリズムそのもの以外、たとえば自動微分とか、CUDAプログラミングなどの学習目的にもChanierのソースコードはすごく役に立ちます )
テストでは普通に学習も収束してくれていい感じです。
また、一定のルールのもと学習に使うコーパスさえ用意できれば、どんなジャンルでも原理的には対応可能です。
ちなみに学習時は試行錯誤が必要なのでGPU必須かなと思います。まだテスト段階なので学習は手元のTITAN搭載PCでごりごりやっています。
3つ目の応答時間ですが、これはGPU無しでもモデルがそれほど大きくなければ特に問題ないです。モデルのトレーニングはGPUインスタンスで行い、推定部分は通常のCPUインスタンスで実行するように切り分ければよいと思います。
最後の1つ”各メッセンジャープラットフォームで利用可能”については、BOTエンジンをサーバー化してHTTPで喋れるようにしておくだけです。今回はロジック部分をPythonで書いているのでPythonで書かれたWebサーバーに乗っけるのがてっとり早く、軽量WebサーバーのBottleを採用しました。 必要ならプロキシー的なWebサーバーを立てたほうがよいかもれません(Facebook Messangerの場合、メッセージを出し入れするエントリーポイントはSSL化されてる必要があるので、Apache等のWebサーバーを立てて証明書インストールなどがてっとり早いか)
いけそうです!これで本格的に実装に入れます。
本番にアップするのはまだまだ先、十分な検証が必要です。その結果次第ではお蔵入の可能性もあります。
「で、結局何のためのBOT作っているの?」って話になると思いますが、それは秘密です。というよりぶっちゃけ現時点ではなんでもいいのです。もちろん適用サービスは想定済みなんですが、やるかどうかわからないので公開できるようでしたら別の機会に紹介させていただきます。
文章が長くなってしまいましたが、最後に。
AIやBOTがバズっています。近年(といっても結構経ちますが)、NNのアルゴリズムにブレイクスルーがあり、NLPへの応用も急速に進んでいるように見えます。ハードウエアもそれなりに進化してきました。ただ、自然に会話できるロボットができるのはまだまだ先、やっと単語やフレーズの意味を理解できるようになってきたくらいです(それでもかなりの衝撃で偉業ではあるのですが)。人間の会話を理解することはすなわち人間の脳を理解することであり、五感を活用しつつ言葉を操る人間だけが持っている特性はやすやすと獲得できるものではないということですかね。言葉を記号列の処理という観点だけで捉えている間は限界があるんでしょうね。私もそんな複雑脳を持った人間の一人のはずですが、酔った勢いで変なこと言ってしまったり非効率な面も多々ありますけどね。。それも含めて。
ハード、ソフト両面が進化を続けた20年後、 自分たちの子供の世代において、人がロボットと自然に会話している姿を想像するだけでワクワクしますね。エキサイトにはPepperくんがいるので今のうちに少し未来を体験しておきます。自分も時代に取り残されスマートフォン使えないおじいちゃん的な扱いにならないようにできる限りついていきたいですね。生きていたらの話ですけど。
エキサイトでは新卒・中途問わず一緒に働いていただけるエンジニアを募集しています。
Web開発や機械学習にご興味のある方はこちらから是非ご応募ください!
