魔女狩りはじめました

クジラちゃんのクライアント部に使われている「Silent Majority」(以下、「魔女」と記す)というプログラムが強いということでその理由を考えてみました。(魔女のソースコードは全く読んでいません。)


まず、ソースコードを読んだ人の感想から。

SILENT MAJORITYがかなり強い
http://woodyring.blog.so-net.ne.jp/2016-05-07

要するにStockfish7 + Aperyの評価関数で、Stockfish7から探索パラメータのチューニングはそんなにしていないのではないかと。

今回のApery(WCSC26)は、Stockfish6をLazySMP対応して、探索パラメーターをかなりの労力を払ってチューニングしたものだと思うので、何故、これより魔女のほうが強いのかという話になるわけです。

私が思いつく限りの理由を挙げてみます。

1) Stockfish7は、探索パラメーターをほとんどいじらなくとも将棋ソフトの探索部として使う場合、かなり適切なパラメーターである。
2) 平岡さんは1パラメーターずつ変えて、3000局ぐらい対局させて前のバージョンより有意に強くなっていなければ採用しない方針のようで、この方針だと局所最適解に陥りやすい。
3) 同系のソフトなのでsingular extensionなどのパラメーターを調整することで勝率は大きく変化する傾向があり、Apery(WCSC26)との対戦成績を信用するべきではない。
4) 定跡が分散していない等で、きちんとしたデータが採れていない。
5) Apery(WCSC26)のlazySMPの実装に問題がある。

1)は知らない人がほとんどだと思うのですが、まあ、そういうことなんです。たぶんベストな値にしてもR50、上がるかどうか。なので探索パラメーターの最適化のみならず、(上位のソフトでは)枝刈りの仕方を工夫する勝負になっているわけです。

2)がわりと問題で、有意でなくともある程度の見切りで勝率の上がりそうなほうにパラメーターを動かしたほうがいいという考え方もあります。SGDとかそうですよね。

また1パラメーターずつ動かすと、2パラメーター以上を同時に動かすのとは違って、局所最適解に陥りやすいです。平岡さんがStockfish6ベースからいきなり7ベースに変更せずにStockfish7で取り入れられた枝刈りを1つずつAperyに入れて勝率を確認しながら改善をされているわけですが、この方法だと複数の枝刈りによって初めて効果が上がるようなものはいつまで経っても取り入れられず、このへんで最新のStockfishにキャッチアップしているソフトとの差が開いていきます。

3)は、特に重要で、魔女はAperyとの勝率を見るべきではなく、他の同じぐらいの棋力のソフトと対局させて勝率を見たほうが良いです。

4)も、開始局面をバラけさせることが大事です。同じ局面から開始させてしまうと、1スレッド1手0.1秒固定とかだとかなりの確率で同じ進行になり、勝率が偏ります。異なる局面からスタートするのが大切です。

このとき、(局面は異なるけど)同じ戦型ばかりになるのはいいのかとか、実戦で生じやすい戦型を重点的に対局させるほうが現実的な勝率になるのではないかなど色々な考え方があるとは思いますが、まあ、このへんも含めてノウハウであり、公平な条件でソフトの棋力を計測するのは、開発者の腕の見せどころでもあります。

5)ですが、たぬきのもり(WCSC26)では、大樹の枝にlazySMPを実装したわけですが、24コアPCで計測するとYBWC版より負け越しているようでした。(データ数が少なくて不正確な情報の可能性もありますが) Stockfish6をlazySMP化するのは何か罠があり、たぬきのもり(WCSC26)とApery(WCSC26)は、この罠にハマった可能性もあります。よくわかりません。

魔女狩りはじめました」への10件のフィードバック

  1. 時間無くてStockfish7の手法全ては試せていないです。counter_move入れてみようとしてたら選手権になってしまいました。
    結果的には個別に色々試すよりも、Stockfish7ベースで書き換える方が早く強く出来たという事ですね。
    探索の比較が出来てラッキーです。

    • > 結果的には個別に色々試すよりも、Stockfish7ベースで書き換える方が早く強く出来たという事ですね。

      たぶん、そういうことなんですよね。singular extension絡みで自己対戦成績だけが良くなっているのでなければ。

  2. 1手指すときに、たとえば
    何局面の評価関数を計算した
    それによって何手先まで読んだ
    みたいに数値であらわせるようなものないんですか?
    やねパラ(やねうらパラメータの略)みたいなもの?

    • 局面を指し手によって1手進めるdo_move()という関数があるのですが、これを呼び出した回数が探索node数(=探索局面数)となります。1秒当たりの探索node数の平均がnps(nodes per second)となります。これは将棋所などで対局させると表示されているかと思います。(思考エンジンがnpsの値を出力するため)

      また、Aperyとかやねうら王では、do_move()するごとにほぼほぼ評価関数(evaluate() )を呼び出しています。つまり探索node数≒評価関数を呼び出した回数です。

      そこで、将棋所のnps表示から思考にかかった時間を掛け算をすれば、おおよその評価関数を呼び出した回数を算出出来ます。

      • 返答ありがとうございます。

        私の書き込みがしたたらずなのですが、
        単純に「評価関数を呼び出した回数」の話をしているのではなくて、

        同じ10手先まで読むソフトが2つあったとして、
        片方は「評価関数を呼び出した回数1万回」
        片方は「評価関数を呼び出した回数10万回」
        みたいだったら前者の方が優秀である可能性が
        高い。

        そんな感じで、数値データとしてなんかいいのないかなぁというような感じのことが言いたかったです

        • > みたいだったら前者の方が優秀である可能性が高い。

          枝刈りってすればいいとは限らないので、そのへんはバランスですね…。なので、1手深くなるごとに探索局面数(≒評価関数を呼び出した回数)がk倍になるとして、kが小さければいいというものではないですね。評価関数が優秀だとkは小さくなる傾向はあるかと思いますけども。kは「(探索時の)平均分岐数」と呼ばれる係数です。りちゃさんの探しておられるものが、これなのかどうかはよくわかりませんが…。

        • 将棋ソフトの優秀さなんて、対局させて強い方としかいいようがない。

          、、、という話じゃなくて、なんとかちゃんねるでよくやってる、難しいお題の局面で同じ正着を見つけるのにどのくらい探索にかかったか、って話ですかね。

          • takaさんへ
            > 数値であらわせるようなものないんですか?
            みたいなことが言いたくて、その一例としてtakaさんがおっしゃっている「正着を見つけるときにどのくらい探索にかかったか」というのをあげています

  3. SILENT MAJORITYは実はやねうらおうが作って、あとから使用料を請求するってネタも流れてましたよw。
    これだけでこれだけ強くなるってことは、電王トーナメントはみんなStockfish7を使うんですかね?

    • > これだけでこれだけ強くなるってことは、電王トーナメントはみんなStockfish7を使うんですかね?

      そう思っていたら技巧のソースコードが公開されて天変地異が起きるとか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です