论文笔记:DDPG算法结构
实验室最近有个项目可能要用上一些强化学习和GNN相关的东西,只好疯狂看论文了。
这篇文章是DeepMind开发的面向连续动作空间控制的RL算法,据说效果不错。
论文地址:Continuous control with deep reinforcement learning
DQN:Q-function(状态价值函数)
- 输入→状态,输出→动作空间的预期奖励
- 输入→状态、动作对,输出→这个动作的预期奖励
- 问题:只能应用于动作空间离散化的问题,否则Q函数计算量会极大。
DDPG提出的解决方案:
- 使用actor-critic双网络。算上训练过程,实际上共有四个网络:
- Actor current network,负责策略网络参数$\theta$的更新,并且根据环境给出动作。
- Actor target network,参数$\theta^{ \prime }$定期从$\theta$复制。从replay buffer里采样的状态生成对应的动作。
- Critic current network,负责价值网络参数$w$的迭代更新,并且给出当前的$Q ( S , A , w )$。
- Critic target network,参数$w^{\prime}$定期从$w$复制,计算目标$Q ( S , A , w )$
- target-current的机制是为了防止参数爆炸,将两个网络固定作为目标进行训练,然后定期复制训练中网络的参数(但是DDPG中不是直接复制,是用软更新)到目标网络上。
损失函数:DDPG的策略是确定性的,所以不需要对动作空间作积分来取期望。对于Actor网络,原文定义的损失梯度是
对于Critic网络,用的是均方差损失
$L = \frac { 1 } { N } \sum { i } \left( y { i } - Q \left( s { i } , a { i } \mid \theta ^ { Q } \right) ^ { 2 } \right)(2)$,其中
是用从replay buffer采样的一组$\left( s { i } , a { i } , r { i } , s { i + 1 } \right)$算出来的。
- 使用actor-critic双网络。算上训练过程,实际上共有四个网络:
DDPG使用的特殊机制
- 类似DQN的Replay Buffer机制:用一个队列作为缓存,设定固定大小,维护$\left( s { t } , a { t } , r { t } , s { t + 1 } \right)$。每次从这个队列里采样一个mini-batch进行训练。
- Soft target update软更新:不直接把更新后的权重赋值到网络里,而是创建actor和critic的拷贝,用拷贝计算目标进行训练,训练后的权重用 $\theta ^ { \prime } \leftarrow \tau \theta + ( 1 - \tau )\theta^{ \prime }$ 的方法($\tau \ll 1$)更新回去。
- 随机化探索策略:通过用$A = \pi _ { \theta } ( S ) + \mathcal { N }$取代原本的动作$A$。
- 原文中用奥恩斯坦-乌伦贝克过程过程生成噪声$\mathcal { N }$。OU过程在时序上具备很好的相关性,可以使agent很好的探索具备动量属性的环境,表达式为$d x { t } = \theta \left( \mu - x { t } \right) d t + \sigma d W$,其中$xt$是我们使用的变量,$\mu$是这个变量的均值,$W$表示维纳过程(一维下的概率密度函数:$f { W _ { t } } ( x ) = \frac { 1 } { \sqrt { 2 \pi t } } e ^ { - x ^ { 2 } / 2 t }$,数学期望为0,方差为t),$\sigma$是维纳过程(其实就是布朗运动)带来的噪声的权重。
- 这个方法在惯性系统上(例如Pendulum)会提升探索效率,但是在其他情况下做实现的时候不一定要用这个方法。
完整的算法过程:
输入:
- 四个初始化的网络,分别使用参数$\theta,\;\theta^{\prime},\;w,\;w^{\prime}$
- 衰减因子$\gamma$
- 软更新系数$\tau$
- 从Replay Buffer采样的批量$m$
- 最大迭代次数$T$
- Episode的数量$M$
两个网络的更新频率$f$
输出:
训练完成的Actor和Critic网络,分别使用$\theta$和$w$。
过程:
- 初始化四个网络和Replay Buffer $R$
- for i = 1, $M$ do
- 初始化一个随机过程$\mathcal{N}$,获取一个随机的初始状态$s_1$
- for t = 1, $T$ do
- 使用当前的Actor生成一个动作$at =\mu \left( s { t } \mid \theta \ \right) + \mathcal { N } _ { t }$
- 执行$at$,从环境获取$s{t+1}$和$rt$,将$\left( s { t } , a { t } , r { t } , s _ { t + 1 } \right)$放入$R$
- 从$R$里采样大小为$m$的minibatch,分别计算对应的$y_i$,然后用这些值去计算Loss(2),更新Critic current
- 用损失梯度(1)更新Actor current
- 用软更新方法更新3和4中得到的参数到Actor target和Critic target中