策略梯度: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算法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值