IBM Watsonつかってみた

IBM_Watson_logo_square

概要

Deep learningと並んで、cognitive(認知の)という言葉をたまに聞きます。そして、何か違うらしいです。Deep learningは脳を模倣することで人間のような振る舞いを実現することに対し、cognitiveサービスは

「ある事象についてコンピュータ自ら考え、学習し、自分なりの答えを導き出すシステム」[1]

のようです。どう実装されている全くわからないので、違いがさっぱりわかりませんね。そこで「IBM Watsonがcognitive computingらしいので、使って違いを感じよう」という内容です。

目的

IBM Watsonが提供しているNatural Language Classifier(自然言語分類)を使ってclassiferを作成する。

※classifer : 質問を入力として受け取り、答えを返すもの。

環境整備

IBM Watson Natural Language Classifierを使えるようになるまでは、日本語の情報が多々あるため他へ譲ります。

用意するもの

・IBM Watsonが日本語対応したようですので日本語で学習データを作ります。

train.csv
“秋田県の犬で、寒さに強い大型犬。”, “秋田犬”
“山形県で交配を繰り返し誕生した。ずんぐりとした体型の中型犬。”, “甲斐犬”
“世界最小の超小型県。原産国はメキシコ。手足は細いが胴体と頭は頑丈。”, “チワワ”
“ドイツ原産の犬。手足の短い小型犬で猟犬。”, “ダックスフンド”
“出生は諸説あるが、ロシアが原産。兎狩りの猟犬であったが、大物の獲物を狙うように大型化された”, “ボルゾイ”
“秋田県、山形県などがある”, “日本”

・Watsonにアクセスするために必要なユーザ名とパスワードをIBM Bluemixのダッシュボードから取得します。

学習データを渡す

curl -u "username":"password" -F training_data=@train.csv -F training_metadata="{\"language\":\"ja\",\"name\":\"分類器の名称\"}" "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers"

# レスポンス
{
"classifier_id" : "分類器のID",
"name" : "分類器の名称",
"language" : "ja",
"created" : "2017-03-08T04:55:06.871Z",
"url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID",
"status" : "Training",
"status_description" : "The classifier instance is in its training phase, not yet ready to accept classify requests"
}

学習状況の確認する

curl -u "username":"password" "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID"

# レスポンス
# ステータスが Availableになると分類器が使用可能です。
{
"classifier_id" : "分類器のID",
"name" : "分類器の名称",
"language" : "ja",
"created" : "2017-03-08T04:55:06.871Z",
"url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/f5bbbbx174-nlc-6756",
"status" : "Available",
"status_description" : "The classifier instance is now available and is ready to take classifier requests."
}

分類する

curl -X POST -u "username":"password" -H "Content-Type:application/json" -d "{\"text\":\"秋田の犬は?\"}" "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/分類器のID/classify"

# レスポンス
# confidenceが高いと質問の答えである可能性が高いことを表す
{
"classifier_id" : "4d5c10x177-nlc-2616",
"url" : "https://gateway.watsonplatform.net/natural-language-classifier/api/v1/classifiers/4d5c10x177-nlc-2616",
"text" : "秋田の犬は?",
"top_class" : "\"秋田犬\"",
"classes" : [ {
"class_name" : "\"秋田犬\"",
"confidence" : 0.9556775779503917
}, {
"class_name" : "\"ダックスフンド\"",
"confidence" : 0.01982286574391806
}, {
"class_name" : "\"甲斐犬\"",
"confidence" : 0.013740711627384897
}, {
"class_name" : "\"チワワ\"",
"confidence" : 0.006179913677611047
}, {
"class_name" : "\"ボルゾイ\"",
"confidence" : 0.004578931000694318
} ]
}

色々分類してみる

質問を変えた時のconfidenceを表にしました。

犬種\質問 最小の犬は? 大型犬は? 寒さに強い犬は? 寒さに弱い犬は? 猟犬は?
秋田犬 8.8% 67.7% 95.7% 95.6% 0.9%
甲斐犬 8.4% 2.2% 0.6% 1.4% 1.4%
チワワ 57.2% 1.5% 0.8% 0.8% 1.0%
ダックスフンド 22.5% 24.6% 2.5% 1.7% 94.4%
ボルゾイ 3.1% 4.0% 0.5% 0.5% 2.3%

結果を眺める

  • 「最小の犬は?」 : それっぽい結果で、大きさごとにconfidenceが並んでるように見えます。
  • 「大型犬は?」 : 一番confidenceが高い秋田犬はあってると思うのですが、その次にダックスフンドが来ている点が怪しいですね。あとボルゾイも大型というキーワードが入っているのに関わらずconfidenceがダックスフンドより低いのは、気になります。
  • 「寒さに強い犬は?」 : 良さそうな結果ですね。
  • 「寒さに弱い犬は?」 : これに関しては真逆ですね。「寒さに弱い」というキーワードを学習データに入れてないので分類できなくて当然といえば当然なのですが、Natural Language Classifierの強みとして「学習データにないキーワードも分類できる」[2]とあるのでちょっと期待していたのですが、残念。
  • 「猟犬は?」 :間違ってないのですが、ボルゾイのconfidenceが低い気がします。

まとめ

IBM Watsonの設定が済んでしまえば、curlだけで学習から分類までできるのは、エンジニアにとっては良かったです。
ただ、分類の結果に関しては、期待を超えるものではなかったです(学習データが少ないことが原因な気がしますが)。
学習データの構造もある程度揃えた方が精度が出るなどの小技も色々あるようですので、精度を出そうと思うと、やはり従来の学習と同様に学習データが重要になりそうです。
あれ、cognitiveとdeep learningって何が違うんでしたっけ?

参考

[1]:http://iot-jp.com/iotsummary/iottech/%E3%82%B3%E3%82%B0%E3%83%8B%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/.html

[2]:https://natural-language-classifier-demo.mybluemix.net/ 今のところ学習データにないキーワードで分類できるのは英語だけかもしれません