ICLR 2021高分论文——On-Policy强化实践经验
概述
原文:What Matters For On-Policy Deep Actor- Critic Methods? A Large-Scale Study
这篇论文真的非常及时,之前自己实践的时候全靠“合理性”、借鉴,强化算法这么多超参怎么调?
看了这篇文章,自己画了个on-policy强化的全景图,并直接给出文章里推荐的实验设置。
(这可是经过25万个agent训练的实验指导哦,真的财大气粗~)
熟悉的兄弟,不想看细节,直接看推荐实验设置。
一、on-policy 流程图
以小节的形式梳理一下该图
1.1 环境 T ( s ′ ∣ s , a ) \mathcal T(s'|s,a) T(s′∣s,a)
- 环境基于当前状态 s s s,接收来自策略 π ( a ∣ s ) \pi(a|s) π(a∣s)的动作action执行,并反馈奖励 r r r和下一状态 s ′ s' s′
- 环境内部可能会有一个最大episode的长度,比如T=1000就强行终止,而不是真正的结束。
- 环境主要是与策略进行交互,把经验experience存储进memory
- 需要注意的是,进入策略的输入一般需要进行Normalization,如observation filter,running_mean_std等
1.2 策略 π ( a ∣ s ) \pi(a|s) π(a∣s)
- 策略的输入一般是normalized后的data。这与图像数据的预处理一样,主要是避免不同数据类型数值扰动的干扰
- 策略的输出一般是logits,要通过action-distribution的设计,才能真正作为环境中的动作执行。这与图像数据的softmax对网络的输出logits归一化成概率形式进行分类一样。
- 策略的表示形式,神经网络。这就涉及到了网络层数(深度)、每层神经元个数(宽度)、激活函数类型、网络架构、参数初始化方式等与深度网络相关的超参进行考虑,即图中的Network initilization/MLP Layers那几个。
- 有了策略,就需要策略的目标,最常见的是最大化期望累积奖励即 J ( π ) = E τ ∼ π ( τ ) [ r ( τ ) ] J(\pi)=\mathbb E_{\tau\sim \pi(\tau)}[r(\tau)] J(π)=Eτ∼π(τ)[r(τ)]。围绕着该目标有许多算法如REINFORCE、PPO、V-trace等objective。
- 策略目标有了,需要一些常规的Regularization防止过拟合,如Entropy正则增强策略的多样型、约束behavior policy和learned policy之间的KL Divergence来对策略更新实行一定的约束,其不同的实现方式、约束对象的选取,又形成了许多不同的正则方法。
- 策略选了网络的表示形式、最大化奖励的目标、防止过拟合的正则化方法后,就需要优化器Optimizer。优化器又有不同的类型Adam、RMSprop,每种类型有不同的超参。然后学习率一般有schedule来调整,比如一开始学快点,学习率大一点,后面学慢点,这个schedule可通过线性衰减、指数衰减等方式设定。
总结:光一个策略的更新,就有输入、输出、网络结构设计、目标、正则化方式、优化器等因素干扰,更不用说,经过算法的推导,策略更新还很取决于Advantage的”估计“
1.3 优势函数 A ( s , a ) A(s,a) A(s,a)
优势函数的估计方式有很多(V-trace、N-step、GAE等),其中大部分需要用到状态值网络 V ( s ) V(s) V(s),细节发表在2016 ICLR的GAE:High-Dimensional Continuous Control Using Generalized Advantage Estimation
比如:
V
^
t
G
A
E
=
(
1
−
λ
)
∑
N
>
0
λ
N
−
1
V
^
t
N
≈
V
π
(
s
t
)
A
^
t
G
A
E
=
V
^
t
G
A
E
−
V
(
s
t
)
≈
A
π
(
s
t
,
a
t
)
\begin{array}{l} \hat V_t^{GAE}=(1-\lambda)\sum _{N>0}\lambda^{N-1} \hat V_t^{N}\approx V^\pi(s_t)\\ \hat A_t^{GAE}=\hat V_t^{GAE}-V(s_t)\approx A^\pi(s_t,a_t) \end{array}
V^tGAE=(1−λ)∑N>0λN−1V^tN≈Vπ(st)A^tGAE=V^tGAE−V(st)≈Aπ(st,at)
这些优势函数的计算,一般都需要在一条trajectory上计算,因此即要Value Network也要从Memory的trajectory结合计算。
1.4 状态值函数 V ( s ) V(s) V(s)
既然优势函数的计算需要较为准确的值函数,于是假设构建一个网络来表示值网络。这样关于策略的那些考虑也全搬过来了。(网络结构、宽度、深度、参数初始化方法、激活函数、输入输出Normalization之类的)
- 首先设定一个目标,通常用TD error/Bellman error的MSE进行估算
- 其次,考虑目标构建角度的Regularization或目标数值角度的Normalization
- 最后,从Memory中Sample一些Batch_Data进行更新
1.5 Memory
Batch_data究竟是什么?Trajectory中来?还是Transition中来?(一般是Transition)
如果是Transition的话,那如何把Trajectory处理成Transition?怎么处理到达episode最大长度的强制终止与真正结束状态?
怎么从Transitions中sample一个Batch? (一般随机,但可以根据重要性采样,如Prioritized Experience Replay这篇文章就针对这个点)
Sample出一个Batch后,要对值函数 V ( s ) V(s) V(s)更新几次?
二、论文推荐的实战技巧
2.1 PPO Objective
- 推荐使用PPO objective
- 超参数(clip importance weight)优先推荐值0.25,推荐范围在 0.2 − 0.3 0.2-0.3 0.2−0.3
- 另外可尝试超参数 0.2 − 0.5 0.2-0.5 0.2−0.5
基于此的进一步实践猜想:(超参数衰减合理嘛?记得腾讯有篇Paper提出过double-clip?)
理论直觉:(从实战推荐技巧倒推“合理性”)
- PPO Objective的理论推导,实际上就包含了更新前后目标的单调不减性
- 理论不减性落实到具体操作上,体现在PPO clip上,损失了一些“单调不减性”的程度
2.2 Network Architecture
- 策略网络最后的“MLP层”,初始化的权重参数建议缩小一百倍(相对于其它层的参数初始化方式)
- 策略网络最后的”action distribution层“,处理standard deviation时,将网络输出logits通过“softplus激活函数”映射到标准差std。初始化时对标准差std减去一个微小的增量。(一般控制初始化时的std数值为0.5)
- 对从action distribution中根据mean和std采样出来的动作值,经过tanh激活函数与环境的action limit 转变成 环境中实际有意义的动作值。
- 值网络的MLP宽度应该要比策略的MLP宽度要宽,深度两三层差不多。比如值网络一层MLP宽度为1024,而策略网络一层MLP宽度为128;或值网络宽度为256,策略网络为32等
- 其它MLP层的激活函数,推荐使用tanh。relu效果非常一般
理论直觉:
- 值函数的变化较大,需要值网络的容量足够大才能捕捉,因此值网络更宽(针对宽度)
- 策略网络过宽,可能结构复杂度比问题最优策略的结构要复杂,就容易过拟合,反而性能差。所以策略网络的宽度设定取决于问题结构的复杂度(针对为什么策略网络不那么宽)
- 一开始不希望噪声对策略造成过多的干扰,使得策略的学习更多拟合到噪声而不是奖励函数上,因此初始化时要注意对衡量动作值“噪声”的标准差进行适当降低,让注意力多集中在reward上!(针对策略网络最后MLP层的处理)
2.3 Data Normalization
- 策略网络 π ( a ∣ s ) \pi(a\mid s) π(a∣s)的状态输入进行State Normalization非常关键!
- 值网络 V ( s ) V(s) V(s)的Normalization与具体环境有关,可能很有用,可能很一般
- 如果在意那么一点的性能提升,可以考虑网络更新时的Gradient Clipping
- Advantage Normalization用处不大
理论直觉:
- 状态归一化,就像化简,在各同向性的空间中进行映射,肯定更好(但empirical的mean和std的估计可能会出现误差)
- 值函数 V π ( s ) V^\pi(s) Vπ(s)的归一化直觉上很有问题。一是这个网络还没拟合好,为什么要用它来normalized?二是,每个策略 π ( a ∣ s ) \pi(a|s) π(a∣s)对应的 V π ( s ) V^\pi(s) Vπ(s)都只是更新几个batch而已,这个 V V V不断在变动,维持它的mean和variance很不合理。因此,从自身理解角度看,这一步用处不大。
- Advantage Normalization同理,因为要经过值函数 V ( s ) V(s) V(s)进行估计,本身学不准的 V ( s ) V(s) V(s),没必要进行Normalization
2.4 Advantage Estimation
- V-trace和GAE方式差不多,相对来说V-trace比较适合off-policy
- on-policy推荐使用GAE,discount factor λ \lambda λ推荐值为0.9,推荐范围在0.9-0.99
为什么一般通过拟合
V
(
s
)
V(s)
V(s)来估计
A
(
s
,
a
)
A(s,a)
A(s,a),大多不直接拟合
Q
(
s
,
a
)
Q(s,a)
Q(s,a)呢?
答:Q(s,a)拟合的空间包括了动作空间,空间的扩大,拟合所需的样本就越多,准确率就会下降,而且当action是连续值,这个
(
s
,
a
)
(s,a)
(s,a)组成的空间也就更大了。
这个不是炼丹,有期望、方差的理论保证,不需要直觉。
2.5 Memory
- 对于环境而言足够长的episode length,怎么处理强制结束与真正结束并不重要,随便选一种即可
- 对于image、frame这种observation当作状态,可适当的skip frame
- 从trajectories变成transitions再到mini-batch时,为了加速适当使用parallel environments,增大batch_size,进行了一次策略迭代后,重新计算advantages这一步比较重要!
2.6 Optimizers
- 无脑Adam,momentum 推荐值 β \beta β,初始学习率 3 × 1 0 − 4 3\times 10^{-4} 3×10−4
- schedule:随着迭代次数,线性衰减学习率即可(会有一点点提升)
2.7 Policy Regularization
- Entropy term有点用
- KL Divergence / Decoupled KL Divergence 实验表明无特别用处
可能原因是:PPO Objective的Clipping操作本身就是一种Regularization,其次是Policy 最后MLP层特殊的初始化操作,本身
也是一种不错的Regularization
总结
都是在On-Policy的Setting下跑的。
一般来说,跑实验就按照文中推荐设定就是了。