DQN(Deep Q-Learning)中的高估问题以及DQN的解决策略

_学习记录…有错误感谢指出

首先介绍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}}. wwα(Q(st,at;w)yt)wQ(st,at;w).

按照上面的步骤,TD Target是DQN预测的值,而在SGD更新参数w时,使用TD Target更新w,因此是使用自己的预测结果更新自己,即boot strapping。

高估问题举例

DQN(Deep Q-Learning)中的高估问题以及DQN的解决策略_第1张图片
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}}. wwα(Q(st,at;w)yt)wQ(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

你可能感兴趣的:(人工智能,深度学习,神经网络)