Q-learning:从入门到理解,再到足式机器人中的应用

Q-learning 是强化学习(Reinforcement Learning, RL)中最经典的算法之一。很多人第一次接触强化学习,都是从它开始的。它结构简单、思想清晰,而且把强化学习中几个最核心的问题都体现得很完整:状态是什么、动作怎么选、奖励如何定义、以及智能体如何通过试错逐步学会更优策略

对于初学者来说,Q-learning 是理解强化学习的最佳入口;对于做机器人,尤其是足式机器人的人来说,它虽然未必直接用于高维连续控制,但它背后的思想——通过与环境交互不断更新动作价值——仍然是后续很多现代算法的基础。

这篇文章会从以下几个方面展开:

  1. Q-learning 解决的是什么问题
  2. 它的数学基础是什么
  3. 它为什么能学到“更好”的动作
  4. 具体更新公式如何理解
  5. 一个简单的 Python 示例
  6. 它在足式机器人中的意义与局限

1. 强化学习到底在做什么?

在监督学习里,我们通常有一批带标签的数据,模型要做的是拟合输入和输出之间的映射。而在强化学习里,没有人直接告诉智能体“正确答案是什么”,智能体只能通过和环境不断交互,根据环境返回的奖励(reward)来调整自己的行为。

一个典型的强化学习过程如下:

  • 智能体(Agent)观察当前状态 $s_t$
  • 根据策略选择一个动作 $a_t$
  • 环境执行这个动作后,返回:
    • 即时奖励 $r_t$
    • 下一个状态 $s_{t+1}$
  • 智能体根据这次交互更新自己的决策规则

目标是让智能体学会一种策略,使得长期累积奖励最大化

这件事看起来很像训练动物:

  • 做对了,给奖励
  • 做错了,给惩罚
  • 经过大量尝试,最终学会更优行为

2. 马尔可夫决策过程(MDP)

Q-learning 通常建立在马尔可夫决策过程(Markov Decision Process, MDP)框架上。

一个 MDP 通常由五元组表示:

$$
(S, A, P, R, \gamma)
$$

其中:

  • $S$:状态集合(State Space)
  • $A$:动作集合(Action Space)
  • $P(s’|s,a)$:状态转移概率
  • $R(s,a,s’)$:奖励函数
  • $\gamma$:折扣因子(Discount Factor)

2.1 马尔可夫性质

所谓马尔可夫性质,是指:

下一个状态只与当前状态和当前动作有关,而与更早之前的历史无关。

用公式表示就是:

$$
P(s_{t+1}|s_t, a_t, s_{t-1}, a_{t-1}, \dots) = P(s_{t+1}|s_t, a_t)
$$

这让问题变得可以建模和求解。


3. 什么是 Q 值?

Q-learning 里的 “Q” 指的是 Action-Value Function,也就是动作价值函数

它回答的问题是:

在状态 $s$ 下执行动作 $a$,从长期来看到底有多好?

记作:

$$
Q(s, a)
$$

如果一个动作能带来更高的长期累计奖励,那么它的 Q 值就更大。

3.1 回报(Return)

强化学习关注的不是只看当前奖励,而是未来一段时间的累计收益,也叫回报(return):

$$
G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots
$$

其中:

  • $\gamma \in [0,1]$
  • 当 $\gamma$ 越接近 1,智能体越“看重未来”
  • 当 $\gamma$ 越小,智能体越“短视”

因此,Q 值本质上是某个状态-动作对的期望长期收益


4. 贝尔曼最优方程

Q-learning 的核心理论基础来自贝尔曼方程(Bellman Equation)。

最优动作价值函数满足:

$$
Q^(s,a) = \mathbb{E}\left[r + \gamma \max_{a’} Q^(s’, a’) \mid s, a\right]
$$

这条公式非常重要,它表达了一个递归思想:

  • 当前动作的价值
  • 等于当前拿到的奖励
  • 加上下一个状态里“最优动作”的未来价值

换句话说:

一个动作好不好,不只取决于眼前奖励,还取决于它把你带到了一个怎样的未来状态。

这就是动态规划思想在强化学习中的体现。


5. Q-learning 的更新公式

Q-learning 的经典更新公式是:

$$
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[r_t + \gamma \max_{a’} Q(s_{t+1}, a’) - Q(s_t, a_t)\right]
$$

其中:

  • $\alpha$:学习率(learning rate)
  • $r_t$:当前奖励
  • $\gamma$:折扣因子
  • $\max_{a’}Q(s_{t+1}, a’)$:下一个状态下最优动作的估计价值

我们把中括号里的部分称为 TD Error(时序差分误差)

$$
\delta_t = r_t + \gamma \max_{a’} Q(s_{t+1}, a’) - Q(s_t, a_t)
$$

它表示:

“这次实际观测到的结果” 和 “我之前对这个动作的估计” 之间的误差。

如果误差为正,说明这个动作比原来想象得更好,Q 值就应该上调;
如果误差为负,说明原来高估了,Q 值就应该下调。

这其实和监督学习里“根据误差修正参数”是很像的。


6. 为什么 Q-learning 是 Off-policy?

Q-learning 常被称为 off-policy 算法。

这是因为它在更新时使用的是:

$$
\max_{a’} Q(s_{t+1}, a’)
$$

也就是说,它假设下一个状态会选择当前估计下最优的动作,而不是智能体实际上执行的动作。

这意味着:

  • 行为策略(Behavior Policy):用于与环境交互,例如 $\epsilon$-greedy
  • 目标策略(Target Policy):用于更新价值,通常是 greedy policy

行为和学习目标不一致,所以它是 off-policy。

与之相对,SARSA 是 on-policy,它更新时使用的是实际执行的下一个动作:

$$
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha [r_t + \gamma Q(s_{t+1}, a_{t+1}) - Q(s_t, a_t)]
$$

简而言之:

  • Q-learning 更“理想主义”:总是朝着最优动作估计
  • SARSA 更“现实主义”:按照真实执行的动作更新

7. 探索与利用:为什么不能只选当前最优动作?

如果智能体一开始就只选择当前 Q 值最大的动作,会出现一个问题:

由于初始估计并不准,智能体可能过早陷入局部最优,错过更好的动作。

因此强化学习中必须平衡两件事:

  • Exploration(探索):尝试没怎么选过的动作
  • Exploitation(利用):优先选择当前看起来最好的动作

7.1 $\epsilon$-greedy 策略

Q-learning 最常见的做法是 $\epsilon$-greedy:

  • 以概率 $\epsilon$ 随机选动作(探索)
  • 以概率 $1-\epsilon$ 选择当前 Q 值最大的动作(利用)

公式可以写成:

$$
\pi(a|s)=
\begin{cases}
1-\epsilon + \frac{\epsilon}{|A|}, & a = \arg\max_{a’}Q(s,a’) \
\frac{\epsilon}{|A|}, & \text{otherwise}
\end{cases}
$$

在训练初期,通常会让 $\epsilon$ 大一点,鼓励更多探索;
在训练后期,再逐步减小 $\epsilon$,让策略更稳定。


8. Q-learning 的算法流程

下面给出一个标准的 tabular Q-learning 流程。

8.1 伪代码

初始化 Q(s, a) = 0

for 每一个 episode:
初始化起始状态 s
while s 不是终止状态:
根据 epsilon-greedy 从 Q 中选择动作 a
执行动作 a,得到奖励 r 和下一状态 s'
Q(s, a) ← Q(s, a) + α [r + γ max_a' Q(s', a') - Q(s, a)]
s ← s'

8.2 直观理解

Q-learning 的训练过程可以理解成:

  • 用一张表记录每个状态下每个动作有多好
  • 每尝试一次,就根据结果把表里的对应数字修正一点
  • 试得越多,这张表越接近真实最优解

当状态和动作空间都比较小的时候,这种“查表 + 更新”的方法非常直接有效。


9. 一个简单例子:走迷宫

假设有一个简单网格世界:

  • 智能体起点在左上角
  • 终点在右下角
  • 每走一步奖励为 $-1$
  • 到达终点奖励为 $+10$
  • 撞墙可以不给移动,并额外惩罚

那么 Q-learning 会逐渐学到:

  • 哪些路径更短
  • 哪些动作会导致绕远
  • 哪些状态下应该向哪个方向走

由于每一步都要付出代价,所以算法倾向于找到总奖励更高的路径,也就是更短、更有效率的路线。

这类例子虽然简单,但已经足够展示 Q-learning 的本质。


10. Python 实现一个最小 Q-learning

下面给一个尽量简洁的示例。为了突出 Q-learning 核心思想,这里用一个离散状态的简单环境表示。

import numpy as np
import random

# 假设有 6 个状态,2 个动作
n_states = 6
n_actions = 2
Q = np.zeros((n_states, n_actions))

alpha = 0.1 # 学习率
gamma = 0.99 # 折扣因子
epsilon = 0.1 # 探索概率
episodes = 500

# 一个玩具转移函数:仅用于演示
# 返回 next_state, reward, done
transitions = {
0: {0: (1, 0, False), 1: (2, 0, False)},
1: {0: (3, 0, False), 1: (4, -1, False)},
2: {0: (4, 0, False), 1: (5, 10, True)},
3: {0: (5, 10, True), 1: (4, 0, False)},
4: {0: (5, 10, True), 1: (0, -1, False)},
5: {0: (5, 0, True), 1: (5, 0, True)},
}


def choose_action(state):
if random.random() < epsilon:
return random.randint(0, n_actions - 1)
return int(np.argmax(Q[state]))


for episode in range(episodes):
state = 0
done = False

while not done:
action = choose_action(state)
next_state, reward, done = transitions[state][action]

td_target = reward + gamma * np.max(Q[next_state]) * (0 if done else 1)
td_error = td_target - Q[state, action]
Q[state, action] += alpha * td_error

state = next_state

print("Learned Q-table:")
print(Q)
print("Greedy policy:")
print(np.argmax(Q, axis=1))

10.1 这段代码做了什么?

  • Q 是一张表,行表示状态,列表示动作
  • choose_action() 使用 $\epsilon$-greedy 选动作
  • 每走一步,就计算一次 TD target 和 TD error
  • 然后更新对应的 $Q(s,a)$

训练完成后,如果环境设计合理,np.argmax(Q, axis=1) 就表示每个状态下学到的最优动作。


11. 手算一次更新,更容易理解公式

假设当前有:

  • 当前状态:$s_t = s_1$
  • 当前动作:$a_t = a_0$
  • 当前 Q 值:$Q(s_1, a_0) = 2.0$
  • 执行动作后奖励:$r_t = 1.0$
  • 下一个状态中最大 Q 值:$\max_{a’}Q(s_{t+1}, a’) = 3.0$
  • 学习率:$\alpha = 0.1$
  • 折扣因子:$\gamma = 0.9$

那么目标值为:

$$
1.0 + 0.9 \times 3.0 = 3.7
$$

TD 误差为:

$$
3.7 - 2.0 = 1.7
$$

更新后:

$$
Q(s_1, a_0) \leftarrow 2.0 + 0.1 \times 1.7 = 2.17
$$

这说明:

  • 原来估计这个动作值 2.0
  • 这次看起来它其实值 3.7
  • 于是向更大的值修正一点点,变成 2.17

经过大量这样的更新后,Q 值就会逐步逼近最优动作价值函数。


12. Q-learning 为什么能收敛?

在理论上,tabular Q-learning 在满足一定条件时可以收敛到最优 Q 值:

  1. 状态空间和动作空间有限
  2. 每个状态-动作对都被充分访问
  3. 学习率满足一定衰减条件
  4. 环境满足马尔可夫性质

直观上说,原因在于:

  • 每次更新都在朝贝尔曼最优方程靠近
  • 如果探索足够充分,就不会遗漏某些动作
  • 如果学习率逐渐减小,后期更新会越来越稳定

不过要注意,这个收敛结论主要适用于表格型 Q-learning。一旦把 Q 函数换成深度神经网络,问题就会复杂得多,也就引出了后来的 DQN、Double DQN、Dueling DQN 等方法。


13. Q-learning 的优点与局限

13.1 优点

1. 思想清晰,入门友好
Q-learning 非常适合用来理解强化学习中的核心概念。

2. 不需要环境模型
它是 model-free 方法,不需要提前知道状态转移概率。

3. 实现简单
对于小规模离散问题,只需要一个 Q 表即可完成训练。

4. 能学习最优策略
在适当条件下,能够逼近最优动作价值函数。

13.2 局限

1. 只能直接处理离散动作问题
标准 Q-learning 更适合有限离散动作空间,面对连续动作控制会很困难。

2. 状态空间一大就不行
如果状态维度很高,Q 表会迅速膨胀,存储和学习都不现实。

3. 样本效率有限
通常需要大量交互才能学到稳定策略。

4. 对奖励设计敏感
如果奖励函数设计不合理,智能体可能学到“投机取巧”的行为。


14. Q-learning 与足式机器人

既然标签里提到了足式机器人,那就很有必要讨论一个现实问题:

Q-learning 能不能直接用来控制四足机器人或双足机器人?

答案是:可以作为入门和局部问题求解工具,但很少直接用于原始高维关节控制。

14.1 为什么经典 Q-learning 不适合直接做足式机器人的底层控制?

足式机器人控制通常具有以下特点:

  • 状态维度非常高:关节角、关节速度、机身姿态、足端接触状态、地形信息等
  • 动作往往是连续的:关节力矩、期望位置、期望速度、阻抗参数等
  • 动态系统强耦合、非线性明显
  • 试错成本很高,真实机器人不允许无限探索

而经典 Q-learning 的问题在于:

  • 它通常依赖离散状态和离散动作
  • 需要大量探索
  • 查表方法无法扩展到高维连续空间

所以如果直接把“机器人所有传感器状态 + 所有关节动作”塞进 Q 表,几乎不可行。

14.2 那它在足式机器人中还有什么意义?

仍然有,而且很重要。

(1)用于简化后的高层决策

Q-learning 很适合解决一些离散化的高层行为选择问题,例如:

  • 当前地形下选择哪一种步态(walk / trot / pace / bound)
  • 遇到扰动时选择哪种恢复策略
  • 在不同能耗与速度目标之间进行模式切换
  • 脚点候选集合中选择更优落脚点

这时,动作空间可以离散化,状态空间也可以只保留核心高层信息,Q-learning 就有实际价值。

(2)用于教学和原型验证

如果你正在做机器人强化学习,Q-learning 是一个非常好的教学工具。它能帮助你先建立:

  • 状态设计意识
  • 奖励函数设计意识
  • 策略更新与价值评估意识

这些想法在更复杂的算法里依然成立。66666666666666666666666666666666666666666666666666666

(3)作为现代方法的概念基础

很多更适合机器人控制的方法,本质上都继承了 Q-learning 的思想,例如:

  • DQN:用神经网络近似 Q 函数66666666666666666666666666666666666666666666666666666
  • DDPG / TD3:处理连续动作空间的 actor-critic 方法
  • SAC:更稳定、样本效率更高,常用于机器人控制
  • PPO:虽然不是 Q-learning 路线,但在机器人里也非常常见

所以理解 Q-learning,有助于理解后续几乎所有强化学习控制算法。


15. 在机器人任务中如何设计状态、动作与奖励?

即使不直接使用 tabular Q-learning,下面这些问题仍然是强化学习做机器人时必须认真思考的。

15.1 状态(State)

在足式机器人中,状态通常可能包括:

  • 机身位置与姿态
  • 线速度与角速度
  • 关节角与关节速度
  • 足端接触信息
  • 目标速度命令
  • 地形感知信息

但对于 Q-learning,如果希望保留表格形式,往往需要做强烈离散化,例如:

  • 姿态是否稳定:稳定 / 不稳定
  • 地形类型:平地 / 斜坡 / 台阶 / 障碍
  • 前进速度等级:低 / 中 / 高
  • 接触状态模式:若干离散类

15.2 动作(Action)

在高层决策里,动作可以设计成:

  • 选择步态模式
  • 切换控制器参数组
  • 选择恢复行为
  • 选择离散脚点

15.3 奖励(Reward)

奖励设计通常是最难的部分之一。常见的目标包括:

  • 前进速度越接近期望值越好
  • 能耗越低越好
  • 姿态越稳定越好
  • 滑倒、摔倒、碰撞需要惩罚
  • 步态切换频繁可以施加平滑性惩罚

一个简化的奖励函数可能写成:

$$
r = w_1 r_{\text{velocity}} + w_2 r_{\text{stability}} - w_3 r_{\text{energy}} - w_4 r_{\text{fall}}
$$

其中 $w_1, w_2, w_3, w_4$ 是权重。

奖励设计得好不好,往往直接决定算法最后学出来的是“真的聪明”,还是“看起来在钻空子”。


16. 从 Q-learning 到更现代的强化学习方法

如果把强化学习算法的发展看成一条路线,那么 Q-learning 基本上处在很前面的核心位置。

16.1 DQN

当状态空间太大,Q 表存不下时,就可以用神经网络来近似:

$$
Q(s,a;\theta)
$$

这就是 Deep Q-Network(DQN)的基本思想。

16.2 连续动作控制

但 DQN 仍然更适合离散动作。对于机器人这种连续控制问题,更常见的是:

  • DDPG
  • TD3
  • SAC
  • PPO

其中,SAC 和 PPO 在机器人领域尤其常见。

16.3 为什么仍然建议先学 Q-learning?

因为它最能帮助你理解这些关键问题:

  • 什么叫价值函数
  • 什么叫 bootstrap
  • 什么叫 temporal difference
  • 什么叫 exploration vs exploitation
  • 什么叫 off-policy / on-policy

这些概念一旦真正理解,后面学更复杂的方法会轻松很多。


17. 一个常见误区

很多初学者会把 Q-learning 理解成:

“给每个动作打分,然后选分数最高的。”

这个说法不算错,但不完整。

更准确地说,Q-learning 学习的是:

当前动作对未来长期收益的估计。

这和“当前这一步看起来好不好”不是一回事。很多动作眼前看起来吃亏,但能把系统带到更好的状态;也有些动作眼前奖励不错,但长期会导致更差结果。

Q-learning 真正厉害的地方就在于:

它通过 bootstrapping,把“未来最优价值”逐步传播回当前状态。

这也是为什么它能做出带有“远见”的决策。


18. 总结

Q-learning 是强化学习中最基础、最经典、也最值得认真理解的算法之一。

它的核心思想可以概括为:

  1. 用 $Q(s,a)$ 表示状态-动作对的长期价值
  2. 通过与环境交互获得奖励和下一个状态
  3. 利用 TD 更新不断修正价值估计
  4. 通过探索与利用的平衡逐渐学到更优策略

它的重要更新公式是:

$$
Q(s_t, a_t) \leftarrow Q(s_t, a_t) + \alpha \left[r_t + \gamma \max_{a’} Q(s_{t+1}, a’) - Q(s_t, a_t)\right]
$$

对于离散、小规模问题,它非常有效;对于高维连续控制问题,它又构成了很多现代强化学习算法的思想基础。

放到足式机器人场景中,经典 Q-learning 更适合:

  • 高层离散决策
  • 原型验证
  • 教学和概念理解

而不太适合直接做底层关节连续控制。但无论如何,理解 Q-learning,几乎是进入强化学习和机器人学习控制世界的一道必经之门。


19. 延伸阅读

如果你接下来想继续写强化学习系列博客,可以按照这个顺序展开:

  1. SARSA:与 Q-learning 的区别
  2. DQN:从 Q 表到神经网络
  3. Policy Gradient:直接学习策略
  4. Actor-Critic:价值与策略结合
  5. PPO / SAC:机器人中更常用的现代算法

这样整套内容会非常自然,也很适合形成一个系列专栏。


20. 参考理解

虽然本文以直观解释为主,但如果你想更系统地学习,建议配合以下内容一起看:

  • Sutton & Barto《Reinforcement Learning: An Introduction》
  • David Silver 的强化学习课程
  • OpenAI Spinning Up
  • 机器人强化学习相关论文与开源项目

如果把一句话作为全文结尾,那就是:

Q-learning 教会我们的,不只是一个算法,而是一种“通过交互、估计未来、不断修正决策”的思维方式。