Deep Learning

2016年12月 8日 (木)

Microsoft Cognitive Servicesがうらやましいのでパチもんを作ってみた

Fujitsu Advent Calendar 2016の8日目です。 なお、このエントリは個人の立場で書いております。

ディープラーニング関連の話を書こうと思います。 とはいえ、あまり技術的なものではないです。 技術的にすごい話は11日目のsakaiakiraさんや、 他の方が書くでしょう。 ここでは、ディープラーニングを勉強していて湧き上がる心の叫びのようなものを取り上げ、 その勢いでとあるサービスを特に意味なく実装することを試みます。

思うこと

要約すると、だいたい以下になるんですけど、

  • MicrosoftのCognitive Servicesがうらやましいという妬み
  • 自分がろくなデータを持っていないという悲憤

念のため。 これは私個人の話です。 富士通としてはディープラーニングをばりばりやっているところがあるはず。

今、多くのソフトウェア開発者がそうだと思いますが、 私もディープラーニングをぼちぼち勉強したりしております。 私としては、 ディープラーニングそのものももちろん興味深いのですが、 それをプラットフォームにしたり、 サービスにしたりといった方面により興味を持っています。

そういう意味で、 各クラウドの機械学習サービスだとか、 Microsoft Cognitive Servicesだとか、 GoogleのCloud Vision APIだとかを「いいなー」と見ています。

特に、 Microsoft Cognitive Servicesいいですね。 このCognitive Servicesには色々なサービスが含まれています。 LUIS(Language Understanding Intelligent Service)とかも重要そうですが、 私のお気に入りはEmotion APIです。 ディープラーニングの面白さがシンプルに出ていると思う。

Emotion APIは、 画像を送りつけると、 その中から人間の顔を検出し、 どういう感情を持っているかを推測します。 こんな感じ。

Emotion APIの画面

この例では、 お子さんの顔を検出して、 "happiness"とか"anger"とか8種類の観点での「確率」を計算しています。 この値はこの裏で動いている学習済みモデルの計算結果であり、 正確には確率とは言えないと思うんだけど、 全部足すと1になるように調整されているようなので、 確率っぽい数字になっています。 ここでは「確率」と言っちゃいます。 この例では"surprise"成分90%ですね。

Emotion API本体はJSONを返すWeb APIですが、 以下のWebページでAPIの動きを試すことができます(上の図はこのページ)。

Emotion API (Microsoft Cognitive Services)

Emotion APIは今年春先のBuildイベントで発表されました。 その際に私は「ほほう」と思ったもんで、 いろんな画像を突っ込んでみてブログを書きました。

Microsoft Cognitive ServicesのEmotion APIを使ってみた (使って色々思いを馳せた編) (2016年4月2日)

でですね、 こういうのを提供できるっていうのは、 大量に自前データを持っているからだと思うのです。 Microsoftも色々言われながら、 Bingやめなかったのが生きてますね。 API化するなら、自前データだよなあ(「自前って何」と考えると意外と難しいけど)。

ひるがえって自分なのですが、 いろいろお勉強して、 いっちょやってみよー、 と周りを見回すと、 ろくなデータがないのです。 今まで生きてきて私は何をしていたのだろうかと思ってしまいます。 ディープラーニング学習させるには、 従来とは桁違いの量のデータが必要だと思います。 かろうじて量があるのはテキストベースのデータなのですが、 自然言語は一筋縄ではいかないしなあ。 今の業務上も、あんまり処理するよによさげなデータが出てこない。

そこを工夫してデータを探し出したり、 公開情報をあさったり、 データを持っている誰かのところに出向いたり、 なんとか考えるんだ、というのは分かります。 分かります。 が、個人的にブログでぶっちゃけるぐらいはいいだろう。 「きちんとラベル付けられた大量で自前のかっこいいデータがほしい!(なるべく汎用API化できそうなやつ)」

ということで

以上で言いたいことは大体尽くしているのですが、 それだけではなんですので、 この思いをコードに託し、 Emotion APIの如きサービスを立ち上げてみました。

このサービスは、 顔の画像を送りつけると、 いくつかの観点それぞれに該当する「確率」を返します。 Emotion APIが"happiness"とか"anger"の「確率」を返すのと同様です。 その分類の数はEmotion APIの8分類をはるかに凌駕する10分類です。

では、そのサービスを試してみましょう。 Web APIももちろん用意していますが、 とっつきやすいWeb GUIもあります。 操作はEmotion APIの画面と一緒です。 先程のEmotion APIのお子さんの画像を入れてみると、こんな感じ。 スタイルが本物に比べるとしょぼいけど、気にしない。

Digit APIの画面

はい。 このサービスでは、 顔がどの数字(0-9)に一番似ているかを判定します。 顔の領域の検出機能は残念ながらありません。 というか、入力画像が顔であるかどうかも実は気にしていません。

お察しの通り、 このサービスはディープラーニングにおける"Hello World"たるMNISTをそのまま動かしています。 0-9の手書き数字を認識させるというやつですね。 手書き数字を識別するために訓練されたモデルに 何の関係もない画像を無慈悲に流し込むという鬼畜のごとき所業です。 CNNの無駄遣い。 しかも、 MNISTの入力に合わせるため、 入力画像は問答無用に28 x 28のグレースケールにリサイズします。

要するに、 学習すべきいけてるデータを持たないので、 思い余ってMNISTをそのままAPIにしてみました。 サービスのURLは以下です。

Ipponshimeji Cognitive Services - Digit API

【2017年1月17日追記】 このサービスの稼働は年末で終了させました。

モデルの学習は、 Microsoft Cognitive Toolkit (CNTK)を使っています。 以下のサンプルの03_OneConvDropout.cntkをほぼそのまま実行しています。

CNTK/Examples/Image/GettingStarted/ (GitHub)

ただし、最後の出力だけ変えています。 目的がクラス分けではないので、各ノードの値をSoftmaxを通して「確率」が出力となるようにしています。 この変更も含め、 サービスのソースもGitHubに置いています

CNTKの評価ライブラリの利用については、 はまったところもあるので、 覚えていればまたブログに書きたい。

注意事項など

このサービスはアドベントカレンダーの期間中くらいは動かすつもりです。 Azure Web AppsのB1インスタンス1個(1コア)で弱々と動かしています。 スケールさせるような余裕はありません。 まあ、そんなことはないと思いますが、アクセスする酔狂な人が大量にきたらパンクするかもしれない。

また、判定した画像は保存していません。 ローカルマシンのファイルをアップロードして判定させた場合でも、 そのファイルは保存しません。 メモリ上だけで処理しています。 ただ、「全体でリクエストがいくつあったか」「判定結果」だけはログを取ります。 どの数字に似た画像が多いのかはちょっと興味あるし。

あと、再度念押しですが、このサービスは個人的に勉強がてら作って試しているものです。

おわりに

このサービスの実用性はまったく無いんですけど、 せっかく作ったので、 「誰の顔が一番数字の4に近いか」勝負とか、 忘年会の余興にでもご活用ください。

何人かの写真をぱしゃぱしゃ撮って、 スコアを出して順位をつけるスマホアプリとか作ってくれてもええんやで。

2016年5月30日 (月)

「りんな」の仕組みをもうちょっと詳しく調べてみた

5月25日に、de:code 2016のセッション「りんなを徹底解剖。"Rinna Conversation Services" を支える自然言語処理アルゴリズム」に参加してきました。 人気のセッションで入場制限になりましたが、ぎりぎり立ち見で参加することができました。 セッションビデオや資料はまだ公開されていませんが、 ニュース記事は以下のものなどが出ています。

今まで、 「女子高生AI bot」たる「りんな」の背後にディープラーニングや機械学習が働いている、 ということは聞いていましたが、 具体的な解説は見かけませんでした。 で、このセッションでは技術解説もあるらしい、 ということで聞いてきたわけです。

セッションは上の記事にもある通り、とても面白い内容でした。 ただ、私は最近ディープラーニングを勉強し始めたこともあり、 ディープラーニングを使っている具体的な場所をもう少し特定できんものだろうか、と思ったのでした。 そこで、 週末にセッション中で言及された論文を元に、 もう少し詳しく調べてみました。 まあ、この論文も、言語処理学会の年次大会(NLP2016)の20分枠の一般発表資料らしく、わりとざっくりした感じですけれども。

ということで、 以下、セッションと論文を突き合わせて考えた私の理解。 まだ説明読んですべてがぱっと分かるような境地ではないので、正しいかどうか自信ないけど。

チャットワーカー

今回調べる対象は、チャットワーカーです。 言葉を入力とし、言葉を出力とする部分。

りんなのフレームワーク

りんな:女子高生人工知能」から「図2. りんなのフレームワーク」

まず、りんなのシステムは、 インターネットから収集した「対話ペア」を学習ネタとして保持しています。 論文では「対話ペア」は厳密に定義されていませんが、リクエストとレスポンスからなる言葉によるやり取りと考えてよいでしょう。 後の話から考えて、 「対話ペア」のプールは「女子高生的ないい感じの会話」が選択されて大量に集められているんじゃないかな。

その上で、チャットワーカーは以下の二つのモデルを対話のエンジンとして使います。

  • ランキングモデル
  • 生成モデル

ランキングモデル

ランキングモデルは検索システムに似たシステムで、 対話ペアの中から、ユーザー入力(リクエスト)に最も類似するものを選び、そのレスポンスを返します。 その類似度(ランキング)を決定するランカーは以下の素性を使います。

  • 翻訳モデル(説明略)
  • 文の長さ
  • AIM言語モデル(説明略)
  • GRU類似度

この最後の「GRU類似度」の計算にRNN(ディープラーニングの技法のひとつ)が用いられています。 de:codeのセッションやその記事で「DSSM + RNN-GRU」として特に詳しく解説されている部分がここに相当します。 大量の「いい感じの対話ペア」を学習させることで、 ユーザー入力に対する各レスポンスの「類似度」(すなわち、「いい感じ対話度」)が出力されるニューラルネットを用意した、ということでいいのかな。 この部分の詳細な説明は、最初に挙げた記事を参照してください。

なお、ランカー自身はブースティング決定木として学習されます。

生成モデル

生成モデルは翻訳システムに似たシステムです。 リクエストを翻訳元言語、 レスポンスを翻訳先言語とみなして 統計的機械翻訳のような枠組みで対話ペアを学習させ、 リクエストからレスポンスを生成させます。

原理的にはここの学習でもRNNとか使うやり方もあるんじゃないかと思いますが、 論文には特にディープラーニングを使っているとは書いていません。

セッションで「りんなが詠む俳句はストックしているのではなく、その場で生成している」という話がありましたが、 俳句の生成は生成モデルを使っているのかな? ランキングモデルから俳句をひねり出せそうな気がしないし。 もしそうなら、その場合リクエストとして何を入力しているんだろう?

ランキングモデルと生成モデルの使い分け

特に書いていないです。 ランキングモデルで選択した対話ペアのランク値があまりに低い場合には生成モデルで生成している、とかかな。 あるいは簡単な言い換えを実現するためとかに生成モデルを使うのかな。 「犬かわいい」から犬を猫に置き換えて「猫かわいい」へ置き換え、とか。 まあ、よくわからん。

思うことなど

もしこの理解が正しいとしてですが…

ディープラーニングの使いどころが思っていたものと違いました。 「いい感じ」を直接学習しているわけではなく、 既存の対話ペアの類似度を算出するのに使われており、その値がランキング判断の一要素として採用されるわけですね。

チャットワーカーは、 大量の「いい感じの女子高生っぽい対話ペア」を様々な技法で学習・活用することでいい感じの対話を実現しているということになります。 りんなのコンセプトが「Emotional AI」ということで、 なんらかの「感情値」みたいなものを計算しているのかと思ってたんですが、 こういう風に「いい感じのもの」を集めて学習させればいいのか。 なるほど。 それとも、一般にbot類はそういう風に作るものなのかな? 知らんけど。

また、このやり方だと、 ちょっと前に起きた、Microsoftの別のbotである"Toy"が不適切な会話を学習してしまった、 というような事件は原理的に起こりにくい、のかな。

あと、 りんなはあまり複雑なステータスは保持しておらず、 入力に対して反射的に回答している、 ということになります。 「その話さっきしたよ」みたいなことが発生するだろうけど、 あまり整合性のある会話を要求されないから、いいのか。

一般に、ディープラーニングをやるには正しくラベル付けられたデータを学習ネタとして大量に用意することが一苦労です。 りんなの場合、「女子高生的ないい感じの対話ペア」を大量に用意しているということになります。 ネガティブな対話ペアを学習させるわけにはいかんので。 この対話ペアの選別ってどうやっているのかな。 手作業じゃあないよな。

余談

「りんな」の名前は"RNN"に由来する、という話があるそうですよ。 セッションで技術部分を説明したりんな開発者のWuさん(上の論文の筆頭著者)はその話について「さて、どうですかね~(ふふふ)」みたいな反応でした。

さらに、セッションスピーカーの砂金さんが「一説によると」として、 「りんな」の名前の由来は"RNN"と開発者の坪井一菜さんの"Kazuna"から来ているらしいと紹介していました。 こちらは、同じくスピーカーだった坪井さんにその場で否定されていましたが。

2016年4月 2日 (土)

Microsoft Cognitive ServicesのEmotion APIを使ってみた (サンプルをビルドする編)(追記あり)

最近、ディープラーニングを勉強し始めていて、画像から感情を検出するという技術(Emotion API)に興味をそそられています。ということで、Emotion APIを簡単に使ってみたという話。まず、APIを準備してサンプルをビルドする編。

Microsoft Cognitive Servicesとは

Microsoftが提供するWebサービスです。 Build 2016(Microsoftの開発者イベント、2016/03/30-04/01にサンフランシスコで開催)で発表されました。どういうものかを一言で説明するのは難しいんだけど(いや、一応それらしい説明はあるんだけど)、以下のビデオのような世界を実現するために必要となるもの、と考えるのが分かりやすいのではないかと思います。これは、Buildの初日キーノートの最後に流されたビデオです。

Microsoft Cognitive Services: Introducing the Seeing AI app (「字幕」を有効にすると字幕を見ることができます。英語だけど)

Webサイトは以下。

Microsoft Cognitive Services

去年、画像から人の顔を特定して年齢を推測するWebサイトが話題になったのを覚えているでしょうか? Project Oxfordというやつですね。それが進化したものです。

Emotion APIとは

Microsoft Cognitive Servicesを構成するAPI群の一つで、画像やビデオから人の顔が写っている部分を特定し、そこから読み取れる感情を推測して返します。

Emotion APIのページに載っている以下のデモを見れば、どういうものか想像できるのではないでしょうか。

Emotion APIページのキャプチャ

Emotion APIのリファレンスを見ると、 4個のAPIが定義されています。今回ここで使ってみるのは、 "Emotion Recognition"です。

Emotion APIを使うには

ちょっと試してみるだけなら、先のページのデモ機能でも十分ですが、せっかくなのでもう少しまじめに使ってみます。

Emotion APIを使うには、以下の手順が必要です。

  • Microsoft Cognitive Servicesを利用するためにアカウントを登録する。
  • Emotion APIを呼び出す。その際には、登録した際に割り当てられるキーを使う。

「Emotion APIを呼び出す」はcurlコマンド一発でもいいのですが、サンプルアプリが用意されているようなので、それを使ってみます。

以下、その手順の説明です。次回のブログでは、そのサンプルアプリを「使ってみた編」を書く予定。

Microsoft Cognitive Servicesを利用するためにアカウントを登録する

Microsoft Cognitive Servicesのページの"Get started for free tody"ボタンから登録できます。その飛び先のページに説明がありますが、

  1. Microsoftアカウントでサインインし、
  2. 使いたいAPIの種類にチェックをつけ、同意事項をチェックして"Subscribe"ボタンを押す

すると、登録処理が行われ、 Cognitive Servicesのサブスクリプション管理ページに飛びます。ここで、"Emotion - Preview"の項目を見てみましょう。

Cognitive Servicesのサブスクリプション管理ページのキャプチャ

こんな感じです。時刻表示はGMTのようですね。現状、無料コースでは「30,000トランザクション/月 かつ 20トランザクション/分」までのようです。

さて、ここで重要なのはキー(Key)です。キーはCognitive Servicesの各API毎に用意される文字列で、この文字列が後でAPIへのアクセスをするための鍵になります。アカウントにはキーが二つ(Key 1, Key2)が割り当てられています。どちらも等しく有効です。

後にサンプルをビルドして実際に動かしてみる段になると、このキーが必要になります。その際には、このページからキーをコピーします。

キーの文字列は、最初"XXXXXXXXXXXXXXXXXXXXXXXXXXX"のように隠されています。、 "Show"をクリックして実際の文字列を表示させ、文字列をコピーし、 "Hide"をクリックして再び文字列を隠します。

言うまでも無いとは思いますが、キーは秘密にしなければなりません。キーがばれてしまうと、他の人がサービスを自分のアカウントで使うことができてしまいます。キーがばれてしまった場合は、 "Regenerate"をクリックしてキーを「取り替え」ます。

Emotion APIのサンプルをビルドする

Emotion APIのサンプルはGitHubにあります。 GitHubのMicrosoft/ProjectOxford-ClientSDKプロジェクト下の、 Emotion/Windows/Sample-WPFにある Windows版サンプルを使います。

単純に、 GitHubからサンプルをとってきて、 Visual Studio 2015で"EmotionAPI-WPF-Samples.sln"開いて、ビルドすればできあがります。

ただ、ビルドの最初にNuGetパッケージの復元が行われますが、私の環境ではNuGet動かず、ビルドエラーになりました。しかし、これはサンプルの問題では無く、 NuGetが全体的に動いていなかったので、私の環境の問題のようです。つい最近までNuGet動いていたと思うんだけどな? Visual Studio 2015の「ツール」-「オプション」の「NuGetパッケージマネージャー」-「パッケージソース」でチェックがオフになっていたv2パッケージソースを有効にしたらビルドできました。

【2016/04/07追記: これはどうやら、NuGetの問題のようでした。「NuGet 3.4 Known Issues」を参照のこと。 4/09あたりに修正が公開されるとあるので、待っていれば直るんじゃないかな。急ぐ人は前記ページに載っているwork-aroundをどうぞ。】

サンプルコードも特にトリッキーなことはありません。 Asyncスタイルで用意されているEmotion APIのクライアントライブラリを非同期呼び出しで呼び出しているだけです。まあ、このAPIの場合、重要なところはすべてサーバー側の方だろうし。

サンプルを起動すると、以下の画面が現れます。

サンプルアプリの画面

この"Subscription Key:"に先ほどのキーを記入し、 "Save Key"を押せば準備完了。

次回、これを使って画像を色々読み取らせてみます。