kobanium / TamaGo

Computer go engine using Monte-Carlo Tree Search written in Python3.
Apache License 2.0
54 stars 10 forks source link

search_sequential_halvingの実装に疑問があります #73

Closed bleu48 closed 1 year ago

bleu48 commented 1 year ago

search_sequential_halvingの実装において select_move_by_sequential_halving_for_rootではルート局面でnp.argmaxされておりそれを候補数呼び出していますが、 ”POLICY IMPROVEMENT BY PLANNING WITH GUMBEL”のAlgorithm 2 Sequential Halving with Gumbelにおいて argtopでm個の候補を一度に取ることになっています。 現象的には重複無しサンプリングであるべきところが重複ありサンプリングになっていると思われます。 加えて言うとGumbel-Top-k trickの計算コスト的な旨味や低ノード数域での多様性を損ねているように思います。

kobanium commented 1 year ago

select_move_by_sequential_halving_for_rootメソッドでchildren_visitsとvirtual_lossを足したcountsを使って下記処理でcount_threshold以上探索した手を選択肢から除外するようにしています。

evaluation_value = np.where(counts >= count_threshold, -10000.0, \
            self.children_policy[:self.num_children] + self.noise[:self.num_children] \
            + sigma_base * q_mean)

virtual_lossのカウントは一度探索対象として選ばれると+1され、process_mini_batchでニューラルネットワークの計算結果を反映されると-1されるので、指定したサンプル数サンプリングするまで重複してサンプリングされないようになっています。
Gumbel-Top-k trickのようにまとめて評価対象を取り出しておいた方が計算コスト的に良いというのはご指摘の通りなのですが、他の処理(主に碁盤の更新処理)があまりにも重いので特に気にせず今の状態にしています。

bleu48 commented 1 year ago

virtual_lossが入っているのですね。 virtual_lossを使わなくていいのがGumbel AlphaZeroの利点ですのでてっきり使ってないものと思っていました。 互換性のある実装としては理解しました。 解説ありがとうございます。