策略梯度:REINFORCE算法代码详解

算法实现细节解析:

# 计算每一个step的ut
    def get_ut(self,reward_list, gamma=1.0):
        for i in range(len(reward_list) - 2, -1, -1):
            reward_list[i] += gamma * reward_list[i + 1]  
        return np.array(reward_list)
   

get_ut函数是为了计算 从当前step开始到这个轨迹结束所得到得奖励。并不是用整个轨迹得奖励来代表其中某一步得好坏。
range(len(reward_list) - 2, -1, -1) 是 指 从len(reward_list) - 2开始,到最后一个为止,每次走一步。

 def learn(self, transition_dict):
        obs=paddle.to_tensor(transition_dict['states'],dtype='float32')
        act=paddle.to_tensor(transition_dict['actions'],dtype='int64')
        reward=paddle.to_tensor(self.get_ut(transition_dict['rewards'],self.gamma),dtype='float32')



        act_prob = self.policy_net(obs)  # 获取输出动作概率
        # 采用梯度上升,因此要乘以-1
        log_prob = paddle.sum(-1.0 * paddle.log(act_prob) * paddle.nn.functional.one_hot(act, act_prob.shape[1]),axis=-1)
        loss = log_prob * reward
        loss = paddle.mean(loss)

        loss.backward()
        self.optimizer.step()
        self.optimizer.clear_grad()

log_prob里面说因为采用梯度上升,所以要乘以-1,是因为 通常都是求最小化,而在这个地方求得是最大化,为了反一下,所以乘以了-1.

参考连接

OpenAI Gym 经典控制环境介绍——CartPole(倒立摆)

【强化学习】REINFORCE算法

你可能感兴趣的:(强化学习,算法,python)