目录
参考《深入浅出强化学习》
DeepMind发表在Nature上的文章Human-level control through deep reinforcement learning
最主要创新点是两个:
大体框架是复用传统强化学习里的Qlearning方法。Qlearning包括两个关键点:
a
的策略)是ϵ−greedy
策略maxaQ(st+1,a)
,当前状态st+1
下,使用各种a使Q(st+1,a)
达到的最大值),即,是最大的Q
,与行动策略里随机选一个a
得到的Q
不同rt+γmaxaQ(st+1,a)
)来更新当前的行为值函数注意,时间差分方法其实包括了异策略和同策略两种,
ϵ -greedy
策略)(书p77-79)Qlearning的算法流程如下:
- 初始化
Q(s,a),∀s∈S,a∈A(s)
,给定参数α,γ
- Repeat
- 给定起始状态
s
,并根据ϵ−greedy
策略在状态s
选择动作a
- Repeat
- 根据
ϵ−greedy
策略选择动作at
,得到回报rt
和下一个状态st+1
- 使用时间差分方法更新行为值函数
Q(st,at)←Q(st,at)+α[rt+γmaxa(Q(st+1,a))−Q(st,at)]
s=s′
,a=a′
- Until
s
是最终状态- Until 所有的
Q(s,a)
收敛- 输出最终策略:
π(s)=argmaxaQ(s,a)
DQN对Qlearning主要进行了如下三个修改:
行为值函数Q(s,a)
用参数为θ
的非线性参数逼近Q(s,a;θ)
来近似
其实20世纪90年代就已经有用神经网络逼近行为值函数的方法了,但常常出现不稳定不收敛的情况。
deepmind的创始人Hassabis是神经科学的博士,他是研究人类大脑中负责记忆和学习的主要部分——海马体的。在人类睡觉时,海马体会把一天的记忆重放给大脑皮层。
训练神经网络时,存在的假设是训练数据是独立同分布的,但通过强化学习采集的数据间存在关联性,利用这些数据进行训练,神经网络就不会稳定。而经验回放就可以打破数据间的关联。
经验回放的技巧可以打破数据间的关联性,这个技巧在2013年的NIPS已经发布了,而2015年的Nature论文进一步提出了目标网络,进一步降低数据间的关联性。
正常的Qlearning更新值函数的方法如下:
Q(st,at)←Q(st,at)+α[rt+γmaxa(Q(st+1,a))−Q(st,at)]
但现在使用卷积神经网络来逼近,所以需要更新的是参数θ
,使用的方式自然是梯度下降:
θt+1=θt+α[r+γmaxa′(Q(s′,a′;θ))−Q(s′,a′;θ)]∇Q(s,a;θ)
而这里的r+γmaxa′(Q(s′,a′;θ))
是TD目标,在计算maxa′(Q(s′,a′;θ))
时用到的网络参数为θ
。
在DQN之前,计算TD目标的动作值函数所用的网络参数θ
与梯度计算中要逼近的动作值函数所用的网络参数相同,这样就容易导致数据间存在关联性,从而使训练不稳定。
所以DQN的做法就是将TD目标的网络表示为θ−
,用于动作值函数逼近的网络θ
每一步都更新,而用于计算TD目标的网络θ−
则是每固定的步数才更新一次【这就可以使得在一段时间里目标Q值是保持不变的,从而使得在一段时间里能集中力量去优化真正的目标θ
,等真正的目标好一点了,再去更新θ−
】:
θt+1=θt+α[r+γmaxa′(Q(s′,a′;θ−))−Q(s,a;θ)]∇Q(s,a;θ)
DQN的训练算法如下:
- 初始化replay memory
D
,capacity设为N
- 使用随机权重
θ
初始化动作值函数Q
- 使用权重
θ−=θ
初始化目标动作值函数ˆQ
- For
episode=[1,...,M]
do
- 初始化事件的第一个状态(
x1
是第一张图片)s1={x1}
,并通过预处理得到状态对应的特征输入ϕ1=ϕ(s1)
- For
t=[1,...T]
do
- 根据概率
ϵ
随机选择一个动作at
- 如果小概率事件没有发生,就用贪婪策略选择当前行为值函数最大的那个动作:
at=argmaxa(Q(ϕ(st),a;θ))
【上面那行和这行就是所谓的行动策略,ϵ−greedy
策略】- 在模拟器中执行动作
at
,得到回报rt
以及图片xt+1
- 令
st+1=st,at,xt+1
,然后预处理ϕt+1=ϕ(st+1)
- 将transition
(ϕt,at,rt,ϕt+1)
存入D
。- 从
D
中随机sample出一个minibatch的transitions,(ϕj,aj,rj,ϕj+1)
- 令
yj={rjif episode terminates at step j+1rj+γmaxa′ˆQ(ϕj+1,a′;θ−)otherwise
- 对
(yj−Q(ϕj,aj;θ))2
的参数θ
进行一个梯度下降step的更新,θt+1=θt+α[r+γmaxa′(ˆQ(s′,a′;θ−))−Q(s,a;θ)]∇Q(s,a;θ)
- 每
C
个step,令ˆQ=Q
,即令θ−=θ
- End For
- End For
yi
的时候用的是目标网络ˆQ
和θ−
r+γmaxˆQ
与原网络Q
之差yi
是当前reward,基于状态st+1
再执行一个action得到的新的reward。而原网络Q
是当前的状态st
。st
,处理后是ϕt
,通过ϵ−greedy
得到Q
最大的at
at
,得到ϕt,at,rt,ϕt+1
,扔进replay buffer中ϕj,aj,rj,ϕj+1
ϕj+1
上再执行一个使得ˆQ
(注意,这里不是Q
)最大的动作a′
得到的reward:yj=rj+γmaxˆQ(ϕj+1,a′)
yi
和当前Q
的残差,梯度下降,更新当前Q
的参数:θ+=α(yj−Q)∇Q
C
步之后,把当前Q
的参数赋值给ˆQ
maxQ
的是当前状态+当前动作;maxˆQ
是下一状态+下一动作;Q
DQN无法克服Qlearning本身固有的缺点:过估计
过估计指的是估计的值函数比真实值函数大,Qlearning出现过估计的问题,根源在于其中的最大化操作:
对于表格型,值函数评估的更新公式:
Q(st,at)←Q(st,at)+α[rt+γmaxaQ(st+1,a)−Q(st,at)]
对于基于函数逼近的方法,值函数更新公式为:
θt+1=θt+α(Rt+1+γmaxaQ(St+1,a;θt)−Q(St,At;θt))▽θtQ(St,At;θt)
可以发现不管是表格型,还是基于值函数逼近的方法,更新公式中都有max操作,使得估计的值函数比值函数的真实值大。
如果过估计是均匀的,即值函数的每一点的值都被过估计了相同的幅度,那么由于最优策略是贪婪策略,即找最在的值函数所对应的动作,在这种情况下一不会影响最优策略(因为每个值函数都变大一样的幅度,所以原来最大的那个还是最大),这样因为强化学习的目标是找到最优策略,所以不会影响我们解决问题~
但实际情况中,过估计量并不是均匀的,所以会影响最终策略,使得最终策略并非最优!!
在Qlearning的值函数更新中,TD目标为:
YQt=Rt+1+γmaxaQ(St+1,a;θt)
在求TD目标YQt
时,首先需要选择一个动作a∗
,该动作a∗
应该满足在状态St+1
处使得Q(st+1,a)
最大,这就是动作选择。
选出a∗
后,利用a∗
处的动作值函数构造TD目标。
一般的Qlearning使用同一个参数θt
来选择和评估动作。
Double Qlearning将动作的选择和动作的评估分别用不同的值函数来实现,从而其TD目标为:
YDoubleQt=Rt+1+γQ(St+1,argmaxaQ(St+1,a;θt);θ′t)
所以,我们可以看出,动作的选择所选择的a∗
为
a∗=argmaxaQ(St+1,s;θt)
动作值函数网络的参数是θt
。当选出最大动作a∗
之后,动作评估的公式为:
YDoubleQt=Rt+1+γQ(St+1,a∗;θ′t)
所以,引入DQN就是Double DQN:
Deep Reinforcement Learning with Double Q-learning
将TD error修改为:
r+γQ(s′,argmaxa′Q(s′,a′,θ),θ−)−Q(s,a,θ)
其中
θ
是当前的网络参数,用来选择动作θ−
是前一步的网络参数(delayedθ
),用来评估动作因为原来的DQN就已经引入了目标网络θ−
,所以其实改动不大。
但注意!!区别在于,原来DQN的TD error是r+γQ(s′,argmaxa′Q(s′,a′,θ−),θ−)
,即动作选择和动作评估都是θ−
。而Double DQN动作选择是θ
,动作评估是θ−
参考书本,以及https://blog.csdn.net/u013236946/article/details/73161586
竞争网络(dueling net)从网络结构上改进了DQN,将动作值函数分解为状态值函数和优势函数,即:
Qπ(s,a)=Vπ(s)+Aπ(s,a)
以往的DQN都是直接用神经网络逼近Qπ(s,a)
,而Dueling DQN则是对Vπ(s)
和Aπ(s,a)
分别用神经网络来逼近。
Vπ(s)
表示静态的状态环境本身具有的价值。是一个scalar。Aπ(s,a)
(advantage function),表示选择某个Action额外带来的价值。是一个vector。更详细地,状态价值函数表示为
V(s;θ,β)
动作优势函数表示为
A(s,a;θ,α)
动作Q值为两者相加
Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α)
其中,θ
是卷积层的参数,β
和α
是两个支路全连接层的参数。
而在实际中,一般要将动作优势流设置为单独动作优势函数减去某状态下所有动作优势函数的平均值,这样做可以保证该状态下各动作的优势函数相对排序不变,而且可以缩小Q值的范围,去除多余的自由度,提高算法稳定性。
Q(s,a;θ,α,β)=V(s;θ,β)+(A(s,a;θ,α)−1|A|∑a′A(s,a′;θ,α))
这种竞争结构能学到在没有动作的影响下环境状态的价值V(s)
。如下图,在训练过程中,上下两行图表示不同时刻,左右两列表示属于V(s)
和A(a)
,(通过某种方法处理后)图中红色区域代表V(s)
和A(a)
所关注的地方。V(s)
关注于地平线上是否有车辆出现(此时动作的选择影响不大)以及分数;A(a)
则更关心会立即造成碰撞的车辆,此时动作的选择很重要。
论文中dueling net结合了DDQN(double dqn)以及优先级采样(Prioritized Experience Replay)的训练方式。
参考https://zhuanlan.zhihu.com/p/21547911
几个问题:
ϵ−greedy
的方法来探索状态空间,有没有更好的做法?解法: