ゲームAI備忘録

ゲームAIに使えそうな知識を備忘録として書き留める

人助けと思って何卒インストールをば! 詰碁/ アルコネ/ 五目並べ

GTX1080とTITAN Xの速度比較

GTX1080とTITAN Xでの速度を比較してみました.
TensorFlowのバージョンはどちらも0.8を利用しています.
ベンチマークとして利用したのは,MSRA開発のアルゴリズムResNetの32層版です.
TensorFlow版として以前に実装したResNet32層で速度を比較してみます.

git clone https://github.com/namakemono/cifar10-tensorflow.git
cd cifar10-tensorflow
sh ./install.sh
cd cifar10
python train.py --class_name Cifar10Classifier_ResNet32
Name examples/sec
GTX 1080 2400前後
TITAN X 1600前後
Mac 35前後

おおよそ1.5倍程度の速度で学習を行えることことが分かります.

References

  • [1]. He, Kaiming, et al. "Deep Residual Learning for Image Recognition." arXiv preprint arXiv:1512.03385 (2015).

ResNetアルゴリズムの論文

TensorFlowで作成したResNetが書かれているリポジトリ

Batch Normalization(バッチ正規化)

概要

何で必要なのか?

  • ニューラルネットワークは積和の積み重ねによって出力する仕組みになっている.
  • そのため正則化を行って重みの増減を防ぐ仕組みを作っても発散してしまう場合が存在するので,その問題を防ぐために必要.

アルゴリズム

  • ニューロンの出力を正規化して,拡大並行移動を行う調整パラメータγ,βを学習時に調整する.(c.f. [2])
given: γ, β, m(batch size)
μ: xのバッチでの平均
σ^2: xのバッチでの分散
ε: 微小な値(分散が小さい場合用の補正項.1e-8推奨)
x' = (x - μ) / √(σ^2 + ε)
y = γx' + β

References

[1]. Ioffe, Sergey, and Christian Szegedy. "Batch normalization: Accelerating deep network training by reducing internal covariate shift." arXiv preprint arXiv:1502.03167 (2015).
[2]. Frederik Kratzert. "Understanding the backward pass through Batch Normalization Layer", (2016).

Weight Decay(重み減衰)

効果

L1正則化
  • 各次元に対して重みが正ならλ, 負なら-λに重みを更新するようになっている.
  • つまり,予測する際に関係のない(関連性の低い)変数に対する重みが0に近づくようになっており,変数の絞込を行うことが可能.
  • 用途としては,DBを単にダンプしたデータから解析を行って欲しいなど,明らかに関係ない変数が大量に含まれている場合に効果を発揮しやすい.
L2正則化
  • 重みが大きいほど0に近づいていくよう重みを更新する働きがあり,重みの発散を緩和させる効果がある.
  • 多層ニューラルネットワークなどでは重みが発散しやすいので,よく使われている.

Momentum(移動平均)

確率的最急降下法について考えたとき,目的関数の曲率が大きくなると,ステップ幅(学習率)が大きくなりすぎて収束しづらくなる.
そのため,ステップ幅を抑えるために直近のMomentumを足し上げたのがMomentumSGD[1].

  • E(w): 損失関数(連続的微分可能.ReLUも考慮する必要があるので,本来は劣微分とか考える必要がある.)
  • t: 反復回数
  • ν ∈ [0, 1)
  • w_{t+1} = w_t + ∇E(w_t) + νΔw_{t-1}

ここで,Δw_{t-1} = w_{t-1} - w_{t-2}

Adam[2]とかもMomentumの仕組みが入っているので,反復回数が少なくなる傾向がある.

References

  • [1]. Rumelhart, David E., Geoffrey E. Hinton, and Ronald J. Williams. "Learning representations by back-propagating errors." Cognitive modeling 5.3 (1988): 1.
  • [2]. Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic optimization." arXiv preprint arXiv:1412.6980 (2014).

XgboostのFeature Imporanceをラベル付きで表示する方法

特定の変数や上位N件だけ表示など,plot_importance関数を使わずにFeature Importanceを表示する方法.

# plot_feature_importance_with_label.py
import operator
from sklearn.datasets import load_iris
import pandas as pd
import matplotlib.pyplot as plt
import xgboost as xgb

def create_feature_map(features):
    with open('xgb.fmap', 'w') as fp:
        for i, feat in enumerate(features):
            fp.write('%d\t%s\tq\n' % (i, feat))

def run():
    iris = load_iris()
    dtrain = xgb.DMatrix(data = iris.data, label=iris.target)
    params = {'objective': 'multi:softprob', 'num_class': len(iris.feature_names)}
    model = xgb.train(params, dtrain)
    create_feature_map([_.replace(" ", "") for _ in iris.feature_names])
    importance = model.get_fscore(fmap='xgb.fmap')
    importance = sorted(importance.items(), key=operator.itemgetter(1))
    df = pd.DataFrame(importance, columns=['feature', 'fscore'])
    df['fscore'] = df['fscore'] / df['fscore'].sum()
    plt.rcParams['font.size'] = 9
    df.plot(kind='barh', x='feature', y='fscore', legend=False)
    plt.title('XGBoost Feature Importance')
    plt.xlabel('relative importance')
    plt.show()

if __name__ == "__main__":
    run()

結果

$python plot_feature_importance_with_label.py 

f:id:namakemono_srm:20160506162257p:plain

$ cat xgb.fmap
0	sepallength(cm)	q
1	sepalwidth(cm)	q
2	petallength(cm)	q
3	petalwidth(cm)	q

TensorFlow 0.8でのセグフォの回避方法

TensorFlowのバージョンを0.8にしてから,import TensorFlowでセグフォが出るようになった.

$ python -c "import tensorflow"
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally
Segmentation fault (core dumped)

事前にnumpyをインポートすることで回避できる模様

$ python -c "import numpy, tensorflow"
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally

どうも,scipyあたりが悪さをしている模様

$ mv _scipy scipy
~/.local/lib/python2.7/site-packages$ mv scipy _scipy # 一旦scipyを別名に退避
~/.local/lib/python2.7/site-packages$ python -c "import tensorflow"
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:105] successfully opened CUDA library libcurand.so locally

Kaggleの過去問Predicting a Biological Responseに挑戦

概要

Stacked Generalizationと呼ばれる方法を利用しています.コードはこちらになります.
github.com

Stacked Generalizationについては,この方の資料がわかりやすいです.
stacked generalization - puyokwの日記

元の論文がこちらになります.
Stacked Generalization (Stacking)