SlideShare a Scribd company logo
機械学習を利利⽤用した
ちょっとリッチな検索索
Preferred  Networks,  Inc.
2016/01/07
⾃自⼰己紹介
l  久保⽥田展⾏行行(@nobu_̲k)
–  CTO@Preferred  Networks,  Inc.  (PFN)
u  US勤務  (Preferred  Networks  America,  Inc.  San  Mateo)
l  専⾨門
–  検索索エンジン(作る⽅方の⼈人)、データベース、分散システム
l  趣味
–  ⾳音ゲー:beatmania  IIDX  SP/DP皆伝、右⽚片⼿手九段
2
今⽇日のテーマ
l  機械学習を利利⽤用して検索索をリッチにする
–  検索索対象の情報を機械学習によって増やす
–  検索索エンジンの集計機能を活かして検索索をリッチにする
l  検索索エンジンはそのままでOK!
–  検索索エンジンの外側で機械学習を適⽤用し、結果を利利⽤用
3
機械学習 Elasticsearchデータソース
データをElasticsearchに入れる前に
機械学習を適用し、データをリッチにする
全⽂文検索索+機械学習のユースケース(1)
4
l  年年齢
–  5段階+ボット
l  性別
–  男⼥女女+ボット
l  職業
l  地域
–  今いる場所
l  情報を提供して
いないユーザの
個⼈人情報を機械
学習で推定(怖い
全⽂文検索索+機械学習のユースケース(2)
l  どの企業について
つぶやいているか
l  年年齢・性別
l  ポジネガ
l  ユーザの地域
l  +固有表現抽出
–  ⼈人名
–  地名
5
全⽂文検索索+機械学習のユースケース(3)
l  VOC向け
l  商品種別の分類
l  既存情報
–  事故内容
–  傷病内容
–  デモグラ
l  コールセンターの
対応内容の情報を、
オペレータの負担
なく増やす
6
やっていることまとめ
l  機械学習によって検索索対象の情報を増やす
–  ⽣生データからそのままでは分からない情報を得る
l  増えた情報を検索索エンジンで活⽤用する
–  ナビゲーションの軸にする
–  全⽂文検索索と組み合わせてキーワード毎に集計・可視化する
7
改めて:今⽇日のゴール
l  機械学習とはどういうものなのか知る
l  機械学習を使うときに必要な⼯工程を知る
l  機械学習も"ツール"として⾒見見れば(試すだけならw)難しくない!
8
機械学習とは
9
機械学習とは
l  経験(データ)によって賢くなるアルゴリズムの研究
–  データから知識識や⼈人間が定義するようなルールを⾃自動的に獲得する
–  ⼈人⼯工知能(AI)の分野の⼀一つ
10
学習データ
今⽇日扱う機械学習の問題設定:⽂文書分類
l  教師あり学習の⼀一種
–  ⼈人が正解を教え、機械学習のアルゴリズムがそれを元に学習する
l  よくあるタスク
–  新聞記事やブログ記事のカテゴリ推定
l  先ほどのデモでの活⽤用例例
–  年年齢や性別をラベルとして分類
u  年年齢分類、性別分類などを独⽴立立したタスクとして解いている
‒  注:年年齢を"回帰"として推定することも可能だが、今⽇日は説明しない
11
補⾜足:機械学習を使うべきタイミング
l  記事のカテゴリくらいだったら⼈人が付けても良良いんじゃ?
l  機械学習が有効に機能する状況
–  対  ⼈人間
u  分類対象が多すぎる
u  分類対象が複雑すぎる
–  対  ルール
u  分類対象が複雑すぎる・ルールを⾔言語化できない
u  時間とともにルールが変わる
‒  例例:スイカ(1999年年までは⾷食べ物、それ以降降はSuicaも)
‒  正解は変わらない(記事が⾷食べ物関連か、鉄道関連かは不不変)
12
機械学習の"使い⽅方"
道具としての
13
機械学習を使うために必要な5ステップ
l  問題設定:バッチ/オンラインの教師あり学習による⽂文書分類
–  特定のライブラリやツールに依存しない⼀一般的な⼿手順を説明
1.  分類するラベル(カテゴリ)を決める
2.  分類対象のデータを集める
3.  教師データ(正解データ)を作成する
4.  学習する
5.  適⽤用する
14
1.  分類するラベル(カテゴリ)を決める
l  まずは1つのタスクに関してラベルを考える
–  例例:年年齢→  "-‐‑‒19",  "20-‐‑‒29",  "30-‐‑‒39",  "40-‐‑‒49",  "50-‐‑‒",  "ボット"
l  ラベルを考えるときのポイント
–  MECE:  Mutually  Exclusive  and  Collectively  Exhaustive
u  注:マルチラベル分類だと話が少し変わるが今⽇日はスキップ
–  論論理理的に分類する意味があるラベルを定義する
u  全然関係のないラベルをごちゃ混ぜにしない
‒  ⼀一度度に多くの事をせずに、別のタスクとして分離離する
15
2.  分類対象のデータを集める
l  ⾃自分がどういう分類をしたいのか把握し、網羅羅的にデータを集める
16
-19のツイート	
 20-29	
 …	
 50-	
 ボット	
Point 1: 全部のラベルを網羅する
…	
データを観測していないラベルには分類できない。
2.  分類対象のデータを集める
l  ⾃自分がどういう分類をしたいのか把握し、網羅羅的にデータを集める
17
-19のツイート	
 20-29	
 …	
 50-	
 ボット	
Point 1: 全部のラベルを網羅する
Point 2: ラベル毎のデータ数の偏りを少なくする
…	
"50-"の人のツイートが少なすぎるかも?
極端な例だと、男女分類で男女のデータが9:1の
割合だとしたら全部"男"と分類すれば精度9割。
この段階だと正確な偏りは分からないので、後述の
アノテーションが済んだタイミングで調整する。
2.  分類対象のデータを集める
l  ⾃自分がどういう分類をしたいのか把握し、網羅羅的にデータを集める
18
-19のツイート	
 20-29	
 …	
 50-	
 ボット	
Point 1: 全部のラベルを網羅する
Point 2: ラベル毎のデータ数の偏りを少なくする
…	
Point 3: (自然言語の場合は)できる限り多くの語彙をカバーする
レアな単語は分類に有効(tf-idfのようなイメージ)。
観測してない単語は未知語として扱われるので、
多くの単語をカバーできると良い。
2.  分類対象のデータを集める
l  ⾃自分がどういう分類をしたいのか把握し、網羅羅的にデータを集める
19
-19のツイート	
 20-29	
 …	
 50-	
 ボット	
Point 1: 全部のラベルを網羅する
Point 2: ラベル毎のデータ数の偏りを少なくする
…	
Point 3: (自然言語の場合は)できる限り多くの語彙をカバーする
Point 4: とりあえず大量に集める!
Point 1〜3もある程度集めてみないと分からないので、とりあえず大量に集める。
3.  教師データを作る
l  データを前処理理する(1つあたりの量量を調整するなど)
–  例例:ツイートだと、タスクによっては1個1個が短すぎる事がある
u  直近のツイートを何個か結合するなどで対処
l  正解が分かるデータに対してラベル付け(アノテーション)を⾏行行う
–  この段階ではデータの形は割とどういう⾵風でもOK
u  元のデータと正解がペアになって管理理されていることが重要
20
JSON:
{
"label": "20-29",
"tweet": {生のデータ}
}	
CSV 1:
20-29,"{CSVで正しくエスケープされたtweetのJSON}"	
CSV 2:
20-29,ユーザ名,テキスト,…その他必要なフィールド…
3.  教師データを作る:アノテーションの効率率率化(1)
l  ルールベースで正解データを集める
–  例例:19xx年年⽣生まれ,  xx歳,  ⼤大学x年年
u  最後に⼈人⼿手でスクリーニング
‒  注意:  "永遠の17歳",  "○○さんじゅうななさい"
u  もちろん変なバイアスがかかる可能性もあるが・・・
l  Elasticsearchでやるのもアリ!
21
3.  教師データを作る:アノテーションの効率率率化(2)
l  アノテーションツールを使う
–  アノテーションを付けていくとだんだん賢くなる
u  有⼒力力候補や各ラベルの確度度を表⽰示
22
参考画像:Preferred InfrastructureのSedue Predictor
4.  学習する
l  ツールやライブラリによって使い⽅方は異異なる
–  ⼀一般には「特徴ベクトル(feature  vector)」とラベルのペアを⼊入⼒力力する
23
データ
モデル
分類に必要な情報を持つ
機械学習
アルゴリズム
…	
ラベル
FV
…	
ラベル
例例: libsvmの⼊入⼒力力フォーマット
<label> <特徴1>:<重み1> <特徴2>:<重み2> …
<label> <特徴1>:<重み1> <特徴2>:<重み2> …
1⾏行行1データ。疎ベクトル。
4.  学習する:特徴抽出
l  ⽣生のデータを機械学習のアルゴリズムが扱える情報に変える
–  意味のある情報だけを抜き取って特徴(素性)のベクトル(列列)を作る
–  ⾃自然⾔言語の場合はbag-‐‑‒of-‐‑‒wordsと⾔言うものを⽤用いることが多い
–  特徴:  形態素、n-‐‑‒gram、etc
–  重み:  出現頻度度(tf)、tf-‐‑‒idf、log  tf、0/1(1回以上出現したら1)、etc
l  Jubatusだと設定に書いておけば特徴抽出もセットで⾯面倒を⾒見見てくれる
–  クライアントからは⽣生データをそのまま投げる感じ
24
{
"特徴1": 重み1,
"特徴2": 重み2,
…
}
例: {
"今日": 2,
"です": 9,
…
}
例: libsvm形式
# 今日=>1、です=>2とした上で
labelHoge 1:2 2:9 …
5.  適⽤用する
l  学習してできあがったモデルを利利⽤用して分類する
–  データ1つ1つをオンラインで分類していくことも可能
25
データ ラベルFV
機械学習
アルゴリズム
モデル
学習時と全く同じ
方法で特徴抽出	
分類時にはデータ
のみを入力し、ラベルは
入力しない。
推定されたラベルが
返ってくる。
実際に機械学習を
Elasticsearchと連携するには
26
選択肢1:  オフラインで適⽤用してからElasticsearchに投⼊入
l  RやPythonなど好きなものを使って機械学習を適⽤用する
l  その後、情報が増えたデータをElasticsearchに投⼊入
27
選択肢2:Jubatusを使う
l  fluentdのexec  filterからJubatusを叩いてオンラインで適⽤用
l  課題
–  1分類1リクエスト(RPC):通信のレイテンシが毎回かかる
–  1プロセス1モデル:モデルの数だけプロセスとポート番号が必要
28
out_exec_filter… … Elasticsearch…
fluentd	
JSONのフィールドに"age"や
"gender"などを増やす。
選択肢3:PFNがもうすぐ公開するツールを利利⽤用する・・・!
l  近々OSSとして公開予定
l  特徴
–  SQL(CQL)っぽい⾔言語
u  特徴抽出/機械学習をUDF+UDS(User  Defined  State)で提供
–  ストリームデータを低レイテンシで処理理
–  fluentd連携
–  Go製
l  Chainerもサポート!
–  ストリームデータにDeep  Learningを適⽤用
–  ChainerはNLP向けの機能を強化中
29
まとめ
30
まとめ
l  機械学習を利利⽤用すると検索索の幅が広がる
–  ⽣生データからはそのままでは分からない情報を取得する
–  ナビゲーションや集計の軸を増やす
l  機械学習をツールとして使う
–  分類では:ラベル定義、データ収集、教師データ作成、学習、適⽤用
l  今⽇日できていない話
–  精度度評価、チューニング、特徴抽出の詳細
u  ここからが本当の地獄だ・・・
–  分類以外の機械学習
–  実際のアプリケーションやシステム構築・運⽤用の詳細
31
宣伝
32
Copyright  ©  2014-‐‑‒
Preferred  Networks  All  Right  Reserved.

More Related Content

機械学習を利用したちょっとリッチな検索