深度强化学习血泪调参史:从人工智障到人工智能

it2022-12-27  87

深度强化学习血泪调参史:从人工智障到人工智能——粗调

背景应用深度强化学习经常遇到的问题调参大法针对问题1:不能达到预期效果,AI宛如神经智障。导致这种问题的源头可能有太多太多种,但是一旦遇到这种问题,建议从以下几个方面入手:针对问题2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊。产生这种情况的原因很有可能是神经网络的初始化存在问题,举例:神经网络的初始化输出落在了[10,20]的区间内,但是你期望的reward输出却在[-1,1]的区间内,导致神经网络存在很长的一段距离才能训练到合适的参数(有时候根本就训练不出来)针对问题3:神经网络不收敛。产生这种情况的原因有很多种,下面分别讨论吧其他通用的建议

背景

初学者在学习了强化学习或深度强化学习理论之后,总想找个应用背景验证一下自己所学的知识。然而,在没有实践经验的条件下,很容易遭受当头一棒,大部分人可能从此开始深度强化学习的从入门到放弃。我也曾经(其实经常)产生放弃的想法,但是好在能够坚持下来,在电脑前死磕代码,一行一行地调试,终于能够解决大部分遇到的问题。

首先说明,一般的多阶段规划问题,以目前的DRL算法能力来看,都能够有不错的表现,如果效果不好,大概率是自己代码的问题。

为了避免各位同学重走深度强化学习的万里长征路,我把我自己总结的调参经验,结合网络上公开的知识,形成这个博客的内容:从人工智障到人工智能。

这篇博客的目的是:先抛开效果不说,能够先让强化学习的神经网络收敛,在下篇博客中将继续深入讲解如何调整具体的算法参数,来搜索使效果最好的那些参数空间

应用深度强化学习经常遇到的问题

1:不能达到预期效果,AI宛如神经智障 2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊 3:神经网络不收敛,AI的表现时好时坏

调参大法

针对问题1:不能达到预期效果,AI宛如神经智障。导致这种问题的源头可能有太多太多种,但是一旦遇到这种问题,建议从以下几个方面入手:

(1)仔细检查代码,尤其是状态的输入是不是和你预期的一样,有时候状态向量中一位的0和1的区别就能让AI疯狂 (2)再次仔细检查代码,看看保存到记忆库(如果使用的是DQN)中的数据,是否能够一一对应,另外,在计算loss函数的时候,一定要保证,是针对同一个状态下的同一个action,计算预测价值和真实价值之间的gap,作为loss值,千万不要搞错,否则,AI不智障是不可能的 (3)检查神经网络的结构,尤其是最后输出的时候,建议不要激活函数(除非你用基于策略的强化学习算法,最后输出的激活函数通常是sigmoid),因为激活函数毕竟有可能导致信息空间的扭曲,从而导致可能输出空间不包含你想要的值,中间隐含层的输出函数建议用Relu (4)仔细检查环境的逻辑,是否存在同一个状态输入,对应不同reward的情况,如果存在这种不一致的情况,AI将不知所措,因为你一会告诉AI在这个状态下要这么做,一会又告诉AI要那样做

针对问题2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊。产生这种情况的原因很有可能是神经网络的初始化存在问题,举例:神经网络的初始化输出落在了[10,20]的区间内,但是你期望的reward输出却在[-1,1]的区间内,导致神经网络存在很长的一段距离才能训练到合适的参数(有时候根本就训练不出来)

(1)调整神经网络的初始化参数,一般就是w和b的初始化。怎么调整呢,当初始化输出和你期望的输出差不多落在同一区间的时候,基本就可以了,注意,只是基本可以,如果想要更好的效果,则需要大师级的调参了,这里就不赘述了,请各位同学自己查资料

针对问题3:神经网络不收敛。产生这种情况的原因有很多种,下面分别讨论吧

(1)学习率太大,导致神经网络在一个区间内来回跌宕,就是收敛不到最优点。解决办法:调整学习率,一般都是小于0.001的。另外,还可以采用这种办法:随着训练逐渐减小学习率,这样,既可以在开始的时候较快的训练神经网络,又能保证当神经网络训练到差不多的时候,避免产生大规模动荡 (2)仔细检查环境的逻辑,是否存在同一个状态输入,对应不同reward的情况,如果存在这种不一致的情况,AI也有可能会动荡,因为你一会告诉AI在这个状态下要这么做,一会又告诉AI要那样做 (3)环境的reward是否有最优,如果你这个

其他通用的建议

(1)增加记忆库,设置到10万-100万级别;记忆库太小,选择的训练样本之间很有可能不是独立的,即有前后关联,这样是不满足DQN训练的前提条件的(具体理论参考教学书籍) (2)加一行代码:改为Double-DQN。这个可以尝试着去做一下 (3)检查状态的描述是否合理,如果你自己都不能够基于当前的状态做出正确的决策,那怎么期望AI可以做到呢?注意,初学者经常犯先入为主的错误,自以为状态的描述没有问题,实际上,状态的描述经常是有问题的。比如我们之前做过的一个搜救项目,在一个二维网格上设置目标可能的概率,我们期望AI能够在20步之内遍历尽可能大的概率区域,一开始我们的输入就是概率矩阵,后来才发现,根据这个矩阵,根本就无法知道当前的Agent位于哪个位置,当时也是太傻了。后来做了如下更改:1)AI走过的区域,值改为-1,AI当前的位置,值设为1,这样就可以保证AI既知道历史走过的路径,又知道当前的位置。

(4)如果能够保证每个action获得即时奖励,那就用即时奖励。如果非得用回合奖励(也就是玩完一局游戏后才有奖励,每一步action没有奖励),那也尽量给每个action赋予一个即时奖励,然后把回合奖励分配给这一回合的每个action中(具体分配方法,可以参考具体问题背景,如果前面几步的action重要,就分配更多的回合奖励给前面的action,比如在上面的问题中,如果你希望AI可以尽早地搜索概率大的区域,就可以把回合奖励更多地分配给前面的action中) (5)为了加快效率,可以一开始先用一个较大的学习率,让神经网络迅速收敛,然后看AI是否能学到一点东西,如果AI在向着正确的方向训练,说明算法的总体框架基本没问题,然后再调整学习率开始真正训练 (6)状态空间记得要进行归一化操作 (7)reward进行 rescale和clipping操作,实践证明这两个操作无论在收敛速度还是最终性能上都会带来明显提升,参考形式为: r = c l i p ( r / ( s t d ( R e t u r n ) + e ) , − 10 , 10 ) r=clip(r/(std(Return)+ e ),-10,10) r=clip(r/(std(Return)+e),10,10) [1]

[1]https://zhuanlan.zhihu.com/p/99901400
最新回复(0)