Elasticsearchと機械学習を
実際に連携させる
Preferred  Networks,  Inc.
2016/03/16
⾃自⼰己紹介
l  久保⽥田展⾏行行(@nobu_̲k)
–  CTO@Preferred  Networks,  Inc.  (PFN)
u  US勤務  (Preferred  Networks  America,  Inc.  in  San  Mateo)
–  元々Preferred  Infrastructure  (PFI)のチーフアーキテクト
u  分散全⽂文検索索レコメンドエンジンSedueの開発者
l  専⾨門
–  検索索エンジン(作る⽅方の⼈人)、データベース、分散システム
l  趣味
–  ⾳音ゲー:beatmania  IIDX  SP/DP皆伝、右⽚片⼿手九段
2
前回のテーマ:機械学習で全⽂文検索索をリッチにする
l  機械学習によって検索索対象の情報を増やす
–  ⽣生データからそのままでは分からない情報を得る
l  増えた情報を検索索エンジンで活⽤用する
–  ナビゲーションの軸にする
–  全⽂文検索索と組み合わせてキーワード毎に集計・可視化する
3
前回のテーマ:PFIのデモ
4
l  年年齢
–  5段階+ボット
l  性別
–  男⼥女女+ボット
l  職業
l  地域
–  今いる場所
l  情報を提供して
いないユーザの
個⼈人情報を機械
学習で推定(怖い
今回のテーマ
l  前回できなかった話
–  実際にどうやって機械学習を適⽤用すれば良良いのか
l  PFNが2016/3/14にリリースしたOSSを使って実演
5
機械学習 Elasticsearchデータソース
データをElasticsearchに入れる前に
機械学習を適用し、データをリッチにする	
ここ実際どうすんの?
その前に・・・
6
復復習:機械学習とは
l  経験(データ)によって賢くなるアルゴリズムの研究
–  データから知識識や⼈人間が定義するようなルールを⾃自動的に獲得する
–  ⼈人⼯工知能(AI)の分野の⼀一つ
7
学習データ
今⽇日扱う機械学習の問題設定:⽂文書分類
l  教師あり学習の⼀一種
–  ⼈人が正解を教え、機械学習のアルゴリズムがそれを元に学習する
l  よくあるタスク
–  新聞記事やブログ記事のカテゴリ推定
l  先ほどのデモでの活⽤用例例
–  年年齢や性別をラベルとして分類
u  年年齢分類、性別分類などを独⽴立立したタスクとして解いている
‒  注:年年齢を"回帰"として推定することも可能だが、今⽇日は説明しない
l  機械学習を使う⼿手順なども後ほど改めて復復習説明
8
全⽂文検索索+機械学習のユースケース
l  どの企業について
つぶやいているか
l  年年齢・性別
l  ポジネガ
l  ユーザの地域
l  +固有表現抽出
–  ⼈人名
–  地名
9
全⽂文検索索+機械学習のユースケース
l  VOC向け
l  商品種別の分類
l  既存情報
–  事故内容
–  傷病内容
–  デモグラ
l  コールセンターの
対応内容の情報を、
オペレータの負担
なく増やす
10
Confidential
ツールの紹介
11
12
Lightweight Stream Processing Engine for IoT
http://sensorbee.io/
(特に)ネットワークのエッジ/フォグで
ストリームデータに対して
機械学習(特にDeep Learning)を利用した
非構造化データ向けのETLを
低レイテンシで適用することを目的としたツール
{
"id": 123,
"age": "35",
"gender": "male",
"location": {
"x": 252.1,
"y": 179.3
},
…
}
SensorBee™:  Stream  processing  engine  for  IoT
13
Camera
Vehicle
Router
Sensor
fluentd
RDBMS
Search
Engine
NoSQL
Data Sources Data Destinations
SensorBee™ focuses on transformation of and information extraction
from structured and unstructured streaming data at the edge of the
network, in the Fog, and in the Cloud. Machine learning and Deep
Learning perform data transformation and information extraction.
SensorBee™ enriches information content and adds new value prior to
data being loaded to data processing systems.
ETL くらいのバランス
SensorBee™:  Transform
14
Camera
Vehicle
Router
Sensor
fluentd
RDBMS
Search
Engine
NoSQL
Data Sources Data DestinationsSensorBee™
BQL, an SQL-like language
•  Filter
•  Aggregate
•  Join
Data processing flow by a SQL-like language
BQL is designed for stream
processing. It is schema-less and
uses JSON as its internal data model.
CREATE	
 SOURCE	
 camera	
 TYPE	
 webcam_mjpeg	
 WITH	
 uri="http://host:port/path/to/video";	
 
CREATE	
 STREAM	
 frames	
 AS	
 
	
 	
 SELECT	
 RSTREAM	
 snowflake_id("general_id")	
 AS	
 id,	
 *	
 FROM	
 camera1	
 [RANGE	
 1	
 TUPLES];	
 
	
 
CREATE	
 STREAM	
 regions	
 AS	
 
	
 	
 SELECT	
 RSTREAM	
 id	
 AS	
 frame_id,	
 snowflake_id("general_id")	
 AS	
 id,	
 *	
 
	
 	
 FROM	
 detect_people("frames",	
 "detection_config_parameters")	
 [RANGE	
 1	
 TUPLES];	
 
	
 
CREATE	
 STREAM	
 regions_with_metainfo	
 AS	
 
	
 	
 SELECT	
 RSTREAM	
 classify("age_model",	
 image)	
 AS	
 age,	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 classify("gender_model",	
 image)	
 AS	
 gender,	
 *	
 
	
 	
 FROM	
 regions	
 [RANGE	
 1	
 TUPLES];	
 
	
 
CREATE	
 STREAM	
 male_average_ages	
 AS	
 
	
 	
 SELECT	
 RSTREAM	
 avg(age)	
 AS	
 age	
 FROM	
 regions_with_metainfo	
 [RANGE	
 5	
 MINUTES]	
 
	
 	
 WHERE	
 gender	
 =	
 "male";
SensorBee™:  Flexibility  and  Extensibility
Camera
Vehicle
Router
Sensor
fluentd
RDBMS
Search
Engine
NoSQL
Data Sources Data DestinationsSensorBee™
Plug-in Plug-in
UDF
Custom functionalities are added as
User Defined Functions (UDFs) and User
Defined States (UDSs) of BQL, such as
Deep Learning transformations.
Machine learning
•  Classification
•  Regression
•  Object recognition
•  Anomaly detection
Machine learning algorithms
supported in DIMo are online and do
not require local storage.
UDS
SensorBee™:  in  Deep  Intelligence  in  Motion
16
Camera
Vehicle
Router
Sensor
fluentd
RDBMS
Search
Engine
NoSQL
Data Sources Data DestinationsSensorBee™
Deep	
  Learning	
  
DeepIntelligence

in-Motion(DIMo)	
Sta-s-cs	
  
Computer	
  
vision	
  
Detect/Track/
Recognize	
  
Reinforcement	
  
learning	
  
Distributed/
Curriculum	
  
Time-­‐series	
  
RNN	
  /	
  
Representa-on	
  
Sensor	
  
fusion	
  
Mul--­‐modal	
  
Feedback/Ac-on	
  
…	
  
Libraries	
Plug-in Plug-in
UDF
UDF
DIMo provides various libraries that
use machine learning to support
complex data processing flow.
UDS
SensorBeeその他の特徴
l  Go製
–  今は全部static  linkだけど設定ファイル+buildコマンドでカバー
–  Goのpluginパッケージ的なのができたら活⽤用の幅が広がる予定
l  Python連携のβ版あり
–  Chainer連携⽤用!社内稼働実績豊富
u  ただまだベストなinterfaceが分からないのでβ(v0)扱い
l  fluentd連携
–  トリビア:fluentd-‐‑‒forwarderはライブラリとしても使える
u  moriyoshiさん&stanakaさん++
l  Raspi,  Windowsサポート
17
CES  2016のデモ
18
実演
19
内容
l  英語のツイートに対して年年齢と性別のラベルを振る
l  そのうち⽇日本語ツイート版のチュートリアルも⽤用意する予定
–  今⽇日はひとまず英語をターゲットに・・・
20
システム構成
21
利用規約が非デザイナーに辛い	
github.com/ChimeraCoder/anacondaをベースにした
source plugin: github.com/sensorbee/twitter/plugin
今のところとりあえずSample APIから取得可能	
Extract&Transform担当
前処理&特徴抽出&機械学習	
Load担当
もちろんElasticsearch以外にもLoadできる
全文検索&データ分析担当
最終的にここがないと話にならない
なにはともあれとりあえず動かしてみる
l  http://docs.sensorbee.io/en/latest/tutorial.html#using-‐‑‒machine-‐‑‒learning
–  詳しいドキュメントは全部ここに
l  go  get  github.com/sensorbee/tutorial/...
–  機械学習のモデル(30MBくらい)が⼊入っているのでちょっと時間がかかる
l  BQLは  
https://github.com/sensorbee/tutorial/blob/master/ml/config/twitter.bql
22
$ cd %GOPATH/src/github.com/sensorbee/tutorial/ml/config!
# 本当はディレクトリのコピーを作ってからの法外良いんだけど手抜きして・・・!
$ build_sensorbee!
$ ./sensorbee run –c sensorbee.yaml!
!
# 別のターミナルで!
$ ./sensorbee shell –t twitter!
Twitter>!
Twitter  API周り
l  Twitter  plugin  source:  https://github.com/sensorbee/twitter
23
CREATE SOURCE public_tweets TYPE twitter_public_stream!
WITH key_file = "api_key.yaml";!
!
CREATE STREAM en_tweets AS!
SELECT RSTREAM!
"sensorbee.tweets" AS tag, id_str AS id, lang, text,!
user.screen_name AS screen_name,!
user.description AS description!
FROM public_tweets [RANGE 1 TUPLES]!
WHERE lang = "en";	
Twitter Source English Tweets
Elasticsearch周り
l  デフォルトではlocalhostのin_̲forwardに向けて転送
l  fluentdからはelasticsearchプラグインでデータ投⼊入
24
CREATE SINK fluentd TYPE fluentd;!
!
INSERT INTO fluentd from labeled_tweets;!
labeled_tweets fluentd SInk…
機械学習周り
l  前回説明した機械学習の適⽤用⼿手順に沿って説明
25
復復習:機械学習を使うために必要な5ステップ
l  問題設定:バッチ/オンラインの教師あり学習による⽂文書分類
–  特定のライブラリやツールに依存しない⼀一般的な⼿手順を説明
1.  分類するラベル(カテゴリ)を決める
2.  分類対象のデータを集める
3.  教師データ(正解データ)を作成する
4.  学習する
5.  適⽤用する
26
1.  分類するラベル(カテゴリ)を決める
l  今回⽤用意したラベルは2種類
l  age
–  10-‐‑‒19
–  20-‐‑‒29
–  30-‐‑‒39
–  40-‐‑‒49
–  50<
l  gender
–  female
–  male
27
2.  分類対象のデータを集める
l  Sample  APIからデータを沢⼭山取ってきましょう
l  SensorBeeを使っても集められる
l  SensorBeeを起動したdirのraw_̲training_̲data.jsonlに貯まる
28
twitter> CREATE STREAM en_raw_tweets AS!
SELECT RSTREAM * FROM public_tweets [RANGE 1 TUPLES]!
WHERE lang = "en";!
twitter> CREATE SINK training_data TYPE file!
WITH path = "raw_training_data.jsonl";!
twitter> INSERT INTO training_data FROM en_raw_tweets;!
機械学習のチュートリアルを起動してからsensorbee shellで:
3.  教師データを作る
l  ⾒見見本(会場限定)
l  のようなJSONを1⾏行行1オブジェクトの形式で⽤用意
l  アノテーション(正解を付ける作業)は苦⾏行行ですので頑張りまし
ょう!!!!!
29
{
"age": "ラベル or 空",
"gender": "ラベル or 空",
… TwitterのAPIのレスポンス …
}
4.  学習する
l  学習のステップ
–  前処理理と特徴抽出  →  特徴ベクトルを作成
–  学習処理理
30
4.  学習する:前処理理
l  それっぽい前処理理を施す
31
CREATE STREAM preprocessed_tweets AS!
SELECT RSTREAM!
filter_stop_words( -- stop_wordsの処理!
nlp_split( -- スペースで単語分割、↓小文字化+記号除去!
nlp_to_lower(filter_punctuation_marks(text)),!
" ")) AS text_vector,!
filter_stop_words( -- descriptionにも同じ処理を適用!
nlp_split(!
nlp_to_lower(filter_punctuation_marks(description)),!
" ")) AS description_vector,!
*!
FROM en_tweets [RANGE 1 TUPLES];!
!
例: "I wanna eat sushi!! :(" -> ["i", "wanna", "eat", "sushi"]
4.  学習する:特徴ベクトル
l  単語の出現頻度度を重みとして利利⽤用
32
CREATE STREAM fv_tweets AS!
SELECT RSTREAM!
{!
"text": nlp_weight_tf(text_vector),!
"description": nlp_weight_tf(description_vector)!
} AS feature_vector,!
tag, id, screen_name, lang, text, description!
FROM preprocessed_tweets [RANGE 1 TUPLES];!
"feature_vector": {!
"text": {!
"word1": 2,!
"word2": 1,!
...!
},!
"description": {... 似たようなデータ ...}!
}!
4.  学習する:モデルの作成
l  チュートリアルの中で使っているアルゴリズム:  AROW
–  オンライン線形分類アルゴリズム
–  Jubatusのjubatus_̲coreの実装をGoに移植
l  モデルはBQLのUser-‐‑‒Defined  State(UDS)として実現
33
CREATE STREAM age_labeled_tweets AS!
SELECT RSTREAM * FROM fv_tweets [RANGE 1 TUPLES]!
WHERE age != "";!
!
CREATE STATE age_model TYPE jubaclassifier_arow!
WITH label_field = "age", regularization_weight = 0.001;!
CREATE SINK age_model_trainer TYPE uds WITH name = "age_model";!
INSERT INTO age_model_trainer FROM age_labeled_tweets;!
genderも同様
5.  適⽤用する
l  学習してできあがったモデルを利利⽤用して分類する
–  データ1つ1つをオンラインで分類していくことも可能
34
CREATE STREAM labeled_tweets AS!
SELECT RSTREAM!
juba_classified_label(!
jubaclassify("age_model", feature_vector)) AS age,!
juba_classified_label(!
jubaclassify("gender_model", feature_vector)) AS gender!
tag, id, screen_name, lang, text, description!
FROM fv_tweets [RANGE 1 TUPLES];!
jubaclassify("age_model", feature_vector)	
{!
"male": maleラベルのスコア,!
"female": femaleラベルのスコア!
}
その他
l  機械学習のチュートリアルにより詳しい情報が!
–  http://docs.sensorbee.io/en/latest/tutorial.html#using-‐‑‒machine-‐‑‒learning
l  BQLはこちら
–  https://github.com/sensorbee/tutorial/blob/master/ml/config/twitter.bql
35
まとめ
36
まとめ
l  機械学習を利利⽤用すると検索索の幅が広がる
–  ⽣生データからはそのままでは分からない情報を取得する
–  ナビゲーションや集計の軸を増やす
l  SensorBeeを使うとストリームデータに機械学習を適⽤用できる
–  その結果をElasticsearchやデータベースに⼊入れられる
u  fluentdのおかげでね!
l  時代はJSON  compatibility
–  BQLはJSONをネイティブに扱えるSQL-‐‑‒likeな⾔言語
–  CouchbaseもN1QLと⾔言うJSON向けのSQL-‐‑‒likeな⾔言語をサポート!
37
是⾮非使ってみてください!(スター付けてくださいw
38
https://github.com/sensorbee
http://sensorbee.io/
We're  Hiring!!
l  Deep  Learning系
–  ビジョン、⾳音声、時系列列データ、強化学習
l  データベース/ストリーム処理理系
–  ストリーム処理理のデファクトを⾃自分で切切り開きたい⼈人
–  エキスパートが少ないので⾃自分がエキスパートになるしかない
–  ないものは⾃自分で作るしかない・・・!
39
Copyright  ©  2014-‐‑‒2016
Preferred  Networks  All  Right  Reserved.

Elasticsearchと機械学習を実際に連携させる