#[深度强化学习落地方法论](https://zhuanlan.zhihu.com/p/95989190)学习记录
## 记录前言
正巧最近思考深度强化学习落地问题,在知乎学习大神专题(链接已经在上面),总结文章中题主的金句名言,自己以往做强化学习所忽视的问题,同时记录自己学习过程中的idea。
如果有同学和我一样想学习的建议直接看原帖,该贴纯属记录的自己用。
## 第一章 Bibibi
1. 借用原题主的一句话,算法工作者的“知行合一”,需要经历从抽象算法原理到广泛动手实践再上升到统一方法论这三个比较阶段,才算真正掌握了知识。—源于学术,高于学术。
## 第二章 需求分析篇
1. 算法工程师的核心能力:
a. 对各种算法本质及其能力边界的深刻理解。
b. 对问题内在逻辑的深入分析。
c. 对两者结合点的明锐直觉。
ps:一个优秀的算法工程师的高光时刻从拒绝不合理的需求开始!!!!(深有感触!!不是什么新什么发了大文章就能更好的用在我们手头的项目上!)
2. DRL 的过拟合天性:
a. 通过Value Function 过拟合环境特性,Policy 过拟合Value function,依赖于DNN的强拟合特性。
b. 没有严谨的公式推导,应该同强化学习本身作为试错算法和Policy更新方法有关。
c. 造成Policy对环境特异性非常敏感(过拟合)。
3. 适用DRL的五大特征
a. 场景固定。在特定Env.中的条件转移概率稳定,即DRL模型对Env.对过拟合特性。
b. 目标明确。有明确的优化目标(Acc.,胜率),目标越明确,设计优质的reward函数越容易,从而更容易训练得到接近预期的policy.
c. 数据廉价。
d. 过程复杂。往往通过DRL来解决的问题难以过程复杂难以掌握规律,需要Doamin knowledge。太简单的问题可以直接用规则或者启发式就能解决。
e. 自由度高。选择空间大,限制少,更能利用DRL充分探索路径空间,过拟合value function。例如远程监督学习中噪音减少问题,自然语言处理中序列标注问题。
f. 问题过程符合MDP.
## 第三章 算法选择篇
1. 强化学习是一个探索和利用的过程。
a. 改进搜索策略达到充分搜索。AlphaGo使用蒙塔卡洛决策树用于围棋问题。
b. 如果随即探索噪音强度过高,已经学到的知识会被噪音淹没。
c. 如果刚刚学到一点知识就无条件利用,会导致陷入局部最优。(Policy更新策略)
2. DQN
a. Action可以穷举。
b. 超参数敏感,overestimation造成的训练不稳定问题。
c. 对历史数据充分利用虽然可以提高效率,但是前提是Env.不能发生变化。MultAgent场景而言,对于特定的Agent来说,其他Agent也是环境的一部分,其他Agent更新导致环境改变,从而使历史数据失效。
d. 如果超参数设置合适,DQN收敛较快,可以用于在新项目场景中快速测试效果。
e. 将连续action空间离散化利用DQN,有训练得到更高性能的可能性。
3. DDPG
a. 可以控制连续任务。
4. A3C
a. Policy Gradient —> A2C —> A3C(待看)。
b. 在MultiAgent任务里对环境的稳定性更强。
## 第四章 动作空间
1. 对动作空间的定义往往最简单。联想游戏操作选择,分类任务。
2. 动作空间的两个要求。
a. 完备性。互斥,可穷举。尽量将连续空间离散化,更容易取得更好的效果。如果必须利用连续动作空间,需要将各维度区间归一化(tanh)。
b. 合法性。对于特定状态下规则不允许出现的action或者引发严重后果的action,应该直接屏蔽。(围棋已经占据的位子)
## 第五章 状态空间
1. 状态设计的好坏直接决定了DRL算法能否收敛,收敛速度以及最终性能。
2. 端到端的DRL学习效率即过拟合原因。人为筛选一些好的状态信息,可以是raw information,也可以是二次加工的信息,帮助神经网络建立Policy。
3. 状态设计的四个步骤
a. 任务分析。好的状态信息建立在对任务逻辑的深入理解之上。需要研究目标背后的每个环节影响因素,每个因素由哪些信息体现进行分析。
b. 相关信息筛选。找出与任务目标,子目标相关的信息。理想状态下状态空间应该完全由筛选出来的相关信息组成。
b.a. 直接相关信息。与某个reward奖励项及时联动的信息。小车的电量,距离。
b.b. 间接相关信息。与reward中没有及时联动的状态信息,所代表的事件需要一段时间后才得到反馈。小车方向,速度。间接相关信息学习效率更差。 间接相关信息通过某些手段可以转为直接相关信息,从而提高DRL学习效率。比如在reward中加上对应的奖励惩罚。
b.c. 相关信息预处理。原始信息都要通过NN的提炼才能转为Acition输出。由于DL的优化目标是折扣累加的长期收益,所以reward起作用的方式更加间接,无法像有监督学习那样为神经网络的特征抽提提供更好的指导,这也是DRL训练效率低下的根本原因。 所以需要在状态设计上多下一点功夫,比如多一些人工特征抽提,能更好的训练RL。
c. 统一性考虑。必须设计状态信息使其对环境主要因素改变由最起码的兼容性,即状态设计不能太具有转一化,考虑数据统一性。
c.a. 形式统一。向量形式上统一。
c.b. 逻辑统一。泛化具体场景。要想让网络学习到我们希望他学到的知识,前提是输入正确形式的状态信息。输入最好是相对信息,而不是绝对信息(比例,差值),相对信息具有更好的泛化能力,比如小车相对位置。
d. 效果验证
d.a. 模仿学习验证。同监督学习的baseline比较,模仿该baseline在各种状态下的action,如果状态中包含了正确决策所需要的相关信息,那么得到的policy性能就会接近baseline。
d.b. 直接验证。用DRL训练一个Policy并验证其效果。可以优先考虑DQN来验证,因为DQN收敛速度较快。
d.c. 缺省验证。为了验证每个状态信息的作用大小,可以正常输入其他信息,而将目标信息取合理区间内的定值。
4. 总结。状态空间与回报函数的设计水乳交融,往往修改了其中一个,另一个也需要相应作出改变。
## 第五章 回报函数
1. 通过将任务目标具体化和数值化,reward的设计体现了对任务逻辑的理解程度,决定了agent最终能否学到期望的技能,并直接影响算法的收敛速度和最终性能。
2. 主线reward和稀疏reward问题。与最终目标直接相关的称为主线reward。但是action空间太大,只有主线reward导致中间缺乏有效信号来指导agent向正确的方向前进,这一现象称为稀疏回报问题(Sparse Reward Problem)。显然,制定义了主线reward的任务几乎都是稀疏回报问题,对数据学习效率低下的RL算法而言,学习难度很大。
3. 当稀疏回报加上高难度探索(Hard Exploration),DRL几乎不可能完成学习。针对稀疏回报问题,有很多方法,比如鼓励agent探索未见过的状态,提高正样本利用率,或者用遗传算法或者进化策略代替RL学习Policy网络。我们的目标是试图通过reward设计来规避稀疏回报。
4.目标分解和辅助reward。将主任务目标分解为子目标,并分别给予合理的奖励或者惩罚(credit assignment)-辅助reward。为了保证主线任务的核心地位和吸引力,各种辅助reward的绝对值都设置的相对较小。
4.1 目标分解。Agent在环境中探索需要获得反馈,即刚刚决策的好不好,反馈越及时学的越快。每设计一个reward项,就应该回过头检查状态空间中是否包含了直接过间接相关信息,以及包含的信息是否足够高效,有没有改进空间。
4.2 杜绝异常行为。避免reward设计中的绝对值大小差异过大,比例失调。
4.2.1 贪婪,辅助reward过大或者辅助目标数量不可控,导致Agent一直通过辅助目标刷分。实际上,除了主线reward应该提供正向奖励意外,其他辅助reward最好都设置为惩罚项,除非某个子目标与主线事件之间存在强关联。
4.2.2 胆怯。惩罚项过多绝对值相对于主线reward过大。可以减小惩罚项绝对值,或者适当降低折扣因子。
4.2.3 鲁莽。惩罚项reward太小。
4.3 Reward Shaping,代表某种势能函数,与最终目标的差距决定了势能大小,距离最终目标越近,所获得的reward越大。
5. Optimal Reward Problems。针对特定任务,比如小车导航到终点,是否存在一组最优reward使得DEL算法在同等条件下收敛最快。答案是肯定的,但是很难找到,ORP问题。解决方法包括暴力搜索,基于在线策略梯度的PGRD,分层强化学习,遗传算法,Bayes方法等等。
6. 总结。Reward设计的原则是:尽可能稠密,最好每步都有反馈,能够反映任务目标/子目标逻辑,与状态空间相呼应,控制好各项取值和相对大小,避免异常行为,适时采用Reward Shaping.
## 第七章 训练
1. 训练开始前
1.1 可视化随机环境,观察随机条件下是否出现预期目标,借此估计任务复杂程度。
1.2 数据预处理。实时打印state和reward,观察取值是否正常。推荐无条件进行状态空间归一化和reward rescale & clipping,实践证明这两个操作在收敛素的和最终性能上都会明显提升。***在后续实践中尝试。***
2. 训练进行中
2.1 DRL模型对超参数十分敏感。所以***收敛为第一要务***。
2.2 DRL通用超参数***(折扣因子,网络结构,学习率)***
2.2.1 折扣因子$Gamma$。调节近远期影响,取值范围(0, 1]。$Gamma$越大,agent往前考虑的步数越多,但训练难度越高。 选取原则:***在算法能够收敛的前提下尽可能的大。***在实践中有个经验公式$1/(1-Gamma)$,用来估计agent做决策时往前考虑的步数。 Frame Skipping,在DRL中agent看得远表面上是指向前考虑的步数多,实质上是指agent向前考虑的系统动态演化跨度大。
2.2.2 网络结构。网络类型主要取决于状态空间设计,如果状态信息是向量式的一维标量,则适合使用全链接。如果之前的经验对当前决策很有参考意义,就适用RNN。 网络深度对于DRL来说一般两到三层,不以过深。
2.2.3 学习率 大了收敛快,稳定性差,小了收敛慢。
2.3 DRL特色超参数(buffer size, 起始训练时间,batch size, 探索时间占比,最终epsilon,目标网络更新频率)
Buffer size指的是DQN中用来提高数据效率的replay buffer的大小。通常取1e6,但不绝对。Buffer size过小显然是不利于训练的,replay buffer设计的初衷就是为了保证正样本,尤其是稀有正样本能够被多次利用,从而加快模型收敛。对于复杂任务,适当增大buffer size往往能带来性能提升。反过来过大的buffer size也会产生负面作用,由于标准DQN算法是在buffer中均匀采集样本用于训练,新旧样本被采集的概率是相等的,如果旧样本或者无效样本在buffer中存留时间过长,就会阻碍模型的进一步优化。总之,合理的buffer size需要兼顾样本的稳定性和优胜劣汰。顺便说一句,针对“等概率采样”的弊端,学术界有人提出了prioritized replay buffer,通过刻意提高那些loss较大的transition被选中的概率,从而提升性能,这样又会引入新的超参数,这里就不做介绍了。
起始训练时间的设置仅仅是为了保证replay buffer里有足够的数据供二次采样,因此与batchsize有直接关系。Batchsize指的是从replay buffer中二次采样并用于梯度计算的batch大小,和CV任务中的设定原则基本一致,即兼顾训练稳定性和训练速度,也没啥好说的。
探索时间占比和最终epsilon共同决定了DQN探索和利用的平衡。ε-greedy策略在训练开始的时候,随机选择action的概率p=1,探索力度最大;随着训练进行p逐渐线性下降直至达到最终epsilon保持恒定,之后DQN的训练将以利用为主而只保留少量探索。因此,最终epsilon取值在区间[0,1]内靠近0的一端。探索时间占比指的是p从1下降到最终epsilon的时间占总训练时间的比例,在(0,1)内取值,用来调节以探索为主到以利用为主的过渡。通常来说,复杂任务的探索时间占比应设得大一些,以保证充分的探索;最终epsilon不宜过大,否则影响模型最终阶段“好上加好”的性能冲刺,因为最好的状态往往是在足够好的Q网络指导下才能探索到的,训练后期过强的探索干扰了习得知识的利用,也就阻碍了性能的进一步提升。
标准DQN引入了一个延迟更新的目标网络用来计算Q的目标值,避免Q网络误差的“自激效应”,并借此来提高训练稳定性。目标网络更新频率就是用来控制这个延迟程度的,时间到了就把Q网络的参数整个复制过来。通常情况下根据具体问题,参考Q网络的更新周期设定,比如Q网络每1个step更新一次,目标Q网络可以设定每500个step更新一次。
2.3.2 DDPG
DDPG的特色超参数主要包括:buffer size,batchsize,目标网络软更新参数τ,探索噪声等。其中很多超参数与DQN类似,比如buffer size和batchsize,这里就不重复介绍了。
DDPG也使用了目标网络(目标Q网络和目标Policy网络)稳定训练,不同的是DDPG的目标网络与主网络更新频率相同,稳定效果来自于软更新(soft-update),即(1-τ)*target + τ*main,τ取很小的值(DDPG paper中建议0.001)限制每次更新的幅度。
DDPG值得特别介绍的是探索噪声及其参数。由于policy网络输出确定性action,DDPG的探索依靠在输出action空间叠加噪声来实现。可选的噪声类型主要包括Gaussian噪声和DDPG paper推荐的ou噪声(Ornstein-Uhlenbeck),后者相对于前者主要是增加了噪声强度逐渐衰减的功能。这两种噪声的主要参数是噪声方差,方差越大探索力度越强。虽然论文推荐使用ou噪声,但我在实践中发现ou噪声并不一定比Gaussian噪声效果好,还是要看具体任务。
后来DeepMind又提出了adaptive parameter noise,抛弃了在输出层叠加噪声的方法,转而采用在policy网络靠近输出的若干层网络参数上叠加噪声,优点是探索更充分,毕竟参数噪声的影响范围更大,而且可以根据实际情况自适应调节探索力度。类似地,我发现参数噪声在有些任务上效果不错,但在另一些任务中不如传统噪声。综上所述,关于不同噪声的优劣没有确定性结论(局限于我的个人经验),具体选择哪种噪声,还要实际试过才知道。
此外,值得一提的是Q网络和policy网络采用了不同的学习率,且一般Q网络的学习率比policy网络大一个数量级,比如前者用1e-3,后者用1e-4。这样做的原因是,用于更新policy网络的梯度完全来自于Q网络,两者地位不是对等的。
2.3.3 A3C
作为on-policy方法,A3C与前两种DRL框架有很大不同,无论是算法原理还是超参数设置。A3C的特色超参数包括:采样环境数量,episode长度,entropy系数,V网络系数,GAE factor,PPO cliprange(这里就默认采用PPO作为稳定训练的措施)等。
我们之前提到过A3C在A2C的基础上增加了对多核并行采样的支持,从而使探索效率大幅提升,绝对训练时间得以显著缩短。因此,并行采样的环境数量越多,A3C的优势也越明显,该参数的设置主要取决于可用的硬件资源。
A3C的训练基于episode(或trajectory),将其中每个中间state到episode结束时的Return作为目标值拟合一个V网络,并用V网络作为baseline指导policy网络的更新。为了便于训练,通常每个环境都采集固定长度的episode并返回主进程中拼成一个batch。Episode越长,每次计算梯度时的数据量越大,但消耗内存也越多。Episode长度通常取4096, 2048, 1024等2的次幂,原因是更新网络参数时整个batch还会再分成minibatch(2的次幂比较好分),遍历若干个epoch,从而提高数据利用率,注意minibatch不能太大,否则有可能导致“学不动”的现象。在实际应用中,除了考虑内存开销,episode长度选取也跟任务难度息息相关。以小车导航为例,训练刚开始时agent可能需要探索很久才能幸运地抵达终点,episode长度最好能囊括整个探索过程,这样中间状态与理想状态(到终点)间的演进关系就很容易学习到。当然,episode不可能无限长,如果探索难度实在太高,那也只好提前终止探索,把截断的部分放到下一个episode中。
A3C算法的loss由三部分组成:policy loss,value loss和entropy loss。其中entropy loss项的系数是一个非常重要的超参数,对收敛速度和最终性能有直接影响。我在算法选择篇介绍A3C的探索-利用平衡时,说过随着训练进行policy输出的action分布的variance会越来越小,反映到统计指标上就是entropy越来越小。这本来是一个自然发生的过程,不需要人的干预,然而DRL训练早期往往受到各种local minima的干扰,容易陷入“拣了芝麻丢了西瓜”的怪圈。为了避免模型过早迷失方向,A3C加入了entropy loss用于强迫policy输出不那么“尖锐”的action分布,从而起到加强探索的效果。Entropy系数负责调节这种“强迫”力度,合理的系数既能确保训练早期充分探索从而使模型向正确方向前进,又能使模型在训练中后期充分利用学到的技能从而获得高性能。对于不同任务,最优entropy系数往往各不相同,需要若干次试错才能找到。比如在训练开始后policy entropy快速下降说明模型陷入了局部最优,根本没学到有用技能,这时就应该提升entropy系数;如果训练很长时间policy entropy仍然未下降或者下降缓慢,说明模型探索过头了,学到的知识被随机性淹没,无法进一步用来提升性能,此时应该适当降低entropy系数。
V网络系数是A3C loss中value loss项的系数,通常取0.5(policy loss系数默认是1),在实践中不太需要修改。
由于on-policy算法对数据的使用方式是“现采现用,用完就扔”。为了防止policy跑偏,在错误道路上越走越远,需要通过特定方法限制其每次参数更新的幅度。PPO(proximal policy optimization)就属于这一类方法,最早由OpenAI提出。PPO与更早的TRPO,核心思想都是针对更新前后policy输出的KL散度设定阈值,但PPO通过一个简单的clip操作大大简化了运算,兼顾了效率和性能。PPO相关的参数主要是cliprange,通常取略大于0的小数,代表使policy更新前后KL散度控制在1-cliprange到1+cliprange之间,超出该范围的梯度直接被忽略(相当于对应数据被弃用)。Cliprange越小训练越稳定,越大越节省数据。一般在训练早期取较小的值,比如0.2,保证训练平稳进行;到训练后期可以适当放大,因为此时policy已经足够优秀,所采集数据中正样本比例非常高,可以放心利用。此外,PPO原paper提出了General Advantage Estimation,相应增加了一个超参数GAE factor,其作用跟折扣因子γ类似,也是在(0,1]内取值,一般都默认取0.95。
3. 训练收敛后
3.1 观察Value网络对Returens拟合的精度如何,value loss 是否还有进一步下降的空间。 value网络评估标准是explained variance,计算公式是$1-Var(return-value)/Var(return)$。
3.2 观察entropy是否处在合理范围内,相对于action维度是否过高或者过低。
—完—