Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

VM再起動の学習への影響

前回記事に記載のように、GCPの格安な「Preemptible VM Instance」を使って、独自機能付DRL(A3C+Pseudo-count+On-Highscore-Learning(OHL)の実験中です。具体的には、Montezuma's Revengeへの適用実験をしていますが、Preemptible VM InstanceによるVM再起動*1されることで、学習に影響が出る場合があることが分かりました。

下記がその例です。18M steps付近でScoreが0になり、その後回復していません。
f:id:Itsukara:20161016205153p:plain

上記学習曲線を見て、もしかしたら再起動の影響かと思いlogを確認したところ、まさに再起動の直後(options書かれた行)から平均スコアが0になっていました。

@@@ Average Episode score = 429.000000, s= 18072508,th=4
@@@ Average Episode score = 429.000000, s= 18072939,th=3
@@@ Average Episode score = 454.000000, s= 18073053,th=0
@@@ Average Episode score = 394.000000, s= 18075029,th=7
@@@ Average Episode score = 431.000000, s= 18081979,th=1
@@@ Average Episode score = 464.000000, s= 18122403,th=6
@@@ Average Episode score = 426.000000, s= 18123251,th=4
@@@ Data saved at global_t=18124378
******************** options ********************
@@@ Average Episode score = 0.000000, s= 18147470,th=6
@@@ Average Episode score = 9.090909, s= 18148303,th=7
@@@ Average Episode score = 0.000000, s= 18149718,th=0
@@@ Average Episode score = 0.000000, s= 18150715,th=5
@@@ Average Episode score = 0.000000, s= 18151139,th=4
@@@ Average Episode score = 9.090909, s= 18153728,th=3
@@@ Average Episode score = 0.000000, s= 18153986,th=2

それでは、他のVMはどうかと思い学習曲線を確認したところ、残り4 VMのうち1 VMだけに影響があり、他は影響が見られませんでした。下記がそれぞれの学習曲線です。先頭(GCP10)が22M steps付近で影響を受けているように見えます(後で詳細を説明)。他のVMも再起動されていますが、大きな影響は見られませんでした。

VM1 (GCP10)

f:id:Itsukara:20161016210352p:plain

VM2 (GCP20)

f:id:Itsukara:20161016210400p:plain

VM3 (GCP30)

f:id:Itsukara:20161016210411p:plain

VM4 (GCP40)

f:id:Itsukara:20161016210418p:plain

学習履歴長の影響?

ちなみに、今回、学習履歴長を1ずつ変えて5個のパラメーターで実験していますが、結果が大きく異なる事が分かりました(まだ途中ではありますが)。学習履歴長の影響もあるとは思いますが、OpenAI Gymが非決定的な要素を高めていることも大きな原因と思います。また、最初の部屋で鍵を取得した後で、右の部屋か左の部屋のいずれか一方のドアしか開けることができないので、これも影響していると思います。

GCP10への影響

下記が、GCP10の再起動近辺の平均スコアですが、学習中に平均スコアを出す頻度が少ないためか、影響は少ししか見えません。しかし、少なくとも、再起動の直後で平均スコアが下がっているのが分かると思います。

@@@ Average Episode score = 363.000000, s= 22522503,th=1
@@@ Average Episode score = 382.000000, s= 22525093,th=0
@@@ Average Episode score = 316.000000, s= 22528814,th=2
@@@ Average Episode score = 363.000000, s= 22530137,th=6
@@@ Average Episode score = 372.000000, s= 22530837,th=3
@@@ Average Episode score = 370.000000, s= 22533404,th=5
@@@ Average Episode score = 363.000000, s= 22533576,th=4
@@@ Average Episode score = 376.000000, s= 22545679,th=7
@@@ Data saved at global_t=22552836
******************** options ********************
@@@ Average Episode score = 218.181818, s= 22578132,th=4
@@@ Average Episode score = 254.545455, s= 22582983,th=1
@@@ Average Episode score = 127.272727, s= 22585359,th=3
@@@ Average Episode score = 290.909091, s= 22586639,th=0
@@@ Average Episode score = 327.272727, s= 22589803,th=6
@@@ Average Episode score = 245.454545, s= 22590432,th=7
@@@ Average Episode score = 227.272727, s= 22591742,th=5
@@@ Average Episode score = 263.636364, s= 22591992,th=2

再起動が影響する原因と対策について

Tensorflowの学習データは全データをsave/loadしていますが、Pseudo-countのデータはThread 0のデータをsaveして、再起動時はそのデータを全Threadで使いまわすようにしています。この影響が出ているのかもしれません。Thread間で同期してsave/loadするのが面倒なので手を抜いてしまいましたが、修正したほうが良いかもしれません。

ただ、今のところ、影響が出る可能性は40%なので、影響が出た場合は、少し前の学習データを元に学習を再開するという対策で対応予定です。

*1:正確には、Preemptible VMの仕様で24時間以内にVMが停止され、自作のプログラム片でVMを再起動しています