第二章:价值学习(DQN 与 SARSA)

涵盖 DQN、Q 学习、SARSA 算法以及优先经验回放、双 Q 学习、对决网络、噪声网络等价值学习高级技巧。

价值学习

DQN 与 Q 学习

最优动作价值函数可以用来做控制,一旦知道状态 sts_t,可以根据对动作的打分进行选择。

近似学习 QQ_* 最有效的方法是深度 Q 网络(deep Q network,DQN),记作 Q(s,a;ω)Q(s,a;\omega)。训练 DQN 最常用的算法是时间差分(temporal difference,TD)。

时间差分 (TD) 算法示例

假如在出发前,模型预估北京到上海需要 q^=14\hat q=14 小时,经过 r=4.5r=4.5 小时从北京到达济南后,再让模型预测从济南到上海需要 q^=11\hat{q}'=11 个小时,则整个旅程的最新估计时间为:

y^r+q^=4.5+11=15.5\hat y \triangleq r+\hat{q}' = 4.5 + 11 = 15.5

TD 算法将 y^=15.5\hat y =15.5 称为 TD 目标(TD target),它比最初的预测 q^=14\hat q=14 更可靠,因为它是纯粹估计的,而 TD 目标中含有事实的成分。我们希望估计值 q^\hat q 尽量接近 TD 目标 y^\hat y,所以用两者差的平方作为损失函数:

L(ω)=12[Q("北京","上海";ω)y^]2L(\omega) = \frac{1}{2}\left[Q("\text{北京}","\text{上海}";\omega) - \hat y\right]^2

此处把 y^\hat y 看做常数,尽管它依赖于 ω\omega。计算损失函数的梯度:

ωL(ω)=(q^y^)δωQ("北京","上海";ω)\nabla_{\omega} L(\omega) = \underbrace{(\hat q - \hat y)}_{\delta} \cdot \nabla_{\omega}Q("\text{北京}","\text{上海}";\omega)

此处的 δ=q^y^=1415.5=1.5\delta = \hat q - \hat y=14 - 15.5 =-1.5 称作 TD 误差(TD error)

DQN 的贝尔曼推导与损失函数

由下列两式推导:

Ut=Rt+γk=t+1nγkt1Rk=Ut+1,Q(st,at)=maxπE[UtSt=st,At=at]U_t = R_t + \gamma \cdot \underbrace{\sum_{k=t+1}^n \gamma^{k-t-1}\cdot R_k}_{=U_{t+1}}, \qquad Q_*(s_t, a_t) = \max_{\pi} \mathbb{E}[U_t \mid S_t = s_t, A_t = a_t]

可得下列定理,该定理是最优贝尔曼方程(optimal Bellman equations)的一种形式:

Q(st,at)Ut的期望=ESt+1p(st,at)[Rt+γmaxAAQ(St+1,A)Ut+1的期望St=st,At=at]\underbrace{Q_*(s_t, a_t)}_{U_t \text{的期望}} =\mathbb{E}_{S_{t+1}\sim p(\cdot \mid s_t, a_t)}[R_t + \gamma \cdot \underbrace{\max_{A\in \mathcal{A}}Q_* (S_{t+1}, A)}_{U_{t+1} \text{的期望}}\mid S_t = s_t, A_t = a_t]

贝尔曼方程的右边是个期望,我们可以对期望做蒙特卡洛近似,当智能体执行动作 ata_t 后,环境通过状态转移函数 p(st+1st,at)p(s_{t+1} \mid s_t, a_t) 计算出新状态 st+1s_{t+1},那么当我们观测到 sts_t, ata_t, st+1s_{t+1} 后则奖励 rtr_t 也被观测到,因此可以计算:

rt+γmaxaAQ(st+1,a)r_t + \gamma \cdot \max_{a \in \mathcal{A}}Q_*(s_{t+1}, a)

它可以看做是右式期望的近似。因此,如果用神经网络 Q(s,a;ω)Q(s, a; \omega) 替换最优动作价值函数 Q(s,a)Q_*(s, a) 可以得到:

Q(st,at;ω)预测 qt^rt+γmaxaAQ(st+1,a;ω)TD 目标 yt^\underbrace{Q(s_t, a_t; \omega)}_{\text{预测 } \hat{q_t}}\approx \underbrace{r_t + \gamma \cdot \max_{a\in \mathcal{A}} Q(s_{t+1}, a; \omega)}_{\text{TD 目标 } \hat{y_t}}

应当鼓励 qt^Q(st,at;ω)\hat{q_t} \triangleq Q(s_t, a_t; \omega) 接近 yt^\hat{y_t},定义损失函数:

L(ω)=12[Q(st,at;ω)yt^]2L(\omega) = \frac{1}{2}[Q(s_t, a_t; \omega) - \hat{y_t}]^2

假设 y^\hat y 是常数,计算 LL 关于 ω\omega 的梯度:

ωL(ω)=(qt^yt^)TD 误差 δtωQ(st,at;ω)\nabla_{\omega} L(\omega) = \underbrace{(\hat{q_t}-\hat{y_t})}_{\text{TD 误差 } \delta_t}\cdot \nabla_{\omega} Q(s_t, a_t;\omega)

做一步梯度下降,可以让 qt^\hat{q_t} 更接近 yt^\hat{y_t}

ωωαδtωQ(st,at;ω)\omega \leftarrow \omega - \alpha \cdot \delta_t \cdot \nabla_{\omega} Q(s_t, a_t; \omega)

DQN 训练算法流程

  1. 收集训练数据: 我们可以用任何策略函数 π\pi 去控制智能体与环境交互,这个 π\pi 就叫做行为策略(behavior policy)。比较常用的是 ϵ\epsilon-greedy 策略(初始时将 ϵ\epsilon 设置得比较大,然后逐渐衰减):

    at={argmaxaQ(st,a;ω),以概率 (1ϵ);均匀抽取 A 中的一个动作,以概率 ϵ.a_t = \begin{cases} \arg \max_{a} Q(s_t, a;\omega), & \text{以概率 }(1-\epsilon); \\ \text{均匀抽取 } \mathcal{A} \text{ 中的一个动作}, & \text{以概率 } \epsilon. \end{cases}

    把智能体在一局游戏中的轨迹记作 s1,a1,r1,s2,a2,r2,,sn,an,rns_1, a_1, r_1, \quad s_2, a_2, r_2, \cdots, \quad s_n, a_n, r_n。把一条轨迹划分成 nn(st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}) 这种四元组,存入数组,这个数组叫做经验回放数组(replay buffer)。

  2. 更新 DQN 参数 ω\omega: 随机从经验回放数组中取出一个四元组,记作 (sj,aj,rj,sj+1)(s_j, a_j, r_j, s_{j+1}),执行下列步骤进行参数更新:

    • 对 DQN 做正向传播,得到 Q 值: q^j=Q(sj,aj;ωnow)q^j+1=maxaAQ(sj+1,a;ωnow)\hat{q}_j = Q(s_j, a_j;\omega_{\text{now}}) \quad \text{和} \quad \hat{q}_{j+1}=\max_{a \in \mathcal{A}} Q(s_{j+1}, a; \omega_{\text{now}})

    • 计算 TD 目标和 TD 误差: y^j=rj+γq^j+1δj=q^jy^j\hat y_j = r_j +\gamma \cdot \hat q_{j+1} \quad \text{和} \quad \delta_j = \hat q_j -\hat y_j

    • 对 DQN 作反向传播,得到梯度: gj=ωQ(sj,aj;ωnow)g_j = \nabla_{\omega} Q(s_j, a_j; \omega_{\text{now}})

    • 做梯度下降更新 DQN 的参数: ωnowωnowαδjgj\omega_{\text{now}} \leftarrow \omega_{\text{now}} - \alpha \cdot \delta_j \cdot g_j

可以在智能体每执行一个动作之后,对 ω\omega 做几次更新,也可以在每完成一局游戏后,对 ω\omega 做几次更新。

利用表格法实现 Q 学习,首先用表格表示 QQ_*,即各状态下各动作的最优动作价值函数,用下列公式更新表格中元素:

y^trt+γmaxaAQ~(st+1,a);Q~(st,at)(1α)Q~(st,at)+αy^t\hat y_t \triangleq r_t + \gamma \cdot \max_{a\in \mathcal{A}} \tilde Q(s_{t+1}, a); \qquad\tilde Q(s_t, a_t) \leftarrow (1-\alpha)\cdot \tilde Q(s_t, a_t) + \alpha \cdot \hat y_t

  • 行为策略(behavior policy):作用是收集经验(experience),即观测的状态、动作、奖励。
  • 目标策略:用来控制智能体的策略函数。
  • 同策略(on-policy):利用相同的行为策略和目标策略。
  • 异策略(off-policy):用不同的行为策略和目标策略。

异策略的好处是可以用行为策略收集经验,将 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}) 存储作为经验回放数组,利用这些数据训练目标策略被称作经验回放(experience replay)。


SARSA 算法

传统的强化学习用 QπQ_{\pi} 作为确定性的策略控制智能体,但是现在 QπQ_{\pi} 通常被用于评价策略的好坏,而非用于控制智能体。QπQ_{\pi} 常与策略函数 π\pi 结合使用,被称作 actor-critic(演员-评委)方法。

SARSA 算法的表格法与 Q 学习类似,利用下列贝尔曼方程:

Qπ(st,at)=ESt+1,At+1[Rt+γQπ(St+1,At+1)St=st,At=at]Q_{\pi}(s_t, a_t) = \mathbb{E}_{S_{t+1}, A_{t+1}}[R_t + \gamma \cdot Q_{\pi}(S_{t+1}, A_{t+1}) \mid S_t = s_t, A_t = a_t]

其中左式可近似为表格中的 q(st,at)q(s_t, a_t),右式可根据 st+1s_{t+1} 和策略 π\pi 做随机抽样,得到新的动作 a~t+1π(st+1)\tilde a_{t+1} \sim \pi (\cdot \mid s_{t+1})

并用观测到的 rtr_tst+1s_{t+1} 和计算出的 a~t+1\tilde a_{t+1} 对期望做蒙特卡洛近似,然后用表格 qq 近似 QπQ_{\pi} 得到:

y^trt+γq(st+1,a~t+1)\hat y_t \triangleq r_t + \gamma \cdot q(s_{t+1}, \tilde a_{t+1})

并用下式更新表格中 (st,at)(s_t, a_t) 位置上的元素:

q(st,at)(1α)q(st,at)+αy^tq(s_t, a_t) \leftarrow (1-\alpha)\cdot q(s_t, a_t) + \alpha \cdot \hat y_t

然后用某种算法更新策略函数,注意这是隐性的更新,通过更新 Q 函数来间接改进策略。

SARSA 算法的目标是学到表格 qq 作为动作价值函数 QπQ_{\pi} 的近似,经验回放数组里的经验 (sj,aj,rj,sj+1)(s_j, a_j, r_j, s_{j+1}) 是过时的行为策略 πold\pi_{\text{old}} 收集到的,与当前策略 πnow\pi_{\text{now}} 及其对应的价值 QπnowQ_{\pi_{\text{now}}} 对应不上,因此不能使用经验回放,只能使用同策略。

可以用神经网络 q(s,a;ω)q(s,a;\omega) 来近似 Qπ(s,a)Q_{\pi}(s,a),称其为价值网络(value network),其训练流程基本与训练 DQN 完全相同,只是需要根据当前策略做抽样 a~t+1πnow(st+1)\tilde a_{t+1} \sim \pi_{\text{now}}(\cdot \mid s_{t+1})

单步与多步 TD 目标

SARSA 计算 TD 目标只用到一个奖励 rtr_t,这样得到的 y^t\hat y_t 叫做单步 TD 目标,可将其扩展为多步 TD 目标。易知:

Ut=(i=0m1γiRt+i)+γmUt+mU_t = \left(\sum_{i=0}^{m-1} \gamma^i R_{t+i}\right) + \gamma^m U_{t+m}

动作价值函数 Qπ(st,at)Q_{\pi}(s_t, a_t) 是回报 UtU_t 的期望,而 Qπ(st+m,at+m)Q_{\pi}(s_{t+m}, a_{t+m}) 是回报 Ut+mU_{t+m} 的期望,则可以得到下列定理:

定理:设 RkR_kSkS_kAkA_kSk+1S_{k+1} 的函数,k=1,,n\forall k = 1,\cdots,n,则: Qπ(st,at)Ut的期望=E[(i=0m1γiRt+i)+γmQπ(St+m,At+m)Ut+m的期望|St=st,At=at]\underbrace{Q_{\pi}(s_t, a_t)}_{U_t \text{的期望}} = \mathbb{E}\left[\left(\sum_{i=0}^{m-1} \gamma^i R_{t+i}\right) + \gamma^m \cdot \underbrace{Q_{\pi}(S_{t+m}, A_{t+m})}_{U_{t+m} \text{的期望}} \middle| S_t = s_t, A_t = a_t \right]

所以已知当前状态 sts_t,用策略 π\pi 控制智能体与环境交互 mm 次,得到轨迹(不需要 rt+mr_{t+m}):

rt,st+1,at+1,rt+1,,st+m1,at+m1,rt+m1,st+m,at+mr_t, \quad s_{t+1}, a_{t+1}, r_{t+1}, \quad \cdots, \quad s_{t+m-1}, a_{t+m-1}, r_{t+m-1}, \quad s_{t+m}, a_{t+m}

后可以计算 mm 步 TD 目标用以更新价值网络和策略:

y^t=(i=0m1γirt+i)+γmq(st+m,at+m;ω)\hat y_t = \left(\sum_{i=0}^{m-1} \gamma^i r_{t+i} \right) + \gamma^m \cdot q(s_{t+m}, a_{t+m}; \omega)

蒙特卡洛与自举 (Bootstrapping) 的比较

训练价值网络 q(s,a;ω)q(s, a;\omega) 时,可以将一局游戏进行到底,计算回报 ut=i=0ntγirt+iu_t = \sum_{i=0}^{n-t} \gamma^i r_{t+i},使用 utu_t 作为目标鼓励价值网络接近 utu_t 不是 TD 方法,而是蒙特卡洛,因为这是用实际观测 utu_t 去近似期望。

  • 蒙特卡洛 (Monte Carlo)

    • 好处是无偏性utu_tQπ(st,at)Q_{\pi}(s_t, a_t) 的无偏估计,由于 utu_t 的无偏性,拿其作为目标训练价值网络,得到的价值网络也是无偏的。
    • 坏处是方差大:随机变量 UtU_t 依赖于 St+1,At+1,,Sn,AnS_{t+1}, A_{t+1}, \cdots, S_n, A_n 这些随机变量,其中不确定性很大,可能导致观测值 utu_t 实际上离 E[Ut]\mathbb{E}[U_t] 很远,因此拿 utu_t 作为目标训练价值网络收敛会很慢。
  • 自举 (Bootstrapping / TD)

    • 好处是方差小:单步 TD 目标的随机性只来自于 St+1S_{t+1}At+1A_{t+1},而回报 UtU_t 的随机性来自于后续所有的随机变量。很显然单步 TD 目标的随机性较小,因此方差较小,用自举训练价值网络收敛比较快。
    • 坏处是有偏差:价值网络 q(s,a;ω)q(s,a;\omega) 是对动作价值 Qπ(s,a)Q_\pi(s,a) 的近似,假如 q(sj+1,aj+1;ω)q(s_{j+1}, a_{j+1}; \omega) 低估(或高估)真实价值 Qπ(sj+1,aj+1)Q_{\pi}(s_{j+1},a_{j+1}),则会导致 q(sj,aj;ω)q(s_j, a_j;\omega) 低估(高估)Qπ(sj,aj)Q_{\pi}(s_j, a_j)。即自举会让偏差从 (st+1,at+1)(s_{t+1}, a_{t+1}) 传播到 (st,at)(s_t, a_t)
u_t 和 y_t 的箱型图示意

价值学习高级技巧

1. 优先经验回放 (Prioritized Experience Replay)

把智能体的轨迹划分成 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}) 这样的四元组,存入经验回放数组。限制超参数数组的大小(记作 bb),数组中只保留最近 bb 条数据。

经验回放的好处在于打破序列的相关性。优先经验回放给每个四元组一个权重,根据权重做非均匀随机抽样。利用 TD 误差的绝对值 δj\lvert \delta_j \rvert 代替无法观测的价值偏差:

pjδj+ϵpj1rank(j)p_j \propto \lvert \delta_j \rvert + \epsilon \quad \text{或} \quad p_j \propto \frac{1}{\text{rank}(j)}

为了抵消非均匀抽样造成的偏差,相应调整学习率:

αj=α(bpj)β\alpha_j = \frac{\alpha}{(b\cdot p_j)^{\beta}}

其中 bb 是样本总数,β(0,1)\beta \in (0,1) 为可调超参数(论文建议逐渐增长到 1)。

2. 高估问题与目标网络 (Target Network)

用 Q 学习训练出的 DQN 会高估真实的价值,原因有两个:

  1. 自举导致偏差的传播:前一步的估算误差传递给当前步。
  2. 最大化操作造成高估:即便 DQN 是真实价值 QQ_* 的无偏估计,只要 DQN 不恒等于 QQ_*,因为 E[max(Z1,,Zd)]max(x1,,xd)\mathbb{E}[\max(Z_1, \cdots, Z_d)] \geq \max(x_1, \cdots, x_d),TD 目标也会高估真实价值。

切断自举可以使用目标网络(target network) Q(s,a;ω)Q(s,a;\omega^-),其参数更新步骤如下:

  1. 对 DQN 做正向传播,得到:q^j=Q(sj,aj;ωnow)\hat q_j = Q(s_j, a_j;\omega_{\text{now}})
  2. 对目标网络做正向传播,得到:q^j+1=Q(sj,aj;ωnow)\hat q_{j+1}^- = Q(s_j, a_j; \omega_{\text{now}}^-)
  3. 计算 TD 目标和 TD 误差: y^j=rj+γq^j+1,δj=q^jy^j\hat y_j^- = r_j + \gamma \cdot \hat q_{j+1}^-, \qquad \delta_j = \hat q_j - \hat y_j^-
  4. 对 DQN 做反向传播得到梯度 ωQ(sj,aj;ωnow)\nabla_{\omega} Q(s_j, a_j; \omega_{\text{now}})
  5. 做梯度下降更新 DQN 参数: ωnewωnowαδjωQ(sj,aj;ωnow)\omega_{\text{new}}\leftarrow \omega_{\text{now}}-\alpha \cdot \delta_j \nabla_{\omega}Q(s_j, a_j;\omega_{\text{now}})
  6. 对目标网络参数做加权平滑更新(Soft update,τ0.0010.005\tau \approx 0.001 \sim 0.005): ωnewτωnew+(1τ)ωnow\omega_{\text{new}}^- \leftarrow \tau \cdot \omega_{\text{new}} + (1 - \tau) \cdot \omega_{\text{now}}^-

3. 双 Q 学习 (Double DQN)

在双 Q 学习中,下一步最佳动作的选择依赖主网络 DQN:

a=argmaxaAQ(sj+1,a;ω)a^* = \arg \max_{a\in \mathcal{A}} Q(s_{j+1}, a;\omega)

其 TD 目标的求值使用目标网络:

y~j=rj+Q(sj+1,a;ω)\tilde y_j = r_j + Q(s_{j+1}, a^*;\omega^-)

因为 Q(sj+1,a;ω)双 Q 学习maxaAQ(sj+1,a;ω)用目标网络的 Q 学习\underbrace{Q(s_{j+1}, a^*;\omega^-)}_{\text{双 Q 学习}} \leq \underbrace{\max_{a\in \mathcal{A}}Q(s_{j+1},a;\omega^-)}_{\text{用目标网络的 Q 学习}},因此双 Q 学习得到的 TD 目标更小,进一步缓解了高估。

4. 对决网络 (Dueling Network)

对决网络将最优动作价值 QQ_* 分解成最优状态价值 VV_* 加最优优势 DD_*

Q(s,a)=V(s)+D(s,a)maxaAD(s,a)恒等于零,sS,aAQ_*(s,a) = V_*(s) + D_*(s,a) - \underbrace{\max_{a \in \mathcal{A}}D_*(s,a)}_{\text{恒等于零}}, \qquad \forall s \in \mathcal{S}, \forall a \in \mathcal{A}

实际实现时用近似输出:

Q(s,a;ω)V(s;ωV)+D(s,a;ωD)maxaAD(s,a;ωD)Q(s,a;\omega) \triangleq V(s;\omega^V) + D(s,a;\omega^D) - \max_{a \in \mathcal{A}}D(s,a;\omega^D)

在实际工程中,通常用 mean 代替 max 会得到更好的效果。

5. 噪声网络 (Noisy Net)

噪声网络将全连接层的参数 ω\omega 替换为 μ+σξ\mu+\sigma \circ \xi,其中 ξ\xi 是随机噪声,每个元素独立从标准正态分布 N(0,1)\mathcal{N}(0,1) 中随机抽取:

z=ReLU((Wμ+WσWξ)x+(bμ+bσbξ))z=\mathrm{ReLU}\left((W^{\mu}+W^{\sigma}\circ W^{\xi})x + (b^{\mu} + b^{\sigma}\circ b^{\xi})\right)

噪声 DQN 不需要使用 ϵ\epsilon-greedy 策略,因为参数中的随机噪声本身就能带来足够的探索。


四合一 Rainbow DQN 参数更新流程

在实际实现 DQN 时,将优先经验回放、双 Q 学习、对决网络、噪声网络全部结合:

  1. 抽样:用优先经验回放,从数组中抽取一个四元组 (sj,aj,rj,sj+1)(s_j, a_j, r_j, s_{j+1})
  2. 正向传播:用标准正态分布生成 ξ\xi,对噪声 DQN 做正向传播: q^j=Q~(sj,aj,ξ;μnow,σnow)\hat q_j = \tilde Q(s_j,a_j,\xi;\mu_{\text{now}}, \sigma_{\text{now}})
  3. 动作选择:用噪声 DQN 选出最优动作: a~j+1=argmaxaAQ~(sj+1,a,ξ;μnow,σnow)\tilde a_{j+1} = \arg \max_{a\in \mathcal{A}}\tilde Q(s_{j+1},a, \xi;\mu_{\text{now}}, \sigma_{\text{now}})
  4. 目标求值:生成新噪声 ξ\xi',用目标网络计算价值: q~j+1=Q~(sj+1,a~j+1,ξ;μnow,σnow)\tilde q_{j+1}^- = \tilde Q(s_{j+1}, \tilde a_{j+1}, \xi'; \mu_{\text{now}}^-, \sigma_{\text{now}}^-)
  5. 计算 TD 目标与误差y^j=rj+γq^j+1,δj=q^jy^j\hat y_j^- = r_j + \gamma \cdot \hat q_{j+1}^-, \qquad \delta_j = \hat q_j - \hat y_j^-
  6. 参数更新:梯度下降更新噪声 DQN 的 μ,σ\mu, \sigmaμnewμnowαμδjμQ~,σnewσnowασδjσQ~\mu_{\text{new}}\leftarrow \mu_{\text{now}} - \alpha_{\mu} \cdot \delta_j \cdot \nabla_{\mu} \tilde Q, \quad \sigma_{\text{new}} \leftarrow \sigma_{\text{now}} - \alpha_{\sigma} \cdot \delta_j \cdot \nabla_{\sigma} \tilde Q
  7. 平滑追踪:更新目标网络参数: μnewτμnew+(1τ)μnow,σnewτσnew+(1τ)σnow\mu_{\text{new}}^- \leftarrow \tau \cdot \mu_{\text{new}}+ (1 - \tau)\cdot \mu_{\text{now}}^-, \quad \sigma_{\text{new}}^- \leftarrow \tau \cdot \sigma_{\text{new}}+ (1 - \tau)\cdot \sigma_{\text{now}}^-