Пост, в общем-то, посвящается @Комс.
Меня не устраивает ширина поиска в Лиле и я играюсь с настройками с целью сделать так, чтобы слабые ходы получали больше времени.
В Лиле используется алгоритм UCT, и есть такая формула (1):
Cpuct' = Cpuct + CpuctFactor * ln((Nodes + CpuctBase)/CpuctBase)
Это была основная формула. Можно, если нужно, выразить Nodes. Формула (2):
Nodes = CpuctBase * (e^((Cpuct' - Cpuct)/CpuctFactor) - 1)
Или выразить CpuctBase. Формула (3):
CpuctBase = Nodes / (e^((Cpuct' - Cpuct)/CpuctFactor) - 1)
Объясню формулу (1). Это всё конфигурационные параметры движка, кроме Cpuct' (это вычисляемый) и Nodes (сколько просмотрено узлов на данный момент при анализе ДАННОГО узла).
Из описания алгоритма известно, что баланс exploitation - exploration сдвигается вправо тем больше, чем больше Cpuct'. Т.е., чтобы поиск сделать шире, нужно увеличивать Cpuct', чего можно достичь увеличением Cpuct, или CpuctFactor, или уменьшением CpuctBase. И, само собой, при увеличении Nodes поиск расширяется автоматически.
Для каждого хода-кандидата вычисляется его приоритетность, а именно Cpuct' плюс некоторое слагаемое, с которым я особо не разбирался пока (оно зависит от оценки хода), и выбирается тот ход-кандидат, у которого сумма больше. Т.е., приоритетность хода-кандидата зависит от нодесов, просмотренных во время анализа этого хода ранее, от оценки хода и от конфигурационных параметров.
По дефолту такие значения:
? = 3 + 2 * ln((Nodes + 19652)/19652)
При дефолтных значениях динамика получается следующая.
Когда Nodes = 0 (т.е., свежий ход), то Cpuct' = 3.
Когда Nodes = 33K, то Cpuct' = 5.
и т.д., вот таблица:
Nodes |
Time* |
Cpuct' |
0 |
0 |
3 |
33K |
3 sec |
5 |
125K |
12 sec |
7 |
375K |
37 sec |
9 |
1M |
100 sec |
11 |
3M |
5 min |
13 |
8M |
13 min |
15 |
22M |
37 min |
17 |
59M |
98 min |
19 |
*Время указано на моей текущей конфигурации железа и софта. Может отличаться для разных видеокарт и нейросетей. Для справки: на RTX 2060 с нейросетью T40B.4-260 скорость расчёта примерно 10K nodes/sec = 600 Knodes/min = 36M nodes/hr.
Указано потраченное время только на обдумывание этого хода, но не других ходов-кандидатов.
Если я держу движок уже 13 минут на ходе (причём, это означает общее время анализа уже намного больше, если этот ход не на первой линии!), то мне кажется, это значит, что я хочу уже широкого анализа, а не додрачивания оценки лучшего хода. Меня как-то не очень устраивает, что Cpuct' для 5 минут и 13 минут отличается так мало. Временно снимается - пока не понимаю полностью, как это всё работает.
Можно крутить CpuctBase. Я ещё буду дописывать этот пост.