Q-learning
Q-learning:从入门到理解,再到足式机器人中的应用
Q-learning 是强化学习(Reinforcement Learning, RL)中最经典的算法之一。很多人第一次接触强化学习,都是从它开始的。它结构简单、思想清晰,而且把强化学习中几个最核心的问题都体现得很完整:状态是什么、动作怎么选、奖励如何定义、以及智能体如何通过试错逐步学会更优策略。
对于初学者来说,Q-learning 是理解强化学习的最佳入口;对于做机器人,尤其是足式机器人的人来说,它虽然未必直接用于高维连续控制,但它背后的思想——通过与环境交互不断更新动作价值——仍然是后续很多现代算法的基础。
这篇文章会从以下几个方面展开:
- Q-learning 解决的是什么问题
- 它的数学基础是什么
- 它为什么能学到“更好”的动作
- 具体更新公式如何理解
- 一个简单的 Python 示例
- 它在足式机器人中的意义与局限
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 |
8.2 直观理解
Q-learning 的训练过程可以理解成:
- 用一张表记录每个状态下每个动作有多好
- 每尝试一次,就根据结果把表里的对应数字修正一点
- 试得越多,这张表越接近真实最优解
当状态和动作空间都比较小的时候,这种“查表 + 更新”的方法非常直接有效。
9. 一个简单例子:走迷宫
假设有一个简单网格世界:
- 智能体起点在左上角
- 终点在右下角
- 每走一步奖励为 $-1$
- 到达终点奖励为 $+10$
- 撞墙可以不给移动,并额外惩罚
那么 Q-learning 会逐渐学到:
- 哪些路径更短
- 哪些动作会导致绕远
- 哪些状态下应该向哪个方向走
由于每一步都要付出代价,所以算法倾向于找到总奖励更高的路径,也就是更短、更有效率的路线。
这类例子虽然简单,但已经足够展示 Q-learning 的本质。
10. Python 实现一个最小 Q-learning
下面给一个尽量简洁的示例。为了突出 Q-learning 核心思想,这里用一个离散状态的简单环境表示。
import numpy as np |
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 值:
- 状态空间和动作空间有限
- 每个状态-动作对都被充分访问
- 学习率满足一定衰减条件
- 环境满足马尔可夫性质
直观上说,原因在于:
- 每次更新都在朝贝尔曼最优方程靠近
- 如果探索足够充分,就不会遗漏某些动作
- 如果学习率逐渐减小,后期更新会越来越稳定
不过要注意,这个收敛结论主要适用于表格型 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 是强化学习中最基础、最经典、也最值得认真理解的算法之一。
它的核心思想可以概括为:
- 用 $Q(s,a)$ 表示状态-动作对的长期价值
- 通过与环境交互获得奖励和下一个状态
- 利用 TD 更新不断修正价值估计
- 通过探索与利用的平衡逐渐学到更优策略
它的重要更新公式是:
$$
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. 延伸阅读
如果你接下来想继续写强化学习系列博客,可以按照这个顺序展开:
- SARSA:与 Q-learning 的区别
- DQN:从 Q 表到神经网络
- Policy Gradient:直接学习策略
- Actor-Critic:价值与策略结合
- PPO / SAC:机器人中更常用的现代算法
这样整套内容会非常自然,也很适合形成一个系列专栏。
20. 参考理解
虽然本文以直观解释为主,但如果你想更系统地学习,建议配合以下内容一起看:
- Sutton & Barto《Reinforcement Learning: An Introduction》
- David Silver 的强化学习课程
- OpenAI Spinning Up
- 机器人强化学习相关论文与开源项目
如果把一句话作为全文结尾,那就是:
Q-learning 教会我们的,不只是一个算法,而是一种“通过交互、估计未来、不断修正决策”的思维方式。






