2018-11-14(Wed)
前回(はじめてのpython&Tensorflowその13・強化学習苦戦中)の続き。
Actor-criticにしろ、DQNにしろ、なかなか自力でプログラム組むのはうまくいかなかったです。
DQNだと、わりとサンプルコードが多かったので、下記のサイトのコードをほぼパクらせていただきました。
https://qiita.com/yukiB/items/0a3faa759ca5561e12f8
そしたら、自分で組んだ時より学習がちょっとだけうまく進んだっぽいです。
今回の環境(報酬の決め方)
・上がったときに+1点のプラス報酬を与える
・手牌にない牌を切ろうとした場合、ペナルティとして、-0.002×(当該局のペナルティ回数)のマイナス報酬を与える(その巡目はツモ切り)
・(ペナルティではなかったときで、)14枚手牌と、1枚切った13枚手牌のシャンテン数が一致したとき(つまりシャンテン数を維持できたとき)、0.002×2^(6-シャンテン数)のプラス報酬を与える
報酬の決め方としては、
アガリが一番偉い(報酬が高い)>次いで聴牌に近い段階でシャンテンを維持できること>ペナルティを多く積み重ねないこと>>アガリに遠い段階のシャンテン数維持、少ないペナルティ回数、という感じで作りました。
ペナルティについては回数が多く積み重なるほど大きくマイナスされる(n^2のオーダー)設計にしてます。
シャンテン維持は指数オーダーなので、聴牌に近いとアガリには及ばないものの、かなり大きめの報酬が得られる。
少ペナルティやシャンテン数が大きい段階については多ペナルティやシャンテン数少と比較して報酬の多寡は極めて小さいレベルです。
とりあえず現段階(6000エピソード分)の学習成果がこちら↓。

1局目。
最初のうちは孤立牌から切っていってる。孤立字牌からでないのがなんとも。
終盤に入って手牌が入り組んでくると、手牌にない牌がQ値が一番高いとニューラルネットが指定してくる。
一向聴で流局。

2局目。
これも孤立牌は切ってくれるけど、牌がくっついてくるととたんに怪しくなる。
二向聴で流局。

3局目。
なんとかペナルティなしで乗り切る。
一向聴で流局。
今のところ見た感じアガリまで到達しているエピソードは10~30回に1回くらいとだいぶ少ないです。
ニューラルネットの分量が多いためか、(Q値を37種牌それぞれに算出してる)か、けっこう計算時間が長いです。
だいたい40分で1000エピソードかかってます。
今の時点でこのペースだからこの先の打点や4人麻雀の拡張とかを考えると、先が思いやられますなぁ。
とりあえずシャンテン数のみの強化学習はこのままPCには頑張って続けてもらうとして、私のほうは次どうしようかなー。
Actor-criticの設計からやるか、DQNのままで打点関連や4人麻雀への拡張をやるか。
旧PCはしばらく強化学習で使って、ほかの作業はしにくいから、へたに方策オン型に手を出して教師ありニューラルネットとの連結を考えるよりは、教師あり時と同様、チャンネル数増による、打点関連や4人麻雀の拡張から地道にやってくほうがいいかなー。
となると、次は役判定関数のPythonへの移植が課題ですね。
Actor-criticにしろ、DQNにしろ、なかなか自力でプログラム組むのはうまくいかなかったです。
DQNだと、わりとサンプルコードが多かったので、下記のサイトのコードをほぼパクらせていただきました。
https://qiita.com/yukiB/items/0a3faa759ca5561e12f8
そしたら、自分で組んだ時より学習がちょっとだけうまく進んだっぽいです。
今回の環境(報酬の決め方)
・上がったときに+1点のプラス報酬を与える
・手牌にない牌を切ろうとした場合、ペナルティとして、-0.002×(当該局のペナルティ回数)のマイナス報酬を与える(その巡目はツモ切り)
・(ペナルティではなかったときで、)14枚手牌と、1枚切った13枚手牌のシャンテン数が一致したとき(つまりシャンテン数を維持できたとき)、0.002×2^(6-シャンテン数)のプラス報酬を与える
報酬の決め方としては、
アガリが一番偉い(報酬が高い)>次いで聴牌に近い段階でシャンテンを維持できること>ペナルティを多く積み重ねないこと>>アガリに遠い段階のシャンテン数維持、少ないペナルティ回数、という感じで作りました。
ペナルティについては回数が多く積み重なるほど大きくマイナスされる(n^2のオーダー)設計にしてます。
シャンテン維持は指数オーダーなので、聴牌に近いとアガリには及ばないものの、かなり大きめの報酬が得られる。
少ペナルティやシャンテン数が大きい段階については多ペナルティやシャンテン数少と比較して報酬の多寡は極めて小さいレベルです。
とりあえず現段階(6000エピソード分)の学習成果がこちら↓。

1局目。
最初のうちは孤立牌から切っていってる。孤立字牌からでないのがなんとも。
終盤に入って手牌が入り組んでくると、手牌にない牌がQ値が一番高いとニューラルネットが指定してくる。
一向聴で流局。

2局目。
これも孤立牌は切ってくれるけど、牌がくっついてくるととたんに怪しくなる。
二向聴で流局。

3局目。
なんとかペナルティなしで乗り切る。
一向聴で流局。
今のところ見た感じアガリまで到達しているエピソードは10~30回に1回くらいとだいぶ少ないです。
ニューラルネットの分量が多いためか、(Q値を37種牌それぞれに算出してる)か、けっこう計算時間が長いです。
だいたい40分で1000エピソードかかってます。
今の時点でこのペースだからこの先の打点や4人麻雀の拡張とかを考えると、先が思いやられますなぁ。
とりあえずシャンテン数のみの強化学習はこのままPCには頑張って続けてもらうとして、私のほうは次どうしようかなー。
Actor-criticの設計からやるか、DQNのままで打点関連や4人麻雀への拡張をやるか。
旧PCはしばらく強化学習で使って、ほかの作業はしにくいから、へたに方策オン型に手を出して教師ありニューラルネットとの連結を考えるよりは、教師あり時と同様、チャンネル数増による、打点関連や4人麻雀の拡張から地道にやってくほうがいいかなー。
となると、次は役判定関数のPythonへの移植が課題ですね。
スポンサーサイト