def _expansion_evaluation(self, leaf_id, win_index): leaf_state = utils.get_state_pt(leaf_id, self.board_size, self.inplanes) self.model.eval() with torch.no_grad(): state_input = torch.tensor([leaf_state]).to(device).float() policy, value = self.model(state_input) policy = policy.cpu().numpy()[0] value = value.cpu().numpy()[0] if win_index == 0: # expansion actions = utils.legal_actions(leaf_id, self.board_size) prior_prob = np.zeros(self.board_size**2) # re-nomalization for action_index in actions: prior_prob[action_index] = policy[action_index] prior_prob /= prior_prob.sum() if self.noise: # root node noise if leaf_id == self.root_id: noise_probs = np.random.dirichlet(self.alpha * np.ones(len(actions))) for i, action_index in enumerate(actions): child_id = leaf_id + (action_index, ) prior_p = prior_prob[action_index] if self.noise: if leaf_id == self.root_id: prior_p = 0.75 * prior_p + 0.25 * noise_probs[i] self.tree[child_id] = { 'child': [], 'n': 0., 'w': 0., 'q': 0., 'p': prior_p } self.tree[leaf_id]['child'].append(action_index) # return value reward = False return value, reward else: # terminal node # return reward reward = 1. value = False return value, reward
def _expansion_evaluation(self, leaf_id, win_index): # 최근 몇턴간의 one hot 인코딩된 흑돌의 위치와 one hot 인코딩된 백돌의 위치, 그리고 색깔 정보 leaf_state = utils.get_state_pt(leaf_id, self.board_size, self.inplanes) self.model.eval() # 드롭아웃 및 배치 정규화를 평가 모드로 설정 with torch.no_grad(): # Tensor로 부터의 기록 추적과 메모리 사용 방지 state_input = torch.tensor([ leaf_state ]).to(device).float() # 지정한 디바이스에 새로운 Tensor 인스턴스 생성 policy, value = self.model(state_input) # 모델에 Tensor 적용 policy = policy.cpu().numpy()[0] # policy : 승리가능성이 높을수록 높게 책정된다 value = value.cpu().numpy()[ 0] # value : (-1 ~ 1) 마지막 턴 플레이어의 승리 가능성이 높으면 낮은 값을 반환 if win_index == 0: # 승패가 결정되지 않은 경우 # expansion actions = utils.legal_actions( leaf_id, self.board_size) # 잎 노드의 보드 상황에서 모든 가능한 착수 위치 prior_prob = np.zeros( self.board_size**2) # policy의 정규화 값이 저장될 array # re-nomalization for action_index in actions: prior_prob[action_index] = policy[action_index] prior_prob /= prior_prob.sum() if self.noise: # 노이즈 생성 # root node noise if leaf_id == self.root_id: noise_probs = np.random.dirichlet(self.alpha * np.ones(len(actions))) # 잎 노드에서 착수 가능한 위치에 해당하는 자식 노드 생성 for i, action_index in enumerate(actions): child_id = leaf_id + (action_index, ) prior_p = prior_prob[action_index] if self.noise: if leaf_id == self.root_id: prior_p = 0.75 * prior_p + 0.25 * noise_probs[i] # 트리에 자식 노드 추가 self.tree[child_id] = { 'child': [], 'n': 0., 'w': 0., 'q': 0., 'p': prior_p } self.tree[leaf_id]['child'].append( action_index) # 잎 노드의 child 밸류 수정 # return value reward = False return value, reward else: # 게임의 승패가 결정됐을 때 # terminal node # return reward reward = 1. value = False return value, reward