Deep Karmaning

技術系の話から日常のことまで色々と書きます

多腕バンディットアルゴリズムを改めて理解するためにGo+Vueでwebアプリを作ってみた

多腕バンディットアルゴリズムを改めて理解するためにGo+Vueでwebアプリを作ってみました。

github.com

任意の確率を設定し、アルゴリズムに選択肢を選ばせ続けると、次第に確率の高い選択肢を選びやすくなるようになっていくことが理解できると思います。

多腕バンディットに関して

多腕バンディットアルゴリズムに関しては、ネット上に様々なわかりやすい記事があるため深く触れませんが、 端的にいうと当たり外れがある複数の選択肢を、複数回選ぶことができる状態で、なるべくあたりが多く引けるように選択肢を選ぶようなアルゴリズムです。

参考になる記事は以下でしょうか。

techlife.cookpad.com

blog.albert2005.co.jp

多腕バンディットのアルゴリズムには複数のタイプが有りますが、今回実装したのはε-greedyです*1

ε-greedy方策は設定した確率によって探索と活用を使い分けるシンプルなアルゴリズムです。

ここでいう探索というのはこれまでの試行を無視してランダムに選択肢を選ぶことで、一方活用はこれまでの試行結果から一番当たりが出やすそうなものを選択するという意思決定を指します。

実装に関して

サーバー側はGoで実装していて、画面はVue.jsを使っています。

Goに関しては標準のライブラリのみで実装しています。

Vueに関しては必要な部分だけ調べながら動けばいいやと実装したので、あまり良い書き方になっていないと思います。

使い方

インストールは以下のコマンドを実行。

git clone https://github.com/RottenFruits/go_bandit.git

dockerで環境を作っているので、dockerイメージをビルドします。

cd go_bandit
docker build -t go_bandit -f Dockerfile/Dockerfile .

コンテナを立ち上げてログインします。

docker run -p 8080:8080 -it --name go_bandit go_bandit /bin/bash

コンテナ内でアプリを立ち上げます。

cd src/go_bandit
go run *.go

サーバーにアクセスします。

http://localhost:8080/

以下のような画面が出ると思いますので、適当にパラメータを入力してください。

f:id:rf00:20190118090501p:plain

パラメータ、画面上の表記、ボタン等に関しては以下のような意味を持ちます。

  • prob:当たりの確率、0~1で指定
  • selected counts:選択された回数
  • reward counts:当たりの回数
  • values:アルゴリズムが活用時の選択に使っている当たりの出やすさの値
  • Trials:試行総回数
  • Cumulative Rewards:総当たり数
  • Number of arms:アームの数
  • Epsilon:探索の確率、0~1で指定
  • Start:一回だけアルゴリズムを回す
  • Clear:カウントと履歴をクリアする
  • Auto Mode:チェックを入れるとStart ボタンがAutoに変わりボタンを押すと自動でアルゴリズムを回す、Stopボタンで停止

Startボタンを押すと一回だけアルゴリズムを回すことができ、宝箱が開きますが金貨が入っていたら当たりで、モンスターだと外れになります。

f:id:rf00:20190118091409p:plainf:id:rf00:20190118091432p:plain
左:当たり/ 右:外れ

何度も繰り返したり、自動実行で回しているとEpsilonの値にもよりますが、段々と当たりやすい宝箱を開けるようになっていくことが理解できると思います。

まとめ

今回はGoとVueを使って多腕バンディットアルゴリズムを理解するためにwebアプリを実装してみました。

今後は選択のアルゴリズムを増やしたりといったこともできたらと考えています。

*1:今後複数のアルゴリズムを選択できるように拡張しようかなと思ってはいます