关于DQN算法的一些细节,可以查看这个博客,讲的很细节。
主要参考博客
https://zhuanlan.zhihu.com/p/443807831
https://blog.youkuaiyun.com/qq_38689352/article/details/120004827
这个博客讲的不错的。我甚至都不敢照抄人家的语句,怕亵渎了人家的劳动成果。
其实上面的博客我都是不建议大家看的,包括我自己的这个博客,只是我自己的笔记和理解。我建议大家直接看这个视频教程,讲真的太好了。
一句话总结Deep Q Network
一般来讲,我们使用一个设计好的神经网络 Q ( s , a ; w ) Q(s,a;w) Q(s,a;w)近似最优策略价值函数 Q ∗ ( s , a ; w ) Q^{*}(s,a;w) Q∗(s,a;w),反应动作的好坏,指示Agent的行为,DQN输入当前的状态,输出采取每个行为的价值期望.
TD算法
通过设置TD target,减少TD error更新网络参数
造成高估现象的原因
TD算法导致高估真实的动作价值,原因主要有
- 最大化
m a x a Q ( s t + 1 , a ; w ) max_{a}Q(s_{t+1},a;w) maxaQ(st+1,a;w)
- bootstrapping
统计和机器学习中常常用到名为自举的技巧,强化学习中,这种技巧被概括为"using an estimated value in the update step for the same kind of estimated value",举一个例子
TD target部分依赖于估计
y
t
=
r
t
+
γ
m
a
x
a
Q
(
s
t
+
1
,
a
;
w
)
y_{t}=r_{t}+\gamma max_{a}Q(s_{t+1},a;w)
yt=rt+γmaxaQ(st+1,a;w)
我们从数学上解释两个导致高估的原因
最大化引起高估的原因
假设存在n个观测值
x
1
,
x
2
,
.
.
.
x
n
x_{1},x_{2},...x_{n}
x1,x2,...xn,再其上加上0均值的噪声得到随机变量
Q
1
,
Q
2
,
.
.
.
Q
n
Q_{1},Q_{2},...Q_{n}
Q1,Q2,...Qn,我们有
E
[
1
n
∑
i
=
1
n
Q
i
]
=
∑
i
=
1
n
x
i
E[\frac{1}{n}\sum_{i=1}^{n}Q_{i} ]=\sum_{i=1}^{n}x_{i}
E[n1∑i=1nQi]=∑i=1nxi
E
[
m
a
x
i
Q
i
]
≥
m
a
x
i
Q
i
E[max_{i}Q_{i}]\ge max_{i}Q_{i}
E[maxiQi]≥maxiQi
E
[
m
i
n
i
Q
i
]
≤
m
i
n
i
Q
i
E[min_{i}Q_{i}]\le min_{i}Q_{i}
E[miniQi]≤miniQi
对于实际动作价值
(
x
(
a
1
)
,
x
(
a
2
)
,
.
.
.
,
x
(
a
n
)
)
(x(a_{1}),x(a_{2}),...,x(a_{n}))
(x(a1),x(a2),...,x(an))的估计为
(
Q
(
s
,
a
1
;
w
)
,
Q
(
s
,
a
2
;
w
)
,
.
.
.
,
Q
(
s
,
a
n
;
w
)
)
(Q(s,a_{1};w),Q(s,a_{2};w),...,Q(s,a_{n};w))
(Q(s,a1;w),Q(s,a2;w),...,Q(s,an;w)),,假设估计是无偏的,即有
m
e
a
n
a
x
(
a
)
=
m
e
a
n
a
(
Q
(
s
,
a
;
w
)
mean_{a}x(a)=mean_{a}(Q(s,a;w)
meanax(a)=meana(Q(s,a;w).随机变量的最大化会高估实际最大值
bootstrapping引起高估的原因
自举叠加上最大化导致的高估是的高估被进一步放大
解决高估的方法1-----修改算法架构
选择动作取决于动作的相对价值,因此只要让高估均匀化即可解决高估问题,但是DQN的高估是非均匀的,随着(s,a)出现的频率增加而增加
具有Target Network的DQN
可以这样认为,原始的DQN只有一个神经网络,这种更新方式就是典型的自举了,没迭代一次,算法会更新一次参数,这导致被高估的Q值会在逐层叠加的方式下越来越严重。
解释一下:
在线的Q-learning下当前的参数决定了下一个参数更新所用到的数据样本。比如,当前的参数决定了最大动作是向左,那么接下来的样本多数也会是来自于左半边的样本,然后这些来自左半边的样本再用于训练。显然这样训练过程可能会陷入一个不好的循环,参数可能会收敛到局部极值,甚至发散。通过经验回放,数据分布会在过去多个状态下被平均,从而平滑了训练过程,避免了训练发散。由于使用了经验回放,算法必然是off-policy的,因为产生数据样本(动作选择)的网络参数与当前被训练的网络参数是不同的,也就是生成动作的policy与算法学习的policy是不同的。
为了避免这种步步更新,实时叠加的方法引起的不好的循环,大佬们引入了一个target network。
这就是现在最常用的DQN网络结构
引入target network的目的就是,target network的网络参数不是实时更新的,而是每隔一定步骤更新一次,这样就可以从一定程度上缓解高估问题,因为很长一段距离,两个网络的参数时不一样的。但是,这两个网络的参数毕竟是“师出同门”,其实还是无法从本质上解决高估问题。
于是,Double DQN被提出来了。
Double DQN
为什么提出Double DQN呢。一开始的带有target network的DQN还是使用一开始policy network更新TD target。这其实并没有从根本上解决bootstrapping带来的值高估问题,大家想想是不是这样。
原本的更新过程分成两步:
- 选择使得收益最大的动作 a ∗ = a g r m a x a Q ( s t + 1 , a ; w ) a^{*}=agrmax_{a}Q(s_{t+1},a;w) a∗=agrmaxaQ(st+1,a;w)
- 带入最优动作计算TD target
Double DQN将上述两个部分做了一点更改,选择最优动作仍然来自DQN,但是计算TD target使用Target Network,即 y t = r t + γ Q ( s t + 1 , a ∗ ; w − ) y_{t}=r_{t}+\gamma Q(s_{t+1},a^{*};w^{-}) yt=rt+γQ(st+1,a∗;w−).
下面从数学上解释为何这个trick可以解决高估
很显然,我们有
Q ( s t + 1 , a ∗ ; w − ) ≤ m a x a Q ( s t + 1 , a ; w − ) Q(s_{t+1},a^{*};w^{-})\le max_{a}Q(s_{t+1},a;w^{-}) Q(st+1,a∗;w−)≤maxaQ(st+1,a;w−)
因此double DQN做出的估计更小
但是,说实话,我感觉这种解释和设计有点牵强。
其实上述方法改进主要关注于如何选取动作以及如何计算价值
根据这个思路,大佬们感觉还不够满足,于是又有新的幺蛾子出来了,对,就是Dueling Network
Dueling Network
Advantage function
最优动作价值函数评价某个状态下采取某个行动的好坏
Q
∗
(
s
,
a
)
=
m
a
x
π
Q
π
(
s
,
a
)
Q^{*}(s,a)=max_{\pi}Q_{\pi}(s,a)
Q∗(s,a)=maxπQπ(s,a)
最优状态函数评估状态的好坏
V
∗
(
s
)
=
m
a
x
π
V
π
(
s
)
V^{*}(s)=max_{\pi}V_{\pi}(s)
V∗(s)=maxπVπ(s)
定义Optimal advantage function
A
∗
(
s
,
a
)
=
Q
∗
(
s
,
a
)
−
V
∗
(
s
)
A^{*}(s,a)=Q_{*}(s,a)-V^{*}(s)
A∗(s,a)=Q∗(s,a)−V∗(s)
我们有如下定理
V
(
s
)
=
m
a
x
a
Q
a
(
s
,
a
)
V^{}(s)=max_{a}Q_{a}(s,a)
V(s)=maxaQa(s,a)
因此,我们有
A
∗
(
s
,
a
)
≤
0
A^{*}(s,a)\le 0
A∗(s,a)≤0
m
a
x
a
A
∗
(
s
,
a
)
≤
0
max_{a}A^{*}(s,a)\le 0
maxaA∗(s,a)≤0
并且有
Q
∗
(
s
,
a
)
=
V
∗
(
s
)
−
A
∗
(
s
,
a
)
−
m
a
x
a
A
∗
(
s
,
a
)
)
Q^{*}(s,a)=V^{*}(s)-A^{*}(s,a)-max_{a}A^{*}(s,a))
Q∗(s,a)=V∗(s)−A∗(s,a)−maxaA∗(s,a))
说到底,其实就是用各种变量之间的相关关系来减小高估问题。关键是,你的方法要说得过去,要有理有据。
其实效果都一般般,写论文吗,主要是讲故事。当然了,同样一个故事,安徒生讲的和学徒讲的,效果不一样。这个大家都懂
解决高估的方法2----- transitions
实际操作中,经验回放仅存储最近的N个样本点,当参数更新时均匀的从这些样本点中采样。这种方法也有其缺点,经验池不能区分哪些样本点更重要;同时,经验池的样本也会不断的被最近的数据所覆盖掉。均匀采样也赋予了每个样本同样的重要性,更聪明的采样策略应该是对那些能够学到更多的样本点赋予更多的权重,类似于Prioritized Sweeping。