DQN(最朴素的)

DQN简单推导

U t = R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + . . . U_t = R_t + \gamma R_{t+1} + \gamma ^2 R_{t+2} + \gamma ^3 R_{t+3} + ... Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+...
Q π ( s t , a t ) = E S t + 1 , A t + 1 , . . . , S n , A n [ U t ∣ S t = s t , A t = a t ] Q_\pi (s_t, a_t) = E_{S_{t+1}, A_{t+1}, ..., S_n, A_n}[U_t|S_t = s_t, A_t = a_t] Qπ(st,at)=ESt+1,At+1,...,Sn,An[UtSt=st,At=at]
Q ∗ ( s t , a t ) = max ⁡ π Q π ( s t , a t ) Q_*(s_t, a_t) = \max_πQ_π(s_t, a_t) Q(st,at)=πmaxQπ(st,at)
我们可以这样理解 Q ∗ Q_* Q:已知 s t s_t st a t a_t at,不论未来采取什么样的策略 π,回报 U t U_t Ut 的期望不可能超过 Q ∗ Q_* Q。我们希望知道 Q ∗ Q_* Q,因为它就像是先知一般,可以预见未来,在 t 时刻就预见 t 到 n时刻的累计奖励的期望。假如我们有 Q ∗ Q_* Q这位先知,我们就遵照先知的指导,最大化未来的累计奖励。然而在实践中我们不知道 Q ∗ Q_* Q 的函数表达式。
在这里插入图片描述

为了近似出 Q ∗ Q_* Q,我们使用深度Q网络(deep Q network,缩写DQN),记作 Q(s, a; w)。其中的 w 表示神经网络中的参数。首先随机初始化 w,随后用“经验”去学习 w。学习的目标是:对于所有的 s 和 a,DQN 的预测 Q(s, a; w) 尽量接近 Q ∗ Q_* Q(s, a)。

训练 DQN 最常用的算法是时间差分(temporal difference,缩写 TD)。
U t = R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + . . . = R t + γ U t + 1 U_t = R_t + \gamma R_{t+1} + \gamma ^2 R_{t+2} + \gamma ^3 R_{t+3} + ... = R_t + \gamma U_{t+1} Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+...=Rt+γUt+1
经过一系列数学推导,可以得到下面的定理。
在这里插入图片描述
贝尔曼方程的右边是个期望,我们可以对期望做蒙特卡洛近似。当智能体执行动作 a t a_t at 之后,环境通过状态转移函数 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t, a_t) p(st+1st,at) 计算出新状态 s t + 1 s_{t+1} st+1。奖励 R t R_t Rt 最多只依赖于 S t 、 A t 、 S t + 1 S_t、A_t、S_{t+1} StAtSt+1。那么当我们观测到 s t 、 a t 、 s t + 1 s_t、a_t、s_{t+1} statst+1 时,则奖励 R t R_t Rt也被观测到,记作 r t r_t rt。有了四元组
( s t , a t , r t , s t + 1 ) , (s_t, a_t, r_t, s_{t+1}), (st,at,rt,st+1)
我们可以计算出贝尔曼方程右边期望的蒙特卡洛近似:
r t + γ ⋅ max ⁡ a ∈ A Q ∗ ( s t + 1 , a ) r_t + \gamma \cdot \max_{a \in \Alpha} Q_*({s_{t+1}, a}) rt+γaAmaxQ(st+1,a)
Q ∗ ( s , a ) 替换成神经网络 Q ( s , a ; w ) Q_*(s, a) 替换成神经网络 Q(s, a; w) Q(s,a)替换成神经网络Q(s,a;w),得到:
Q ( s t , a t ; w ) ⏟ 预测 q t ^ ≈ r t + γ ⋅ max ⁡ a ∈ A Q ( s t + 1 , a ; w ) ⏟ T D 目标 y t ^ \underbrace {Q(s_t, a_t; w)}_{预测\hat {q_t}} \approx \underbrace{r_t + \gamma \cdot \max_{a \in \Alpha} Q(s_{t+1}, a; w)}_{TD目标\hat {y_t}} 预测qt^ Q(st,at;w)TD目标yt^ rt+γaAmaxQ(st+1,a;w)
左边的 q t ^ ≜ Q ( s t , a t ; w ) \hat{q_t} ≜ Q(s_t, a_t; w) qt^Q(st,at;w)是神经网络在 t 时刻做出的预测,其中没有任何事实成分。右边的 TD 目标 y t ^ \hat{y_t} yt^ 是神经网络在 t + 1 时刻做出的预测,它部分基于真实观测到的奖励 r t r_t rt q t ^ \hat{q_t} qt^ y t ^ \hat{y_t} yt^两者都是对最优动作价值 Q ∗ ( s t , a t ) Q_*(s_t, a_t) Q(st,at) 的估计,但是 y t ^ \hat{y_t} yt^部分基于事实,因此比 q t ^ \hat{q_t} qt^更可信。应当鼓励 q t ^ ≜ Q ( s t , a t ; w ) \hat{q_t} ≜ Q(s_t, a_t; w) qt^Q(st,at;w)接近 y t ^ \hat{y_t} yt^。定义损失函数:
L ( w ) = 1 2 [ Q ( s t , a t , ; w ) − y t ^ ] 2 L(w) = \frac{1}{2}[Q(s_t, a_t,;w) - \hat{y_t}]^2 L(w)=21[Q(st,at,;w)yt^]2
假装 y t ^ \hat{y_t} yt^是常数(材料上这么写的,可以理解为是一个观测值),计算 L 关于 w 的梯度:
∇ w L ( w ) = ( q t ^ − y t ^ ) ⏟ T D 误差 δ t ⋅ ∇ w Q ( s t , a t ; w ) \nabla_{w} L(w) = \underbrace{(\hat{q_t} - \hat{y_t})}_{TD误差\delta_t} \cdot \nabla_{w}Q(s_t, a_t; w) wL(w)=TD误差δt (qt^yt^)wQ(st,at;w)
做一步梯度下降,可以让 q t ^ \hat{q_t} qt^更接近 y t ^ \hat{y_t} yt^
w ← w − α ⋅ δ t ⋅ ∇ w Q ( s t , a t ; w ) w \leftarrow w - \alpha \cdot \delta_t \cdot \nabla_wQ(s_t, a_t; w) wwαδtwQ(st,at;w)
这个公式就是训练 DQN 的 TD 算法。

训练流程

收集训练数据

算法所需数据为四元组 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1),与控制智能体运动的策略 π 无关。这就意味着可以用任何策略控制智能体与环境交互,比较常用的是 ϵ-greedy 策略:
a t = { a r g m a x a Q ( s t , a ; w ) , 以概率 ( 1 − ϵ ) 均匀抽取 A 中的一个动作 , 以概率 ϵ a_t = \left \{ \begin{aligned} argmax_a Q(s_t, a; w), 以概率(1-\epsilon) \\ 均匀抽取 A 中的一个动作,以概率\epsilon \end{aligned} \right. at={argmaxaQ(st,a;w),以概率(1ϵ)均匀抽取A中的一个动作,以概率ϵ
把智能体在一局游戏中的轨迹记作:
s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s n , a n , r n s_1, a_1, r_1, s_2, a_2, r_2, ..., s_n, a_n, r_n s1,a1,r1,s2,a2,r2,...,sn,an,rn
把一条轨迹划分成 n 个 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t+1}) (st,at,rt,st+1)这种四元组,存入数组,这个数组叫做经验回放数组(replay buffer)。

更新 DQN 参数 w

随机从经验回放数组中取出一个四元组,记作 ( s j , a j , r j , s j + 1 ) (s_j, a_j, r_j, s_{j+1}) (sj,aj,rj,sj+1)
设 DQN 当前的参数为 w n o w w_{now} wnow,执行下面的步骤对参数做一次更新,得到新的参数 w n e w w_{new} wnew

  1. 对 DQN 做正向传播,得到 Q 值:
    q j ^ = Q ( s j , a j ; w n o w ) 和 q j + 1 ^ = max ⁡ a ∈ A Q ( s j + 1 , a ; w n o w ) \hat{q_j} = Q(s_j, a_j; w_{now}) 和\hat{q_{j+1}} = \max_{a \in \Alpha}Q(s_{j+1}, a; w_{now}) qj^=Q(sj,aj;wnow)qj+1^=aAmaxQ(sj+1,a;wnow)
  2. 计算 TD 目标和 TD 误差:
    y j ^ = r j + γ ⋅ q j + 1 ^ 和 δ j = q j ^ − y j ^ \hat{y_j} = r_j + \gamma \cdot \hat {q_{j+1}} 和 \delta _j = \hat{q_j} - \hat{y_j} yj^=rj+γqj+1^δj=qj^yj^
  3. 对 DQN 做反向传播,得到梯度:
    g j = ∇ w Q ( s j , a j ; w n o w ) g_j = \nabla_wQ(s_j,a_j; w_{now}) gj=wQ(sj,aj;wnow)
  4. 做梯度下降更新 DQN 的参数:
    w n e w ← w n o w − α ⋅ δ j ⋅ g j w_{new} \leftarrow w_{now} - \alpha \cdot \delta_j \cdot g_j wnewwnowαδjgj

参考 https://github.com/wangshusen/DRL/blob/master/Slides/1_Basics_2.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值