Bonanza 6.0に追加学習のようなものの備忘録 [将棋]
前回から間が空いてしまって記憶が完全にぼやけている罠。
・論文読んでるうちに、何やってるかすっかり忘れてしまって思い出すのに苦労
CP+とか行ってるから余計
・論文読んでる途中で別のこと試したくなったが、うかつにも学習結果を吹き飛ばしていたことが判明
Bonanzaは学習を実行した時に容赦なく上書きされるため
ログによれば30時間分ぐらい吹き飛ばしたことになる。もったいない。
■前提となる文献
Large-Scale Optimization for Evaluation Functions with Minimax Search
・Bonanzaメソッド(MMTO)
目的関数:Jp(w) = J(P,w) + Jc(w) + Jr(w)
J(P,w) = ΣΣ(T(s(p,w) - s(p,w)) ・・・(A)
T:シグモイド関数
準備はphase1のmake_pv。計算そのものはcalc_deriv。
左右対称は考慮されているので、KPPは本来の状態数の2倍近い数になっている。
また、この結果は符号の向きだけしか使われない。
Jc(w):Σa(w') - 6500 ・・・(B)
駒割りに関する拘束条件
renovate_paramのrmt関数があるあたり
駒の価値を変動させるときにトータルが一定になるようにすることで、数学的には収束して最小値が求められることが数学的に保証されている。(適当に調べたところ、ラグランジュ未定乗数法ではそうなるという理解)
Jr(w):λ|w''| ・・・(C)
λ=0.2/32 = 1/160
この項目自体はcalc_penaltyの全部足してFV_PENALTYをかけているところだが、更新量はrenovate_paramのrparam。
これはL1正則化のように、あまり重要ではない要素を0に収束させることにより、重要な特徴の量を減らす機械学習の常套手段だが、正則化による変動量を目的関数に入れることによって収束の度合を指標としている
ベクトルの更新と目的関数中のCは符号が逆なのは、そういう理由があるんだと思うがどうだろうか。加算しているが、|w|を加算したものを最小化するというのは、全部の値0になってほしいという圧力がかかっている。
というのが、現状というかしばらく前の自分の認識で、今はすっかり忘れて読みながら「なるほど」とか思ってるぐらい忘れている。
昔から変化量=微分だと思って最初からソースを見ていたが、|w|のあたりなんかは、実装としては割りと適当というか、コードとして書きやすいようになってるので、数学的には厳密ではないような気もするが、微分して定数になるので、sign関数になるというようなことでいいんだろうか。
■少数の棋譜から指し手を変化させる
これは、去年のGPWの論文がもろにあった。
「将棋での少数の棋譜からの評価関数の学習における拘束条件の研究」
この論文では1848あまりの羽生四冠の棋譜から変化させるという目的のために、新たに次の項目を追加している。(引用元のGPW2009の論文にもある)
Jr=C/2 ||w-w0||^2 ・・・(D)
オリジナルボナンザでは目的関数はA+B+Cであったが、この論文ではA+B+C+Dとしている。
(以下、(D)の係数がCなので混在しているかもしれない)
2で割って、2乗するというのは、変化量がC|w-w0|になるので便利だから。またこの形はL2正則化というらしい?。自分が少し前に書いたコードもこの形。
この論文では、まず(C)の係数であるλについて調査している。すごい大雑把なイメージだと、
・(A)は値の絶対値を増やす
・(C)は値の絶対値を減らす
という作用があるため、(C)の係数であるλの値によって、
・λがでかすぎると値がつかないし、
・λが小さすぎると過学習になる
というのは、まあ当たり前といえば当たり前の話。
そこに更に(D)という項目を付け加えると、
・(A)のために値の絶対値を増やす
・(C)のために値の絶対値を減らす
・(D)は値がついてるところはそのままにして、値がついていないところは、(C)とともに絶対値を減らす
というような、複雑な学習になってしまって、効果が出るかいまいちわかりにくい。
さらに、この論文では、駒の価値の変化について検討しているが、そもそも48000局の棋譜で学習してつけた値をわずか1800余りの棋譜で更新するというのはやりすぎに思える。
ということから、論文を読む前で完全に後付ではあるが、前にやった方式もそんなに間違ってなかったと勝手に理解した。前にやった方法を、論文に書かれているように書き直すと
・使っている棋譜が1万程度なのでBonanzaの学習に対する影響力は5分の1程度であると見積もる
・(B)は一切変化させない
実際は5分の1変化させたいが、整数だと0になってしまうので変化しない
・(C)は用いずに(D)だけを用いる。
よって変化量はC|w-w0| となるが、CはFV_PENARTYそのものとした
これで学習を進めていると、目的関数がA+B+Cであっても、3時間で0.001~0.003ぐらい改善されているように見える。
今回データが吹き飛んだので、A+B+C+D形式の目的関数を作成して表示してみると、A+B+Dになる。
今回吹き飛んだついでに目的関数を表示させてみると、
Aが下がる
Cが上がる
Dが上がる
となり、ベースとなる評価関数から乖離し始めつつも、新しい値が付いているように観測される。(過学習な気もするが)
前は結果が出そうなのが一週間後だったので途中でやめた上に、別のことやろうとしたら吹き飛ばしてしまったので現在再学習中だが、棋譜の量から見積もれる変化量などによる推察はあっていいのではと思う。
また、オンライン学習では、L1正則化をある程度まとまってから行うようにすると聞くので、正則化のようなことすらしないような方向もあるのではないかとも思ったのだが、こういうのを考察できるような文献が今のところ見つかっていない。
その他
・そもそもが左右対称のみを考慮した、Bonanzaオリジナルのまま学習を実行しているが、まずは完全相対化されたもので学習したほうが、より人間の感覚に近づくのではないか
・シグモイドではなく、ロジスティック関数による学習を行うことの是非
相対化やる気力がわいたらその後にやってみたい
・全然関係ないが保護PDFなのでコピペできないので大変めんどくさい。Adobeは研究目的の保護機能を入れるべきである。
・ゲーム理論的なものへのリンクがまとめられたページが出きた
http://www.ai-gakkai.or.jp/my-bookmark_vol30-no2/
今コンピュータ将棋を調べようとすると結構デッドリンクだったり、話が古かったりするので(それはそれで有用なものもあると思うが)こういうリンクはよい。ただ、これが学会の一特集であるというのが残念で、もしAI学会が本気でやるのであれば、ChessProgrammingWikiのようなものはあっても良いと思うのだが・・・
・論文読んでるうちに、何やってるかすっかり忘れてしまって思い出すのに苦労
CP+とか行ってるから余計
・論文読んでる途中で別のこと試したくなったが、うかつにも学習結果を吹き飛ばしていたことが判明
Bonanzaは学習を実行した時に容赦なく上書きされるため
ログによれば30時間分ぐらい吹き飛ばしたことになる。もったいない。
■前提となる文献
Large-Scale Optimization for Evaluation Functions with Minimax Search
・Bonanzaメソッド(MMTO)
目的関数:Jp(w) = J(P,w) + Jc(w) + Jr(w)
J(P,w) = ΣΣ(T(s(p,w) - s(p,w)) ・・・(A)
T:シグモイド関数
準備はphase1のmake_pv。計算そのものはcalc_deriv。
左右対称は考慮されているので、KPPは本来の状態数の2倍近い数になっている。
また、この結果は符号の向きだけしか使われない。
Jc(w):Σa(w') - 6500 ・・・(B)
駒割りに関する拘束条件
renovate_paramのrmt関数があるあたり
駒の価値を変動させるときにトータルが一定になるようにすることで、数学的には収束して最小値が求められることが数学的に保証されている。(適当に調べたところ、ラグランジュ未定乗数法ではそうなるという理解)
Jr(w):λ|w''| ・・・(C)
λ=0.2/32 = 1/160
この項目自体はcalc_penaltyの全部足してFV_PENALTYをかけているところだが、更新量はrenovate_paramのrparam。
これはL1正則化のように、あまり重要ではない要素を0に収束させることにより、重要な特徴の量を減らす機械学習の常套手段だが、正則化による変動量を目的関数に入れることによって収束の度合を指標としている
ベクトルの更新と目的関数中のCは符号が逆なのは、そういう理由があるんだと思うがどうだろうか。加算しているが、|w|を加算したものを最小化するというのは、全部の値0になってほしいという圧力がかかっている。
というのが、現状というかしばらく前の自分の認識で、今はすっかり忘れて読みながら「なるほど」とか思ってるぐらい忘れている。
昔から変化量=微分だと思って最初からソースを見ていたが、|w|のあたりなんかは、実装としては割りと適当というか、コードとして書きやすいようになってるので、数学的には厳密ではないような気もするが、微分して定数になるので、sign関数になるというようなことでいいんだろうか。
■少数の棋譜から指し手を変化させる
これは、去年のGPWの論文がもろにあった。
「将棋での少数の棋譜からの評価関数の学習における拘束条件の研究」
この論文では1848あまりの羽生四冠の棋譜から変化させるという目的のために、新たに次の項目を追加している。(引用元のGPW2009の論文にもある)
Jr=C/2 ||w-w0||^2 ・・・(D)
オリジナルボナンザでは目的関数はA+B+Cであったが、この論文ではA+B+C+Dとしている。
(以下、(D)の係数がCなので混在しているかもしれない)
2で割って、2乗するというのは、変化量がC|w-w0|になるので便利だから。またこの形はL2正則化というらしい?。自分が少し前に書いたコードもこの形。
この論文では、まず(C)の係数であるλについて調査している。すごい大雑把なイメージだと、
・(A)は値の絶対値を増やす
・(C)は値の絶対値を減らす
という作用があるため、(C)の係数であるλの値によって、
・λがでかすぎると値がつかないし、
・λが小さすぎると過学習になる
というのは、まあ当たり前といえば当たり前の話。
そこに更に(D)という項目を付け加えると、
・(A)のために値の絶対値を増やす
・(C)のために値の絶対値を減らす
・(D)は値がついてるところはそのままにして、値がついていないところは、(C)とともに絶対値を減らす
というような、複雑な学習になってしまって、効果が出るかいまいちわかりにくい。
さらに、この論文では、駒の価値の変化について検討しているが、そもそも48000局の棋譜で学習してつけた値をわずか1800余りの棋譜で更新するというのはやりすぎに思える。
ということから、論文を読む前で完全に後付ではあるが、前にやった方式もそんなに間違ってなかったと勝手に理解した。前にやった方法を、論文に書かれているように書き直すと
・使っている棋譜が1万程度なのでBonanzaの学習に対する影響力は5分の1程度であると見積もる
・(B)は一切変化させない
実際は5分の1変化させたいが、整数だと0になってしまうので変化しない
・(C)は用いずに(D)だけを用いる。
よって変化量はC|w-w0| となるが、CはFV_PENARTYそのものとした
これで学習を進めていると、目的関数がA+B+Cであっても、3時間で0.001~0.003ぐらい改善されているように見える。
今回データが吹き飛んだので、A+B+C+D形式の目的関数を作成して表示してみると、A+B+Dになる。
今回吹き飛んだついでに目的関数を表示させてみると、
Aが下がる
Cが上がる
Dが上がる
となり、ベースとなる評価関数から乖離し始めつつも、新しい値が付いているように観測される。(過学習な気もするが)
前は結果が出そうなのが一週間後だったので途中でやめた上に、別のことやろうとしたら吹き飛ばしてしまったので現在再学習中だが、棋譜の量から見積もれる変化量などによる推察はあっていいのではと思う。
また、オンライン学習では、L1正則化をある程度まとまってから行うようにすると聞くので、正則化のようなことすらしないような方向もあるのではないかとも思ったのだが、こういうのを考察できるような文献が今のところ見つかっていない。
その他
・そもそもが左右対称のみを考慮した、Bonanzaオリジナルのまま学習を実行しているが、まずは完全相対化されたもので学習したほうが、より人間の感覚に近づくのではないか
・シグモイドではなく、ロジスティック関数による学習を行うことの是非
相対化やる気力がわいたらその後にやってみたい
・全然関係ないが保護PDFなのでコピペできないので大変めんどくさい。Adobeは研究目的の保護機能を入れるべきである。
・ゲーム理論的なものへのリンクがまとめられたページが出きた
http://www.ai-gakkai.or.jp/my-bookmark_vol30-no2/
今コンピュータ将棋を調べようとすると結構デッドリンクだったり、話が古かったりするので(それはそれで有用なものもあると思うが)こういうリンクはよい。ただ、これが学会の一特集であるというのが残念で、もしAI学会が本気でやるのであれば、ChessProgrammingWikiのようなものはあっても良いと思うのだが・・・
コメント 0