AobaZeroとの違い
異なる点
強さの調整
NNの入力
NNの出力
全種類の駒落ちを同時に学習
なぜ強さを調整するのか?
以下の点が異なります。
・駒落ちを人間の知識なしで学習。
・香、角、飛、2枚、4枚、6枚、平手、の7種類を同時に学習
・勝率が5割になるように下手(先手)の棋力を弱く(自動調整)。
・ニューラルネットワーク(NN)の入力に駒ごとの利き、利きの合計数、王手か、を追加。
・Policy Headを11259通りでなく2187通りに(dlshogiと同じ)。
・最終的な勝敗、でなく最終的な勝敗+探索勝率、の平均を学習。最終的な勝敗でのみ学習、にしました。
・持将棋は27点法で。先手(下手)は28点、後手(上手)は27点で宣言。上手の落とした駒は上手の点数として計算。
将棋連盟のルールの持将棋の規定から。
・最初からReplay Bufferを50万棋譜、NNのサイズも256x20bで学習。
駒の利きが入ってることで、若干人間の知識が入ってるとも言えます。
AobaZeroの棋譜を使った学習回数10万回固定の実験では利きの合計数を間接の利き(初形で26の地点には
歩と飛の2枚が効いているとする)にすると+60Eloほど強かったです。
利きの合計数を入れることでAobaZeroが見落としていた△91馬(19)という手もPolicyの1位になって見落とさなくなりました。
他の(AobaZeroとも共通の)設定は、
・513手目を指せれば引き分け
・Rootの手にはディリクレノイズを常に追加
・30手目までは温度1のsoftmaxで着手を選択。31手目以降は基本は最大回数の手を選択。
・31手目以降は下手(先手)のみ、現在の調整ELOに対応した温度のsoftmaxで選択
・30手目までで現在の調整ELOが443以上(温度1以上)なら下手(先手)のみ、その温度のsoftmaxで選択
・学習の損失関数はAlphaZeroと同様、方策(Policy)分布の交差エントロピー、価値(Value)の二乗誤差、重みのL2正則化項から
・詰将棋はなし。
・投了なし。強さ調節で、1手詰の局面でも別の手を指すことがあるため。AobaZeroは1895万棋譜からあり。
・1手800playout固定。MCTSで探索。UCBのパラメータはAlphaZeroと同じ cBASE = 19652, cINIT = 1.25, 勝率の初期値は負け。
・探索部はAobaZeroと同じ。探索内部で千日手、持将棋宣言判定あり。
・直近の50万棋譜の全局面から128局面を乱数で選びミニバッチを作成して1回学習。
・10000回学習するごとに重みを作成。1棋譜平均128手なら、1局面を1回学習する割合。
・10分に一度、追加された棋譜数ぶんだけReplay bufferを更新して学習。40blockのAobaZeroは2分に一度。
強さが異なるプレイヤー同士をハンデありで戦わせる強化学習が成功するかは未知数です。失敗する可能性も高いです。
強さの調整
弱くさせ方はMCTSで探索した手の訪問回数での選択を、Softmaxの温度で調整することで実現しています。
詳しくは下記を。
playout数で弱くするよりも、Softmaxの温度で弱くする方が正しい?
https://524.teacup.com/yss/bbs/3755
・強さは0点から2557点(ELO)まで変更できます。
・0点から1400点差まではSoftmaxの温度で。
・1400点差から2557点差までは
1400点差のSoftmaxの温度は固定で、ある確率で合法手の中からランダムに選んだ手を指す、ことで実現しています。
つまり2557点弱い、だと常に全合法手から乱数で1手選ぶ弱さになります。
この弱さの基準(0点)はfloodgateで3100点のAobaZeroのNNの重み(w3020.txt)を1手800playoutで調整したときの弱さです。
Aoba駒落ちだと、学習初期は期待する弱さにはならないと思います。
例えば、300点弱く、で調整しても学習最初のw1.txtでは10点ぐらいしか弱くならない、もしくは
w100.txtで300点弱く、でも実際は50点程度しか弱くならない、など。
元々弱いNNで弱さを調整しても、そもそもが弱い(全合法手から乱数で選ぶ、に近い)のでそれ以上弱くならないです。
香落ちのレートの調整は、最後にレートを調整してから
8000局の下手の勝率が0.53(+20 ELO)なら、その半分の 10 ELO で下手を弱くします。また、
1000局の勝率が0.60以上(または0.40以下)、
2000局の勝率が0.58以上(または0.42以下)、
4000局の勝率が0.56以上(または0.44以下)、
でも調整が入ります。他の手合いも同様です。
弱くするのは下手(先手)のみで、上手(後手)は弱くしません。
最初に乱数でPolicy、Valueを与えて1手800playoutで作った棋譜だと6枚落ちだと上手の方が強い(下手の勝率0.423)です。
これはほぼランダムで指すと、駒が多い下手の駒が取られやすく、お互い王を512手以内に詰ませられないまま、27点法の持将棋の宣言で上手が勝ちやすいためです。
(例えば上手が王、1枚だけとすると、下手は取れる駒がないのに上手は駒を取り放題。王が取られる手は合法手から除外)。
上の情報は1手詰を見つけにくい、バグありでの結果でした。
1手詰のバグを修正してPolicy,Valueに乱数を与える10万棋譜の統計は下で、6枚落ちで0.532と若干下手の勝率が高いです。
宣言勝ちは駒を落とすほど、上手の方が多くなっていきます。
局数 平均手数 下手(先手)勝率 宣言勝数(下手 上手)
平手 14541 202.9 0.497 28 27
香落ち 14154 204.2 0.504 16 49
角落ち 14169 208.2 0.520 15 83
飛落ち 14260 202.1 0.500 13 103
2枚落ち 14365 210.0 0.508 3 365
4枚落ち 14316 212.0 0.516 0 474
6枚落ち 14195 221.4 0.532 1 495
ある程度、駒得すれば有利、と学習が進まないと下手が勝ちだすことはないと思われます。
NNの入力
1. 盤上の駒の配置、先手、後手で14x2の28種類
歩、香、桂、銀、金、角、飛、王、と、杏、圭、全、馬、竜 ... 14種類。
2.* 持ち駒の数、7種類x2、で14種類。最大数(歩なら18)で割った値。
3.* 過去に同一局面になった回数。1,2,3回。1回なら100、3回なら111と全部の面が1。
(1),(2),(3)の合計45(28+14+3)を現在局面と過去5手前まで、6局面で 45*6=270 種類。
4. 盤上の駒が動ける位置。先手、後手で14x2の28種類。現在局面のみ。
5. 利きの合計数。0,1,2,3,4以上で5種類。を先手、後手で10種類。3なら 00010 と一つの面のみが1。現在局面のみ。
間接の利きも含む。例えば平手の初形で26の地点の先手の利きは歩と飛で2、となる。16の地点も香車が利いて2、仮に17も香車なら13の地点の利きも2になる。
例外として長い利きは相手の王は存在しない、として通過する。
https://github.com/yssaya/komaochi/blob/master/src/usi-engine/bona/yss_net.cpp#L1478
6.* 王手がかかっているか。1種類。現在局面のみ。
7.* 現在手数。512で割る。1種類。
8.* 手番。1種類。
9.* 手合い割。平手、香、角、飛、2枚、4枚、6枚、で7種類。4枚落ちなら 0000010。
「*」がついている項目は9x9が全部同じ値です。持ち駒の数と手数以外は0か1。
合計で 270 + 28 + 10 + 1 + 1 + 1 + 7 = 318 種類。318 x9x9 = 25758 個のfloat。
(実際は全部0の面が他に44あり、362x 9x9。これはAobaZeroからの変更を減らすため)
NNの出力
1. 着手の確率(policy)。27x 9x9 = 2187通り。詳細は下記を。
policy headの構造をdlshogiと同じ2187通り。
https://524.teacup.com/yss/bbs/3743
2. 勝率(value)。-1から+1までを返す。1通り。
合計 2187+1 = 2188個のfloat
ネットワークの構造はAlphaZero(AobaZero)と同じ、3x3のfilterが256個、ResNetが20blockです(256x20b)。
全種類の駒落ちを同時に学習
一つのネットワークで7種類の駒落ちを同時に学習します(平手含む)。
2枚落ちの上手と下手は同じネットワークです。
つまり7種類の手合の先手、後手、14種類の勝率と着手を学習します。
個別のネットワークにすれば精度は上がるかもしれません。
ただ共通部分も多いので悪影響は少ないかもしれません。
個別の学習はコストが7倍、というのができない最大の理由ですけど。
初期配置が異なる7つの局面を全部同じ勝率(5割)として学習することになります。
これがうまくいくのか心配ではあります。
平手は学習させる必要はなかったかもしれません。
ただfloodgateで気軽に棋力を試せることと、勝率を5割に調整(先手を少し弱く)することで
どのような指し方になるか興味があったので採用しました。
なぜ強さを調整するのか?
AobaZero同士で6枚落ちを戦わせると、序盤から上手、下手ともに歩をただであっさり取らせる、といった手を指します。
これは駒落ちを学習させてないせいもありますが、対局開始直後から下手の勝率が99%になって
歩を取る手も取らない手も、ほとんど同じ勝率になってしまうためです。これは上手も同じです。
高すぎる、低すぎる勝率ではMCTSは2つの指し手の違いを認識できません。
こういう性質のまま学習させるのは失敗する可能性が高いと思います。
勝率が50%になるように調整すると、下手は
「自分はある程度間違えるから、それを考慮して一番勝ちやすい手を指そう」
と考え、上手も
「現在は不利だけど相手は必ず間違える。なので開始局面は互角。逆転勝ちしやすい手を指そう」
と考えて学習することになります。
つまり「弱くさせかた」は非常に重要な可能性が高いです。
理想は人間の弱くなり方です。読みの力、知識の量、それらが徐々に下がる弱さだと思います。
「Aoba駒落ち」が採用しているSoftmaxの温度で弱くするやり方は、強い人の知識(指し手を選ぶ能力)
はそのままに、そこから強い人がわざと間違える、いびつな弱さです。
気づきにくい王手飛車をうっかりする、飛車が取れるから有利(実は不利)と間違った局面を目指す、といった
自然な弱さではありません。
この実現はかなり難しいので、今回はこの条件でどうなるか、を調べてみたいと思います。
上手だけ3手詰あり、で探索しようと思ったのですが乱数で作った棋譜だと上手の3手詰あり、が全勝するほど強く、
3手詰ロジックは外しています。平手だけ双方3手詰あり、はあったかもしれません。