jubabanditの紹介
NTTソフトウェアイノベーションセンタ
宇田川 拓郎
Copyright©2016 NTT corp. All Rights Reserved.
1
今日の話
• jubabanditとMulti-Armed Bandit問題について
• jubabanditの使い方について
• jubabanditを使ってみたデモの紹介
Copyright©2016 NTT corp. All Rights Reserved.
2
jubabanditとは
• Jubatus 0.7.0で実装された、Multi-Armed
Bandit (多腕バンディット) 問題のための機能
※Multi-Armed Bandit問題
• 報酬が未知である複数の選択肢から1つ選ぶ試行を
繰り返す過程において、得られる報酬を最大化する
問題
• 報酬のフィードバックを得ながらオンラインで最適
化
Copyright©2016 NTT corp. All Rights Reserved.
3
Multi-Armed Bandit問題の例
例)報酬の期待値がわからない3台のスロットマシンがあり、これらを100
回プレイするときに得られる報酬を最大にするには?
どの台をどうやって選ぶのが得なのだろうか・・・?
player : armを選ぶ人
arm: 各選択肢
A B C
Copyright©2016 NTT corp. All Rights Reserved.
4
Multi-Armed Bandit問題の例
• 真の期待値がわかれば最大のものを選び続けるのが良い
例)報酬の期待値がわからない3台のスロットマシンがあり、これらを100
回プレイするときに得られる報酬を最大にするには?
真の期待値 1.2 0.5 0.1
A一択が最強。100 x 1.2 で120もらえるはず
A B C
Copyright©2016 NTT corp. All Rights Reserved.
5
Multi-Armed Bandit問題の例
• 実際には報酬を観測しながら期待値を推測する
例)報酬の期待値がわからない3台のスロットマシンがあり、これらを100
回プレイするときに得られる報酬を最大にするには?
真の期待値 ? ? ?
1回回してみた 0/1 = 0.0 0/1 = 0.0 10/1 = 10
+10+0+0
A B C
Copyright©2016 NTT corp. All Rights Reserved.
Cがいいんじゃないか?
6
例)報酬の期待値がわからない3台のスロットマシンがあり、これらを100
回プレイするときに得られる報酬を最大にするには?
真の期待値 ? ? ?
1回回してみた 0/1 = 0.0 0/1 = 0.0 10/1 = 10
2回回してみた 5/2 = 2.5 5/2 = 2.5 10/2 = 5
+5 +5 +0
• 実際には報酬を観測しながら期待値を推測する
Multi-Armed Bandit問題の例
A B C
Copyright©2016 NTT corp. All Rights Reserved.
Cがいいんじゃないか?
7
例)報酬の期待値がわからない3台のスロットマシンがあり、これらを100
回プレイするときに得られる報酬を最大にするには?
真の期待値 ? ? ?
1回回してみた 0/1 = 0.0 0/1 = 0.0 10/1 = 10
2回回してみた 5/2 = 2.5 5/2 = 2.5 10/2 = 5
3回回してみた 15/3 = 5.0 5/3 = 1.666... 10/3 = 3.333...
やっぱりAのほうがいいかも?
Aを選び続ける? 他のももっと試す?
+10 +0 +0
• 実際には報酬を観測しながら期待値を推測する
Multi-Armed Bandit問題の例
A B C
Copyright©2016 NTT corp. All Rights Reserved.
8
Multi-Armed Bandit問題とは
• 知識の”活用(exploit)”と”探索(explore)”のトレード
オフを解決する問題
• 探索 => 選択肢の知識を増やす試み
• 活用 => これまでの知識を基に最良の選択をする
知識の活用
今のところAが一番出てるから
Aを引こう
知識の探索
Aより良い台があるかもしれないから、
他の台も試してみよう
Copyright©2016 NTT corp. All Rights Reserved.
9
• 知識の”活用(exploit)”と”探索(explore)”のトレード
オフを解決する問題
• 活用が強すぎると・・・
(1回目の施行後Cを回し続ける)
• 探索が強すぎると・・・
(全部の台を均等に回す)
結局最初に当たった
10しか出なかった…
60くらい出たけど、
もっと出たはずでは・・・?
良くない選択肢を選び続けてし
まうことがある
本来得られるはずの報酬を逃
してしまう
Multi-Armed Bandit問題とは
活用と探索を”ほどよく”実
施して、報酬をなるべく多
く手に入れるのが重要
Copyright©2016 NTT corp. All Rights Reserved.
10
Multi-Armed Banditの応用先
• 広告配信
– いろんな広告を試してみたいけど、効果の薄いもの
はCTRが下がるのであまり出したくない
• 臨床試験
– 効果がわかってない新薬を試すか、安定している薬
を使うか
• ウェブサイトデザインの最適化
– いろんなデザインを試してみたいけど、イマイチな
ものはあまり出したくない
Copyright©2016 NTT corp. All Rights Reserved.
11
jubabanditの特徴
• 5種類のアルゴリズムが利用可能
• epsilon-greedy
• softmax
• ucb1
• exp3
• Thompson sampling (0.9.0から)
• playerごとに選択回数や報酬を管理
• パーソナライズした最適化も可能
• 選択肢の種類は全player共通
• APIから動的な追加・削除が可能
Copyright©2016 NTT corp. All Rights Reserved.
12
確率εで全ての選択肢からランダムに選ぶ(探索)
確率1-εで現在最も期待値の高い選択肢を選ぶ(活用)
(参考) epsilon-greedy
1-ε
ε
最も期待値の高
い選択肢
全ての選択肢から
ランダム
Copyright©2016 NTT corp. All Rights Reserved.
13
jubabanditの使い方
• 設定ファイルの書き方
• APIと動作イメージ
Copyright©2016 NTT corp. All Rights Reserved.
14
設定ファイル
• 使うアルゴリズムをmethodに指定
• アルゴリズムごとのパラメータを指定
• assume_unrewarded オプションを指定
①アルゴリズムの指定
(前述の5つのアルゴリズムから1つを選ぶ)
②epsilon_greedyの場合は、epsilonパ
ラメータを設定
③assume_unrewardedオプション
を指定(true/false)
{
"method": "epsilon_greedy",
"parameter": {
"epsilon" : 0.1
"assume_unrewarded" : false,
}
}
①
②
③
Copyright©2016 NTT corp. All Rights Reserved.
15
assume_unrewarded option
• armの選択回数を更新するタイミングを調整す
るオプション
• true => Armが選択された時にそのArmの選択回数
を1増やす
• false => Armに報酬が登録されるときにそのArmの
選択回数を1増やす
• 選択から報酬の登録までに時間差がある場合に
便利
Copyright©2016 NTT corp. All Rights Reserved.
16
クライアントAPI
• 主に使うのは以下の3つ
• register_arm(arm_id)
• 選択肢をJubabanditサーバーに追加する
• select_arm(player_id)
• player_idのarmを選ぶ
• register_reward(player_id, arm_id reward)
• player_idのarm_idにrewardの報酬を登録する
Copyright©2016 NTT corp. All Rights Reserved.
17
jubabandit 動作イメージ
jubabandit
client
A
register_arm(“A”)
register_armによって
選択肢が追加される
Copyright©2016 NTT corp. All Rights Reserved.
18
jubabandit 動作イメージ
jubabandit
client
A B C
register_arm(“B”)
register_arm(“C”)
register_armによって
選択肢が追加される
Copyright©2016 NTT corp. All Rights Reserved.
19
jubabandit 動作イメージ
jubabandit
client
select_arm(“hoge”)
player A B C
hoge 0, 0 0, 0 0, 0
playerは各腕の
(重み, 試行回数)を持つ
Copyright©2016 NTT corp. All Rights Reserved.
20
jubabandit 動作イメージ
jubabandit
client
select_arm(“hoge”)
A B C
hoge 0, 1 0, 0 0, 0
A
設定したアルゴリズムに応じて
腕を選択する
assume_unrewarded optionがtrue
ならselect_arm時に 試行回数+ 1
Copyright©2016 NTT corp. All Rights Reserved.
21
jubabandit 動作イメージ
jubabandit
client
register_reward(“hoge”,
“ A “,
10.0)
A B C
hoge 10.0, 1 0, 0 0, 0
報酬を受け取り重みを更新
assume_unrewarded optionがfalse
なら、この時試行回数を更新
Copyright©2016 NTT corp. All Rights Reserved.
22
jubabandit 動作イメージ
jubabandit
client
A B C
hoge 100, 50 40, 25 10, 10
fuga 20, 10 10, 10 150, 50
試行を繰り返して、playerごとに
学習していく
Copyright©2016 NTT corp. All Rights Reserved.
23
jubabanditを利用したデモの紹介
• ツイートを表示するシステム
• ユーザからのフィードバックをもらいながらツイー
トを表示するユーザを最適化する
• カテゴリの選択と、カテゴリ内でのユーザの選択の
2段階のjubabanditを利用して表示するtweetを選択
• クリックされたらそのカテゴリ・ユーザに
報酬を+1する
• githubで公開中
• http://github.com/TkrUdagawa/tweet_bandit/
※利用にはtwitterのアクセスキーが必要
Copyright©2016 NTT corp. All Rights Reserved.
24
デモ画面
Copyright©2016 NTT corp. All Rights Reserved.
25
デモシステムの構成
tornado
server
js
news,
popular,
IT
jubabandit
client
jubabandit
client
jubabandit
client
jubabandit
client
@nikkei
@Yomiuri_Online
@ariyoshihiroiki
@pamyurin
@jptechcrunch
@gizmodojapan
カテゴリ推薦用
Jubabandit server
ユーザ推薦用
Jubabandit server
Copyright©2016 NTT corp. All Rights Reserved.
26
jubabanditの使い方(select_arm)
① 表示するtwitterアカウントのカテゴリをjubabanditで選択
② カテゴリごとのjubabanditで、
表示するtwitterアカウントを選択
news
IT
…..
① どのカテゴリを
表示する?
② どのユーザを
表示する?
ユーザ推薦用
Jubabandit
カテゴリ推薦用
Jubabandit
news
Yomiuri_Online
IT 担当
news 担当
Copyright©2016 NTT corp. All Rights Reserved.
@jptechcrunch
@gizmodojapan
….
@nikkei
@Yomiuri_Online
…
27
jubabanditの使い方(register_reward)
① 表示されたツイートをユーザがクリック
② カテゴリ推薦用のjubabanditに報酬登録
③ ユーザ推薦用のjubabanditに報酬登録
IT
…..
② newsに+1
ユーザ推薦用
Jubabandit
カテゴリ推薦用
Jubabandit
IT 担当
news 担当
③ Yomiuri_Onlineに+1
① Yomiuri_Onlineの
ツイートをクリック
Copyright©2016 NTT corp. All Rights Reserved.
news
@jptechcrunch
@gizmodojapan
….
@nikkei
@Yomiuri_Online
…
28
まとめ
• Multi-Armed Bandit問題のための機能
jubabanditを紹介
• 知識の活用と探索のトレードオフを解決して、報酬
を最大化
• jubabanditを使ったデモを紹介
• ツイートの表示を学習
• コードを整理してjubatus-exampleに追加予定
http://github.com/TkrUdagawa/tweet_bandit/
Copyright©2016 NTT corp. All Rights Reserved.

jubabanditの紹介