目录
前言
回报函数(reward)设计在DRL应用中是极其重要的一环,通过将任务目标具体化和数值化,reward就如同一种特殊语言,实现了目标与算法之间的沟通,算法工作者在这里面承担了翻译的角色,翻译的好坏体现了其对任务逻辑的理解深度,决定了agent最终是否能学到期望的技能,并直接影响算法的收敛速度和最终性能。结合上一篇的内容,我们知道DRL算法中reward负责引导神经网络挖掘状态信息中的决策相关因素并经过提炼后用于action的计算生成。既然reward设计这么重要,想必分析起来又会是像状态空间那样的长篇大论吧。AI时代有了深度神经网络,也不缺数据和算力,难道这点人工就不能省下来吗?
非要手工设计吗?
鉴于强化学习算法对优秀reward函数设计的依赖,学术界提出了很多方法改善这一状况。比如逆向强化学习,利用expert demonstration(专家示范)学习到reward函数,再用这个reward函数训练RL策略。此外,还有一大堆模仿学习的方法,干脆抛开reward直接拟合专家策略。以上方法的前提是要有专家数据,不具备普适性,这里就不多说了。
近年来学术界有个趋势,希望通过深度神经网络自动学习reward函数,从而代替手工设计。其中一篇比较有代表性的工作[1],在传统Actor-Critic框架的基础上,又增加了一个Reward网络,输入当前的状(state)和动作(action),输出这一步的reward值。Actor和Critic网络都依据最新的reward网络输出进行优化,而reward网络则依据人类(Supervisor)的喜好用有监督的方式进行更新,具体方法是周期性地采集一些episode片段并成对地让人类观看,后者反馈更喜欢哪个片段,再由reward网络拟合这个二分类问题。这篇paper的思想我非常欣赏,现实生活中确实存在很多难以分解和量化的目标,比如让agent学会后空翻,reward就很难设计;有些目标虽然是本身是量化的,但过于笼统难以分解成具体的reward,此时这种方法就很有吸引力。
可惜啊~~~,我们在现实中遇到的需求不大可能是第一种情况,比起“不能做→能做”,工业界更喜欢“能做→做得更好”,一般都会给出一个明确的指标用来最大化或最小化。假如这个指标能通过少量采样统计出来或体现出优劣关系,那就适合采用这种方法自动学习reward函数,而且不需要人的介入,全程自动化进行。但如果这个指标必须通过大量采样才能统计出来或者获得可靠的优劣关系,该方法的效率就非常低了,这种情况下就得老老实实地手工设计reward,走传统DRL路线了。
主线reward和稀疏回报问题
当我们拿到一个任务目标,往往能够简单分析就能找出与该目标紧密联系的主线事件,比如小车到达终点的任务中“到终点”就是这样的事件,拳皇里“KO”也是这样的事件,超级马里奥中“通关”还是这样的事件。此时我们就有了第一个reward项,我把它称之为主线reward,一般是正奖励,当主线事件发生时即反馈给agent。理论上,只要有主线reward就可以用强化学习算法进行训练了。在很多简单任务中,agent在探索过程中靠误打误撞就能以一定概率遇到主线事件,通过正反馈尝到甜头后通过更新policy逐渐提升得到奖励的概率直至收敛。可是当问题稍微复杂一些,通过随机方式探索到主线事件(正样本)的概率变得很低,而强化学习算法本身的数据效率不高,只靠这些少得可怜的正样本,算法难以收敛或收敛很慢。下面我引用伯克利RL大神Pieter Abbeel的课程CS294-40中的例子具体说明。
在上图中agent从最左端起始位置S处出发(state=