Как программа учится играть, ничего не зная про игру заранее — просто разыгрывая тысячи случайных партий и постепенно понимая, куда стоит смотреть внимательнее.
Игра с камнями
Перед двумя игроками лежит куча камней. Игроки ходят по очереди. За один ход можно забрать 1, 2 или 3 камня. Кто забирает последний камень — побеждает.
Сыграйте сами против простого соперника, чтобы почувствовать игру. Начинаете вы.
Дилемма: исследовать или использовать?
Прежде чем строить дерево, решим маленькую, но ключевую задачу. Представьте три игровых автомата. У каждого свой скрытый шанс выплаты, но вы его не знаете — узнать можно только дёргая ручку и глядя на результат. У вас ограниченное число попыток. Куда их тратить?
Возникает противоречие. Можно использовать (exploitation) — дёргать тот автомат, что пока приносит больше всего выигрышей. А можно исследовать (exploration) — пробовать редкие автоматы: вдруг один из них на самом деле лучше, просто ему не повезло на первых попытках. Всё время делать только одно — проигрышная стратегия.
Решение — оценка UCB1 (Upper Confidence Bound). Для варианта
Каждый раунд выбирается вариант с наибольшим
Левое слагаемое
Понаблюдайте: первые раунды UCB1 раздаёт по очереди всем автоматам (у нетронутых бонус бесконечный), потом всё чаще возвращается к лучшему — но никогда не бросает остальные совсем. Ровно этот механизм MCTS применяет на шаге Selection, спускаясь по дереву. Посмотрим, как из четырёх таких шагов складывается весь алгоритм.
Четыре шага, повторённые тысячи раз
MCTS не строит дерево целиком. Вместо этого он выращивает его по чуть-чуть, повторяя один и тот же цикл из четырёх шагов. Каждый цикл — это одна «прикидка» того, насколько хорош тот или иной ход.
Selection
Выбор
Спускаемся по дереву, выбирая многообещающие узлы, пока не дойдём до края изученного.
Expansion
Расширение
Добавляем в дерево новый, ещё не исследованный узел-ребёнка.
Simulation
Симуляция
Доигрываем партию до конца случайными ходами и смотрим, кто победил.
Backprop
Обратный ход
Несём результат вверх по дереву, обновляя статистику всех пройденных узлов.
Каждый узел дерева хранит всего два числа:
Один цикл MCTS, шаг за шагом
Ниже — настоящий MCTS, работающий на нашей игре с камнями. Жмите «Шаг», чтобы пройти фазы по очереди, или «×100», чтобы прогнать сотню циклов и увидеть, как дерево умнеет.
Обратите внимание: со временем алгоритм почти перестаёт спускаться в плохие
ветки — рёбра к ним становятся тонкими, а
А какой ход в итоге сделать?
Когда «время на размышление» вышло, бонус за исследование больше не нужен —
рисковать незачем. Поэтому финальный ход выбирают не по UCB1,
а просто по числу посещений
Robust child: чаще всего посещали — значит, симуляции стабильно его одобряли.
Полный игрок просто оборачивает всё это в цикл: «подумал
Что мы узнали
MCTS — это четыре строчки идеи, повторённые много раз:
- Selection — спускаемся по
\mathrm{UCB1} , балансируя исследование и использование - Expansion — добавляем новый узел на границе знания
- Simulation — доигрываем случайно до результата
- Backpropagation — обновляем
N иW вверх по пути
Эта же схема, усиленная нейросетями для оценки позиций и приоритезации ходов, лежит в основе AlphaGo и AlphaZero. Разница — в масштабе и в том, что случайные доигровки заменяет обученная сеть. Но скелет — ровно тот, что вы только что собрали на куче камней.
Слева — итоговое решение, справа — правило спуска. Весь MCTS в двух формулах.