背景就不介绍了,REINFORCE算法和AC算法是强化学习中基于策略这类的基础算法,这两个算法的算法描述(伪代码)参见Sutton的reinforcement introduction(2nd)。

AC算法可以看做是在REINFORCE算法基础上扩展的,所以这里我们主要讨论REINFORCE算法中算法描述和实际代码设计中的一些区别,当然这也适用于AC算法:

1.  时序折扣项为什么在实际代码中不加入 

REINFORCE算法中是需要对状态动作对出现在episode内的顺序进行折扣加权的,即 γt 。但是在实际代码设计中我们并不会在实际计算中对每个状态动作对进行时序折扣加权的,个人总结原因:

在论文推导中我们其实是假设在整个状态动作对都是可以遍历的条件下进行的,或许可以这样理解,在一个batch size中就已经包括了所有的状态动作对(准确的说是包括了所有的episodes,按照概率采样到了所有的episodes),所以每个状态动作对需要根据理论推导加入时序折扣,但是在实际代码中我们都是面对较大规模的问题,此时我们的一个batch size可以看做是对整体状态动作对的一个mini抽样,此时加入时序折扣非但可能不会更好的贴近实际分布而更可能造成扰乱并偏离实际状态动作对的分布,况且加入时序折扣更会增加实际计算的复杂性。因此在REINFORCE算法和AC算法的实际代码中我们不加入时序折扣。

2.  REINFORCE算法实际代码中为什么会对一个episode内的所有状态动作对的折扣奖励和进行规则化(Regularize)

总所周知在REINFORCE算法的论文和实际理论中并没有对一个episode内的所有状态动作对的折扣奖励sum做Regularize,但是在实际代码中却进行了Regularize。在REINFORCE的实际代码编写中一个episode内的每个状态动作对的折扣奖励sum都是相当于通过蒙特卡洛方式得到的,然后再对一个episode内的所有状态动作的折扣奖励和做规则化(减去均值除去方差),最后获得一个episode内每个状态动作对的规则化后的折扣奖励和。

可以知道对episode内的每个状态动作对的折扣奖励sum进行规则化是代码编写中的trick,这个trick并不是论文中给出的而是实际代码编写和运行中得到的trick,经过大量实验后发现该trick确实好用。为什么这个trick好用呢,分析一下可以知道REINFORCE属于蒙特卡洛方式的采样估计,该种方式虽然无偏但却高方差不利于收敛,所以要是严格按照论文不采用这个trick会不利于收敛。同时可以参考安德鲁.NG.吴恩达的博士论文“reinforcement learning reward shape”可以知道通过对reward的shape可以提高算法的训练性能。REINFORCE算法采用这个trick后可以很好的减少训练时候的方差,有利于收敛。

===========================================

最新文章

  1. 初识Quartz(入门案例)+常用的Cron表达式
  2. [New Portal]Windows Azure Virtual Machine (13) 在本地使用Hyper-V制作虚拟机模板,并上传至Azure (3)
  3. 史上最"恐怖"的12生肖图,绝对超猛
  4. 通用的web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等)
  5. IE 不兼容的几个js问题及解决方法
  6. vs2012 condition_variable notify_one 崩溃
  7. mysql 数据库自增id 的总结
  8. Java protobuf框架使用向导
  9. python 小白(无编程基础,无计算机基础)的开发之路 day1
  10. 你真的知道final关键字吗?
  11. JS获取浏览器地址栏的多个参数值的任意值
  12. ESP8266 RTOS SDK编译环境搭建
  13. JS创建对象之工厂模式
  14. 使用 Jira 和 Confluence 6 在一起
  15. Android测试(四)——内容供应器泄露
  16. USART of STM32
  17. fastJson顺序遍历JSON字段(转)
  18. STL概论
  19. Remi 安装源
  20. Android组件--碎片(fragment)

热门文章

  1. Hangfire任务调度框架使用
  2. less 循环模拟sass的for循环效果
  3. Backbone.js 0.9.2 源码分析收藏
  4. 通过springBoot集成搭建webScoket服务器
  5. 使用VUE组件创建SpreadJS自定义单元格(二)
  6. 【Java】泛型
  7. 链式printf()函数的用法
  8. 《剑指offer》面试题41. 数据流中的中位数
  9. 开发者的瑞士军刀「GitHub 热点速览 v.22.04」
  10. setcontext+orw