回顾一下 Q function 的公式:
Qπ(st,at)=t′=t∑TEπ[r(st′,at′)∣st,at]
指的是如果我在当前状态 st 先执行动作 at,然后之后一直按照旧策略 π 行动,我最终能拿到多少总奖励。
考虑一个算法,也就是每次都使用贪心,让策略每次都选择能够让 Q function 最大的行为
πnew(at∣st)={1,0,if at=argmaxaQ^π(st,a)otherwise
在 Qπ(s,a) 足够准确的时候,新的策略不会比原来的策略差,一般会更好或者一样;但是这个新策略不一定是实际上的最优策略。
因为新策略只做了一次策略改进,它用的是旧策略的 Qπ,而不是自己的 Qπnew,也不是最优 Q∗。
也就是说,πnew 的决策逻辑是当前这一步选一个最好的动作,但是假设之后仍然按照旧策略 π 行动,只保证“一步改进”,不保证全局最优。
根据上面的思想,可以跳过梯度下降的过程,直接定义一个新的策略估计 Qπ,再让策略变成对 Qπ 贪心。
具体流程参见下图,也就是直接对 Q 做贪心的学习,而跳过梯度下降的过程。

理论上这是可行的,但是有几个问题:
- argmax 对于连续的空间比较难处理,对于连续的取值范围 + 多个值 就会构成一个复杂的优化问题。
- Qπ 本身也是估计值,会有误差,argmax 天然倾向于选择被高估的动作
- 完全的贪心就会缺乏探索性,这也是强化学习的一个核心要素,需要让模型尝试自己探索而不是单纯的学习某种固定的行为。
原来的方法中,首先训练一个 Actor,然后训练一个 Critic;在 Q-learning 中只训练一个 Q(s,a) 并直接用它的最大值作为策略。
基于 Actor Critic 方法改进后可以得到如下流程:
- 执行动作 a∼π(a∣s) 并从环境中获取到 (s,a,s′,r), 并把数据放进 Replay Buffer R
- 从 R 中采样一个 batch 的数据 {si,ai,ri,si′}
- 最重要的一步,详细介绍一下:
定义一个标签,用这个 yi 作为目标,去训练当前的 Qϕ(si,ai)(该式可以参考 04 章节 中Bootstrapping 小节)
yi=ri+γa′maxQ^ϕ(si′,a′)
注意到这里后一项使用的不是期望而是确切的最大值maxa′Q(s′,a′),此时强化学习类似于监督学习,学习一个确定的标签。
这里的 Q 实际上也是一个网络的估计值,但是 Q 本身也是在反复优化的。利用 Bellman optimality equation 思想,最终会收敛到一个不动点上。
Qnew(s,a)←r+γa′maxQold(s′,a′)
如果行为是离散的点(表格型),例如说上下左右等,那么基本是可以收敛的,因为不同的动作之间是相对独立的参数。
但如果是连续的函数型的行为,则不一定能够保证行为收敛,需要使用额外的技巧来稳定整个训练流程。
观察更新更新目标中的 maxa′Q^ϕ(si′,a′) 表明更新时候需要知道下一状态 si′ 下很多动作的 Q 值。
为了更好的估计 Q function 需要尽可能多地覆盖动作种类,所以需要更新一下数据的获取方式。
π(at∣st)={1−ϵ,ϵ/(∣A∣−1),if at=argmaxaQϕ(st,a)otherwise
以 1−ϵ 的概率选择当前 Q 最大的动作,以 ϵ 的概率探索其他动作。
一般 ϵ 会随着训练的推进逐渐变小。训练早期网络不准所以需要多次探索,在后期网络可靠的时候可以减少探索。
Q 值越大的动作,被采样的概率越高,但 Q 值较低的动作仍然有机会被选中:
π(a∣s)=∑a′exp(Qϕ(s,a′))exp(Qϕ(s,a))
初始化 Q 网络 Qϕ 和 replay buffer R,用当前策略和环境交互,例如 ϵ-greedy,得到 transition:
(si,ai,si′,ri)
然后把 transition 存入 replay buffer。从 replay buffer 采样 mini-batch。对每条数据构造 Bellman target:
yi=ri+γa′maxQϕ(si′,a′)
让 Qϕ(si,ai) 逼近这个 target,重复收集数据和训练,最后使用:
a=argamaxQϕ(s,a)
作为最终策略。