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倍程度の速度で学習を行えることことが分かります.
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(重み減衰)
効果
- 損失関数に正則化項を加え過学習を防ぐ
- qは正の定数(q=1のときL1正則化(Lasso正則化), q=2のときL2正則化(Ridge正則化)と呼ぶ)
- 単に重み減衰と書かれている場合はL2正則化を意味する.
- 正則化項にL1, L2両方を足す場合もある.
- ロジスティック回帰,ニューラルネットワーク,SVMなど幅広い箇所で出てくる.
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の仕組みが入っているので,反復回数が少なくなる傾向がある.
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
$ cat xgb.fmap 0 sepallength(cm) q 1 sepalwidth(cm) q 2 petallength(cm) q 3 petalwidth(cm) q
References
- Kaggle - XGB Feature Importance (Python), https://www.kaggle.com/mmueller/liberty-mutual-group-property-inspection-prediction/xgb-feature-importance-python/code
- GitHub - xgboost, https://github.com/dmlc/xgboost/blob/6750c8b74316cc41a74b9845951b4edc3f0f1b2d/python-package/xgboost/core.py
- Python XGBoost の変数重要度プロット / 可視化の実装 - StatsFragments
- Python XGBoost + pandas 連携の改善 - StatsFragments
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に挑戦
概要
- Kaggleの過去問Predicting a Biological Responseを解いた結果です.
- https://www.kaggle.com/c/bioresponse
- 38位, Log Loss: 0.38106 でした.
Stacked Generalizationと呼ばれる方法を利用しています.コードはこちらになります.
github.com
Stacked Generalizationについては,この方の資料がわかりやすいです.
stacked generalization - puyokwの日記
元の論文がこちらになります.
Stacked Generalization (Stacking)