Skip to content

Q-Learning

Q 学习

Q-Learning 是一种直接学习动作价值函数的强化学习方法。

它想学的不是“这个状态值多少钱”,而是:

在某个状态下,执行某个动作,长期来看到底值不值。

更准确地说,它要学习的是最优动作价值函数 q(s,a)。如果这个函数学准了,那么在每个状态里只要选取 Q(s,a) 最大的动作,就能得到一条很强的策略。

所以可以先把 Q-Learning 记成一句话:

Q-Learning = 直接学习“状态—动作值”,再用最大值对应的动作做决策。

Q 值到底表示什么

在强化学习里,给定一个状态 s 和动作 a,动作价值函数通常记成:

qπ(s,a)=Eπ[l=0γlRt+1+l|St=s,At=a]

它的意思是:

如果我现在处在状态 s,并且先执行动作 a,然后之后都按策略 π 继续行动,那么将来总共大概能拿到多少折扣后的累计奖励。

而 Q-Learning 关心的不是某个固定策略下的 qπ(s,a),而是最优动作价值函数:

q(s,a)=maxπqπ(s,a)

也就是说:

从状态 s 做动作 a 出发,之后如果一切都做得最好,这个动作最终能带来多大长期收益。

为什么学 Q 值就够了

如果已经知道了最优动作价值函数 q(s,a),那最优策略就可以直接写成:

π(s)=argmaxaq(s,a)

只要知道每个动作有多值钱,就不需要再单独学一套复杂规则,直接选最值钱的动作就行。

所以 Q-Learning 的核心思路是:

  • 不先显式学习策略;
  • 先把每个状态下每个动作的价值学出来;
  • 最后再用“取最大”得到策略。

从 Bellman 最优方程到 Q-Learning

最优动作价值函数满足 Bellman 最优方程:

q(s,a)=E[Rt+1+γmaxaq(St+1,a)|St=s,At=a]

这条式子可以这样理解:

当前这一步动作的最优价值,等于两部分之和。

第一部分,是眼前立刻拿到的奖励 Rt+1

第二部分,是到达下一状态 St+1 之后,如果接下来每一步都做得最好,那么能拿到的未来最优价值,也就是 maxaq(St+1,a),再乘上折扣因子 γ

所以它表达的是:

现在这一步好不好,不只看眼前奖励,还看它把你带到了一个多好的未来。

贝尔曼最优方程

  • state-value 版本
v(s)=maxaE[Rt+1+γv(St+1);|;St=s, At=a].
  • action-value 版本
q(s,a)=E[Rt+1+γmaxaq(St+1,a)s,a].

两者的关系:

v(s)=maxaq(s,a).

Q-Learning 的更新公式是怎么来的

现实里我们并不知道上面那个条件期望,所以不能直接把 Bellman 最优方程当成闭式公式来算。Q-Learning 的做法是:

  • 用一次真实采样到的转移来近似期望;
  • 用当前维护的 Q 表来近似真实的 q

假设我们观察到一次真实转移:

St=s,At=a,Rt+1=r,St+1=s

那么 Bellman 最优方程右边的样本版本就可以写成:

r+γmaxaQ(s,a)

这就构成了 Q-Learning 的目标值,也常叫 TD target

ytQ=Rt+1+γmaxaQ(St+1,a)

然后让当前的 Q(St,At) 朝这个目标靠近一点,于是更新公式就是:

Q(St,At)Q(St,At)+α(Rt+1+γmaxaQ(St+1,a)Q(St,At))

这就是 Q-Learning 最核心的一条公式。

TIP

当前旧估计是:

Q(St,At)

新的目标值是:

Rt+1+γmaxaQ(St+1,a)

两者相减得到误差:

δt=Rt+1+γmaxaQ(St+1,a)Q(St,At)

于是更新就是:

Q(St,At)Q(St,At)+αδt

所以它本质上就是:

如果当前 Q 值低于“眼前奖励 + 下一状态的最好未来”,就往上调;如果高于这个目标,就往下调。

为什么这里要取最大值

Q-Learning 最关键的地方,就是这一项:

maxaQ(St+1,a)

它表示:

无论你下一步实际会不会真的选到那个动作,Q-Learning 在更新时都先假设“下一步会选当前看起来最好的动作”。

这说明 Q-Learning 学的是一种“最佳可能未来”。

也正因为如此,它学到的是最优动作价值函数,而不是“当前行为策略真实会怎么做”的那个价值函数。

这也是为什么 Q-Learning 经常被称为一种学习“最优贪心行为目标”的方法。

一个具体小例子

假设某一步里:

  • 当前状态动作值:Q(St,At)=5
  • 奖励:Rt+1=2
  • 下一状态下各动作的当前估计值分别是 3,4,6
  • 所以 maxaQ(St+1,a)=6
  • 折扣因子:γ=0.9
  • 学习率:α=0.1

那么目标值是:

ytQ=2+0.9×6=7.4

误差是:

δt=7.45=2.4

更新后:

Q(St,At)5+0.1×2.4=5.24

这说明:

当前这个动作原来估计值是 5,但观察到这次转移后,我们觉得它更应该接近 7.4,所以先把它往上调到 5.24。

Q-Learning 的完整训练流程

最经典的表格型 Q-Learning 流程可以写成下面这样。

先初始化一个 Q 表:

Q(s,a)0

然后不断和环境交互。每一步里:

  1. 在当前状态 St 选择一个动作 At
  2. 执行动作,得到奖励 Rt+1 和下一状态 St+1
  3. 用 Q-Learning 更新公式修正 Q(St,At)
  4. 转到下一状态,继续循环