カテゴリー別アーカイブ: 未分類

機械学習系コンペの意義

参加者にとっての意義

  • 機械学習のスキルアップ
    特徴量作成、モデリング、可視化など
  • エンジニアリング技術のスキルアップ
    コードの構造化、awsの利用など
  • スキルの客観的評価
  • 賞金
    モチベーションや質を担保する要因の一つだが、賞金自体は割に合わないでしょう
  • 楽しさ
    価値があるから楽しい、楽しいから高いレベルの人が集まって価値がある、の循環

参加者のつらみ

  • かなりの体力と精神力を費やすことになる(週8時間で良い順位をとるのは厳しい)
  • 精度が出ない、順位が上がらない
  • 頑張ってもkaggle master連合軍や500 model stackingに負けるとつらい
  • leakなど、あまり意味のないソリューションを頑張んなきゃいけないことがある

スポンサーにとっての意義

  • リクルーティング
  • 宣伝効果
  • 良い知見やソリューションの獲得
    • モデリング
    • データに関する知見、良い特徴量
    • 可視化手法

良い知見やソリューションを獲得できるかは分の良くない賭けである気がする(後述)

そのほかの意義

  • 効果的でわかりやすいツールや手法を広める役割
    xgboost, stacking, keras, t-sne など

データセットとソリューション

  • 機械学習系コンペは問題設定が難しいように思う
  • 理想は実務に役立つ、知られざる知見を得ることだが、そんなものが都合よくあるとは限らない
  • 印象に残っているソリューションはTaxi Trajectory PredictionNOAA Right Whale Recognition。これらは実際に役に立ちそう。
  • 一方で入賞者のソリューションが何の役にも立たなそうなコンペもある
  • 純粋に技術を競うのなら、人工的なデータセットを作ってそれの”謎を解く”方がよいのかもしれない。ただ、それでは機械学習の実世界との関わり感が失われてしまう

train/test split、データ量

  • trainとtestが均一なsplitでデータ量が十分にある場合、評価指標にもよるが、多数のモデルによるstacking競争になる可能性がある。ただ、ひたすらcross validation scoreを高めることに注力できるので、スキルアップには良い。
  • trainとtestが均一でない場合(時系列データやtrain/test splitが何らかのグループで分かれている場合)は、stacking競争になりにくいが、train/testの違いを考察したり、LBに投げてみて良いスコアを探すなどが必要なケースがある。下手すると運ゲーになることもある。

どんなコンペがやりたいか?

個人的に一番楽しそうなのは強化学習を用いたAIの対戦ゲーム。
codingameはローカルで流せないようなのと、UIがちょっと見た目重視過ぎる気がするのがいまいち。
code vsが求められている?

CartPoleをやってみる

openAI gymのCartPoleを強化学習で解いてみました。
https://gist.github.com/threecourse/3b428c70c8fad43472affc6ede0b4e9f

  • 以下の記事を元に、まずはcartpoleから始めて見ました。理論的な解説はそちらをご参照下さい。
    https://elix-tech.github.io/ja/2016/06/29/dqn-ja.html
  • 理解しようと思ってリファクタリングした。TensorFlowの書き方が良くわからなかったので結局全部kerasで書いた(書けた)
  • kerasのactionごとのq_valueを統合するところで苦労した。2次元だとmerge(mode=”dot”)が効かないらしく、merge(mode=”mul”)からのsumでどうにかした。
  • CartPoleといえども適当にやると上手くいかない。
  • いろいろ間違ってるかもしれません。

AlphaGoのお勉強

http://www.slideshare.net/yuk1yoshida/alphago-61311712
は大変分かりやすいスライドなのですが、AlphaGoがなぜそういう設計になっているのかわからなかったので原文を読んでみました。
(スライド中のvk.comから取っていいのかな・・?)
以下は自分の解釈ですが、上記スライドをかなり参考にしています。

学習しておく関数

a. ポリシー関数

P(a|s) = 盤面sにおいて手aを打つべき確率

a-1. rollout policy(p-pai)

  • 線形softmax、高速
  • 人間による8M盤面より学習
  • rollout時の確率として使用

a-2. tree policy(p-tau)

  • 線形softmax、高速
  • rollout policyより特徴量が多い
  • 人間による8M盤面より学習(?)
  • 木の展開時にpolicy networkが計算されるまでの仮値として使用

a-3. policy network(p-sigma)

  • neural network、高精度
  • 人間による28.4M盤面より学習
  • 木の展開時の事前確率として使用(探索時の優先順位に影響)

b. バリュー関数

V(s) = 盤面sの評価値(-1~1)

b-1. value network(v-theta)

  • neural network
  • 盤面の評価値
  • 生成された30M盤面より学習

memo

  • なぜrollout policyとtree policyを分けるのかは良くわからない。
  • 強化学習においてp-rhoを学習するが、それはvalue networkの学習に用いるだけで対戦には使用しない。
    p-paiの方が多様性が高くモンテカルロ探索には良いとのこと。
  • value networkの学習では、同じ局から盤面をとってきてしまうとover fittingしてしまうので、それぞれ別の局から盤面をとってきている。

MCTS(Monte Carlo tree search) のアルゴリズム

ルートノードおよび合法手をエッジとする木から開始する

  • エッジは事前確率・value network計算回数・rollout計算回数・value newwork評価値の積算・rollout結果の積算を保持する
  • 事前確率はpolicy networkをセットする

各スレッドは以下のように探索する

  • 1 ルートノードからQ+uの大きいものを選び木を下ってリーフ(エッジがまだ展開されていないノード)まで到達する
    • Qはvalue networkの値とrollout結果の平均
    • uは事前確率と探索回数による、探索を広く行うための項
  • 2-1 リーフ到達時に、まだ評価されていない場合はvalue networkの評価を依頼する
    • value network終了時に評価を伝播させる
  • 2-2 リーフ到達時に、ロールアウトを行う
    • ロールアウト終了時に評価を伝播させる
    • rollout中は一時的に評価を下げておき、他のスレッドから探索されづらくする
  • 3 あるエッジのrollout回数が閾値(=40)を超えた場合、その直下のリーフを展開する
    • 事前確率はtree policyを仮にセットし、policy networkの計算が終わったら置き換える
    • policy networkの値をsoftmax temperatureで調整し、メリハリを強くしている

最終的に、rollout回数の最も多い手を選択する

  • 評価値の最も高い手より外れ値に頑強

memo

  • CPUのスレッドの他、value network用のGPUのキュー、policy network用のGPUのキューがあり(?) 、非同期に評価が行われる
  • value networkの評価の順序は良くわかりませんが、きっとうまく評価の高そうな順に行うようになっているのでしょう。
  • policy networkの評価が追いつくように、リーフ展開の閾値を動的に調整する
  • 評価の伝播は単純に勝敗・評価値・探索回数をルートノードまでさかのぼって加える。
    探索確率はpolicy network/Value Network/rollout結果によるため、評価値はそれなりに良い手の加重平均となる。
    評価値のmaxをとるわけではないのが面白いところで、囲碁を確率論的なものとしてとらえているように思える。
  • 評価が非同期に更新されていくので、良い感じに探索するパスが分散される

感想

  • neural networkや強化学習が重要な役割を果たしているのは確かだが、
    特徴量からの線形softmaxやモンテカルロ木も同じくらい重要そう。
  • 論文を元に実装しようとしているgithubもあるようです。
    https://github.com/Rochester-NRT/RocAlphaGo

ぼく、kaggleで優勝したよ

kaggleのwalmart recruiting IIで優勝しました。
https://www.kaggle.com/c/walmart-recruiting-sales-in-stormy-weather/leaderboard

手法はフォーラムに投稿しました。
https://www.kaggle.com/c/walmart-recruiting-sales-in-stormy-weather/forums/t/14452/first-place-entry
Otto(http://www.slideshare.net/nishio/kaggle-otto)にくらべればだいぶしょぼいですが、優勝は優勝?

Unityで競馬ゲームを作ってみる

競馬ゲーム(のレース画面のみ)を作ってみました。
レースを眺めているのはそこそこ面白いと思います。
できる操作は、スペースキーで新たなレースを始めるだけです。
http://threeprogramming.lolipop.jp/unity/horseracegame/releaseWeb.html

雑感

  • 絵が描けない人にとっては、2Dゲームよりも3Dゲームの方がそれっぽいAssetを探しやすいかも
  • 馬・騎手のモデルのみ有料Assetを使っています。(Horse Rider – Jockey)
  • Monobehaviorを継承したクラスを描画処理回りに使って、通常のC#クラスをロジックに使うと分かりやすいかも
  • 今後ちゃんとしたゲームとして仕上げるかは未定