_学习记录…有错误感谢指出
首先介绍BootStrapping概念:
直译: 通过拉自己的鞋带把自己举起来
机器学习内内涵: 在更新过程中,用自己估算的值去更新自己,也就是利用自己预测的结果更新自己。
原始DQN更新方式:
-
从replay buffer取出一个sample, ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)更新DQN的参数w
- TD Target: y t = r t + γ max a Q ( s t + 1 , a ; w ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a;w). yt=rt+γamaxQ(st+1,a;w).
- TD error: δ t = Q ( s t , a t ; w ) − y t . {\delta _t} = Q({s_t},{a_t};w) - {{\rm{y}}_t}. δt=Q(st,at;w)−yt.
- SGD: w ← w − α ⋅ ( Q ( s t , a t ; w ) − y t ) ⋅ ∂ Q ( s t , a t ; w ) ∂ w . w \leftarrow w - \alpha ·{(Q({s_t},{a_t};w) - {{\rm{y}}_t})}·\frac{{\partial Q({s_t},{a_t};w)}}{{\partial w}}. w←w−α⋅(Q(st,at;w)−yt)⋅∂w∂Q(st,at;w).
按照上面的步骤,TD Target是DQN预测的值,而在SGD更新参数w时,使用TD Target更新w,因此是使用自己的预测结果更新自己,即boot strapping。
高估问题举例
DQN通过选择最大的action value对应的action来控制agent的移动,即选择动作
a
t
=
arg
max
a
Q
(
s
t
,
a
;
w
)
{a_t} = \mathop {\arg \max }\limits_a Q({s_t},a;w)
at=aargmaxQ(st,a;w)
-
假设真实的action value值为:
Q ∗ ( s , a 1 ) = 100 , Q ∗ ( s , a 2 ) = 120 , Q ∗ ( s , a 3 ) = 150 {Q^*}(s,{a^1}) = 100,{Q^*}(s,{a^2}) = 120,{Q^*}(s,{a^3}) = 150 Q∗(s,a1)=100,Q∗(s,a2)=120,Q∗(s,a3)=150
应该选择 a 3 a^3 a3 -
均匀的高估:
Q ( s , a i ) = Q ∗ ( s , a 1 ) + 100 Q(s,{a^i}) = {Q^*}(s,{a^1}) + 100 Q(s,ai)=Q∗(s,a1)+100
仍然选择 a 3 a^3 a3,均匀高估不会带来action的误选问题 -
假设DQN预测的action value值为:
Q ( s , a 1 ) = 180 , Q ( s , a 2 ) = 130 , Q ( s , a 3 ) = 170 Q(s,{a^1}) = 180,Q(s,{a^2}) = 130,Q(s,{a^3}) = 170 Q(s,a1)=180,Q(s,a2)=130,Q(s,a3)=170由于DQN为非均匀高估问题,因此每个Q(s,a)高估的程度不一,上述例子中导致 a 1 a^1 a1对应的action value值最大,所以最终错误地选择了 a 1 a^1 a1。
为什么会有高估问题?
- 原因1: BootStrapping会不断传播高估问题
- 用自己的预测结果更新自己,预测结果偏大了,更新参数后会使DQN输出的预测结果进一步偏大,形成正反馈。
- 原因2:由TD Target中的最大化引起
- TD Target: y t = r t + γ max a Q ( s t + 1 , a ; w ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a;w). yt=rt+γamaxQ(st+1,a;w).
- 由于DQN神经网络的预测结果一定存在偏差,所以预测的 max Q \max Q maxQ 一定大于真实的 max Q \max Q maxQ
- 为什么是非均匀的高估呢?
- DQN在训练过程中,是从replay buffer中随机选取样本用于更新参数,因此对于不同的Q(s,a)所更新的次数与程度是不同的,因此DQN是非均匀的高估问题。
高估问题解决方案
方案1:引入target network来计算TD Targets(目的是在一定程度上避免BootStrapping引起的原因1)
-
引入两个神经网络 target network: Q ( s , a ; w T ) Q(s,a;w_T) Q(s,a;wT) 和 main network: Q ( s , a ; w ) Q(s,a;w) Q(s,a;w)
- 两个神经网络具有相同的结构
- 两个神经网络具有不同的参数 w T ≠ w w_T \ne w wT=w
-
使用main network Q ( s , a ; w ) Q(s,a;w) Q(s,a;w) 控制agent,以及收集经验存放于replay buffer:
{ ( s t , a t , r t , s t + 1 } \{(s_t,a_t,r_t,s_{t+1}\} {(st,at,rt,st+1} -
使用target network Q ( s , a ; w T ) Q(s,a;w_T) Q(s,a;wT)计算 TD Target,用于更新main network,即参数 w w w:
y t = r t + γ max a Q ( s t + 1 , a ; w T ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a;w_T). yt=rt+γamaxQ(st+1,a;wT).
BootStarpping: 以前使用DQN计算TD Target,并用于更新DQN自己
改进后: 利用Target network计算TD Target,更新的是main network,避免了BootStarpping,从而缓解高估问题。
流程总结:
-
从replay buffer取出一个sample, ( s t , a t , r t , s t + 1 ) (s_t,a_t,r_t,s_{t+1}) (st,at,rt,st+1)更新DQN的参数w
- TD Target: y t = r t + γ max a Q ( s t + 1 , a ; w T ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a;w_T). yt=rt+γamaxQ(st+1,a;wT).
- TD error: δ t = Q ( s t , a t ; w ) − y t . {\delta _t} = Q({s_t},{a_t};w) - {{\rm{y}}_t}. δt=Q(st,at;w)−yt.
- SGD: w ← w − α ⋅ ( Q ( s t , a t ; w ) − y t ) ⋅ ∂ Q ( s t , a t ; w ) ∂ w . w \leftarrow w - \alpha ·{(Q({s_t},{a_t};w) - {{\rm{y}}_t})}·\frac{{\partial Q({s_t},{a_t};w)}}{{\partial w}}. w←w−α⋅(Q(st,at;w)−yt)⋅∂w∂Q(st,at;w).
- 经过一定的步数才更新target network: w T = w w_T = w wT=w
方案2:在方案1的基础上继续使用Double DQN(目的是避免最大化引起的原因2)
TD Target: y t = r t + γ max a Q ( s t + 1 , a ; w ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},a;w). yt=rt+γamaxQ(st+1,a;w).
①将原始DQN求最大化的 m a x Q max\ Q max Q分为两步:
- 选择最大估计值对应的action:
a ∗ = arg max a Q ( s t + 1 , a ; w ) . {a^*} = \mathop {\arg \max }\limits_a Q({s_{t + 1}},a;w). a∗=aargmaxQ(st+1,a;w). - 选择上面action对应的Q值计算TD Target:
y t = r t + γ max a Q ( s t + 1 , a ∗ ; w ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},{a^*};w). yt=rt+γamaxQ(st+1,a∗;w).
②引入Target Network后变为:
- 选择最大估计值对应的action:
a ∗ = arg max a Q ( s t + 1 , a ; w T ) . {a^*} = \mathop {\arg \max }\limits_a Q({s_{t + 1}},a;w_T). a∗=aargmaxQ(st+1,a;wT). - 选择上面action对应的Q值计算TD Target:
y t = r t + γ max a Q ( s t + 1 , a ∗ ; w T ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},{a^*};w_T). yt=rt+γamaxQ(st+1,a∗;wT).
③引入Double DQN后变为:
- 选择最大估计值对应的action:
a ∗ = arg max a Q ( s t + 1 , a ; w ) . {a^*} = \mathop {\arg \max }\limits_a Q({s_{t + 1}},a;w). a∗=aargmaxQ(st+1,a;w). - 选择上面action对应的Q值计算TD Target:
y t = r t + γ max a Q ( s t + 1 , a ∗ ; w T ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},{a^*};w_T). yt=rt+γamaxQ(st+1,a∗;wT).
Double DQN是三者中表现最好的,虽然仍存在一些高估问题。
为什么引入Double DQN可以缓解最大化带来的问题?
- 使用main network选择action: a ∗ = arg max a Q ( s t + 1 , a ; w ) . {a^*} = \mathop {\arg \max }\limits_a Q({s_{t + 1}},a;w). a∗=aargmaxQ(st+1,a;w).
- 使用target network计算Q值: y t = r t + γ max a Q ( s t + 1 , a ∗ ; w T ) . {{\rm{y}}_t} = {r_t} + \gamma \mathop {\max }\limits_a Q({s_{t + 1}},{a^*};w_T). yt=rt+γamaxQ(st+1,a∗;wT).
- 由于下式一定成立:
Q ( s t + 1 , a ∗ ; w T ) ≤ max a Q ( s t + 1 , a ; w T ) Q({s_{t + 1}},{a^*};{w_T}) \le \mathop {\max }\limits_a Q({s_{t + 1}},a;{w_T}) Q(st+1,a∗;wT)≤amaxQ(st+1,a;wT)- 算式左边:main network选择的action,target network计算的Q值,对应③
- 算式右边:target network选择的action并计算Q值,对应②
- 因此证明了Double DQN上面三种情况中最优。
总结
引起高估问题的原因主要有两个,分别为TD Target中的最大化 和 仅用一个神经网络所带来的BootStrapping。
- 引入Target Network,在一定程度上避免了bootstrapping(但没有完全避免,因为 w T 依赖于 w w_T依赖于w wT依赖于w)
- 提出Double DQN,在一定程度上避免了最大化引起的高估问题。
Reference:
https://youtu.be/vmkRMvhCW5c