Чтение Эта статья очень помогла в понимании принципов AlphaZero. Тем не менее, есть кое-что, в чем я не совсем уверен.
Ниже приведен авторский метод UCT_search
, с которым можно ознакомиться в его коде на Github: https://github.com/plkmo/AlphaZero_Connect4/tree/master/src
Здесь , UCTNode.backup()
добавляет net value_estimate
ко всем пройденным узлам (см. Также 'шпаргалку' ).
def UCT_search(game_state, num_reads,net,temp):
root = UCTNode(game_state, move=None, parent=DummyNode())
for i in range(num_reads):
leaf = root.select_leaf()
encoded_s = ed.encode_board(leaf.game); encoded_s = encoded_s.transpose(2,0,1)
encoded_s = torch.from_numpy(encoded_s).float().cuda()
child_priors, value_estimate = net(encoded_s)
child_priors = child_priors.detach().cpu().numpy().reshape(-1); value_estimate = value_estimate.item()
if leaf.game.check_winner() == True or leaf.game.actions() == []: # if somebody won or draw
leaf.backup(value_estimate); continue
leaf.expand(child_priors) # need to make sure valid moves
leaf.backup(value_estimate)
return root
Этот метод кажется посещать только узлы, непосредственно связанные с узлом root.
Тем не менее, Оригинальная статья DeepMind (об альфа-канале Go Ноль) гласит:
Каждая симуляция начинается с состояния root и итеративно выбирает движения, максимизирующие верхняя доверительная граница Q (s, a) + U (s, a), где U (s, a) ∝ P (s, a) / (1 + N (s, a)), пока конечный узел s 'не будет встретились.
Поэтому вместо этого я бы ожидал что-то вроде:
def UCT_search():
for i in range(num_reads):
current_node = root
while current_node.is_expanded:
…
current_node = current_node.select_leaf()
current_node.backup(value_estimate)
(UCTNode.is_expanded
равно False
, если узел еще не посещался (или это конечное состояние, т.е. конец игры)
Не могли бы вы объяснить, почему это так? Или я что-то упускаю?
Заранее спасибо