想象一位叫小厨的年轻厨师,第一次站到后厨灶台前,想学做一道酸菜鱼。他有两种学法:第一种是找一本详细菜谱,把备菜、腌鱼、炒料、加水、下鱼片的每个步骤都提前记在心里,甚至可以闭上眼睛推演一遍;第二种是直接点火上灶,凭手感操作,尝一口咸淡再调整。前者像 Model-based(基于模型),后者像 Model-free(无模型)。菜端上桌后,他又面临新的选择:是先评估整道菜的“价值”,还是直接决定下一秒放多少盐?于是又分出 基于价值(Value-based) 与 基于策略(Policy-based) 两派。再往后,他发现学习资料的来源也不同:是只能用自己当天的菜谱产生的经验,还是能用师兄弟的旧笔记?这又引出 On-policy(在线策略) 与 Off-policy(离线策略)。 本文就沿着小厨学做菜的这条主线,把强化学习中最重要的几个分类维度讲清楚,再带你看懂 DQN、Q-Learning、SARSA、REINFORCE 这些经典算法分别站在哪个“象限”里。
掌握强化学习算法分类,是进入 AI 决策系统的第一步。它能帮你在游戏、机器人、推荐系统等场景中,快速选对算法方向,避免“拿菜谱去修车”式的错配。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
强化学习算法四维分类框架 四个维度正交组合 → 覆盖所有RL算法 | 根据任务需求选择合适算法Model-based vs Model-freeModel-based四个维度正交组合 → 覆盖所有RL算法 | 根据任务需求选择合适算法四个维度正交组合 → 覆盖所有RL算法 | 根据任务需求选择合适算法Model-based vs Model-freeModel-based四个维度正交组合 → 覆盖所有RL算法 | 根据任务需求选择合适算法 四个维度正交组合 → 覆盖所有RL算法 | 根据任务需...
学习框架:智能体、环境与奖励
第一天进后厨,小厨站在灶台前,面前是一盆酸菜、一条鱼和一口烧热的锅。他不知道该先腌鱼还是先炒料,于是师父告诉他:你是一个智能体,厨房是你的环境,鱼在锅里的生熟程度是状态,你每一次下勺、翻面、加料是动作,而客人夹起鱼肉的表情就是奖励。就这么一个四件套,构成了强化学习的最小闭环。
传统机器学习盯着静态数据集反复拟合,强化学习却是在动态交互中不断试错。智能体每做一个动作,环境就给出新状态和奖励;这个循环不断推进,智能体才慢慢学会“在什么状态下做什么动作”。因此,状态、动作、奖励、环境这四样东西,是所有强化学习算法的共同舞台,后续所有的分类维度都在这套框架上展开。
为了比较谁学得好,我们要给“好吃程度”算总账。只看当前一口不够,因为酸菜鱼的咸香是出锅后才显现的,所以要用折扣累计回报来衡量:
对小厨来说,这就是他给自己未来所有“好吃程度”开的长期账单。有了这份账单,后面的算法分类才立得住。
- 累计回报 G_t表示从时刻 t 开始,未来所有即时奖励折算到现在的总和。
- 即时奖励 R_{t+1}当前这一步动作结束后,环境立刻返回的分数。
- 折扣因子 γ^kγ 在 0 到 1 之间,k 越大,远期奖励被打的折扣越狠。
- 求和符号把从第 1 步到最后一步所有打折后的奖励都累加起来。
有无模型:菜谱派与实战派
小厨问师父,学一道新菜,要不要先背菜谱?师父说,背菜谱的徒弟叫 Model-based,不背菜谱直接上灶台的叫 Model-free。背菜谱的人会先建立一个“环境模型”:盐放 5 克鱼片会怎样变化,汤烧开后下鱼片几秒能熟。有了这个模型,他可以在心里把流程推演一遍再动手,省材料。不背菜谱的人直接做,出锅后尝一口,再根据反馈调整,虽然会浪费几条鱼,但练出的手感更贴近真实灶台。
在强化学习里,“模型”指的是环境的状态转移规律:智能体在状态 s 做出动作 a 之后,环境会跳到哪个新状态 s′、给出什么奖励 r。Model-based 方法尝试估计这个规律,再基于它做规划;Model-free 方法干脆不学这个规律,直接从真实交互的经验里学价值或策略。
对小厨来说,背菜谱的徒弟能“脑内推演”,但真正灶台的火候很难写进菜谱;实战派虽然费鱼,却永远在真实反馈中纠偏。今天的主流深度强化学习,大多走 Model-free 这条更通用的路。
- 状态 s 和动作 a当前的灶台火候和小厨刚做出的动作。
- 下一状态 s′ 与奖励 r动作执行完后,环境反馈的新状态和分数。
- 条件概率 Pr表示在给定当前状态动作的情况下,这个转移发生的概率。
- 环境模型的意义如果这个概率可预测,就能做规划;否则只能靠试错。
策略学习方式:打分派与行动派
接下来,小厨发现即使是无模型的徒弟,动手风格也分两派。一派是“打分派”:给每道工序都打一个分,然后选分数最高的动作。另一派是“行动派”:不看总分,直接凭策略出招,比如“看到鱼片泛白就翻面”,把从状态到动作的映射直接学出来。打分派对应 Value-based,行动派对应 Policy-based。
打分派的招牌是动作价值函数 Q(s,a),字面意思是“在状态 s 这个灶台火候下,做动作 a 带来的长期期望回报”。有了它,策略可以很偷懒:哪个动作 Q 值高就做哪个。行动派则直接维护一个策略 π(a|s),把每一步的动作概率都练出来,适合连续动作场景,比如机械臂拧多大力、方向盘转几度。
对小厨来说,打分派要把“加盐”“加醋”“加水”都打出分来,然后稳稳选最高分;行动派则直接形成肌肉记忆,一步到位。两者没有高下,只是不同的出招哲学。
- 动作价值 Q^π(s,a)给“当前状态 + 某个动作”这个组合打分。
- 期望符号 E_π在策略 π 的随机性下求平均。
- 条件 G_t|S_t=s,A_t=a固定当前状态与动作,观察未来的回报。
- 整体含义动作越好,价值越高;Value-based 算法据此选动作。
在线与离线:自己的练习与师兄的笔记
小厨还发现,同样是练厨艺,有的师兄只用自己的菜谱练,这叫 On-policy;有的师兄拿来一堆别人做菜的笔记,照着笔记揣摩,这叫 Off-policy。差别不在数据从哪来,而在学习的目标策略和产生数据的行为策略是不是同一个。
On-policy 像“一边开车一边看路”,学习数据必须由当前策略产生,策略一更新,老数据就有点过期。Off-policy 像“翻日记复盘”,前任厨师留下的记录虽然行为策略不同,但照样能提炼经验,所以样本利用效率更高。正因为 Off-policy 能反复使用旧数据,后面才有了 DQN 的经验回放,把整段整段的做菜经历存进记忆库,随机抽出来温习。
Q-Learning 的更新公式最能体现 Off-policy 的味道:
对小厨来说,师兄的笔记虽然来自不同的做菜习惯,但只要足够多、足够杂,一样能把“好吃”的规律提炼出来。这就是 Off-policy 最迷人的地方。
- 更新目标把 Q(s,a) 往带折扣的最优未来价值方向拉近。
- 学习率 α控制每次吸收新经验的幅度,太大容易震荡,太小学得慢。
- TD 目标当前奖励 r 加上下一状态的最优 Q 值。
- 离策略的关键目标里用的是 max,而不是行为策略实际做的动作。
代表算法巡礼:四道经典名菜
把上面三对维度像叠调料一样叠起来,就得到几道经典名菜。Q-Learning 是表格版的离线价值学习,属于 Model-free、Value-based、Off-policy;DQN 是它的深度网络版,用神经网络拟合 Q 值,加经验回放,是强化学习登上深度时代的代表作;SARSA 是 On-policy 的表格式价值算法,边采边学,保守稳定;REINFORCE 则是 Model-free、Policy-based、On-policy 的策略梯度算法,直接调策略参数。
DQN 之所以出名,是因为它把深度学习和 Q 值函数成功结合,在 Atari 游戏里打出了超人类水平。它的损失函数像一张“厨师考试评分卡”:
对初学者来说,记住“DQN = 深度网络 + 经验回放 + 离线价值学习”就够了。它让打菜谱从手抄表格升级成了自动笔记系统。
- 经验池 D从记忆库里随机抽一批做菜经验。
- 目标网络参数 θ⁻用来计算稳定目标值,不随每一步即时更新。
- TD 误差目标值和当前预测值之间的差距,差距越小越好。
- 平方与期望先平方让正负误差都为正,再对批量求平均。
算法选择:从任务出发做选择
最后一节课,师父让小厨自己设计新菜。选哪一派,取决于任务本身。如果环境是仿真器,摔坏不心疼,就可以优先试 Model-based;如果动作是连续的,比如机械臂关节角度,策略梯度这类 Policy-based 更顺手;如果历史数据很多但不能重新采样,Off-policy 能把旧数据喂给算法;如果要求边试边学、即时反馈,On-policy 更稳妥。
所有这些选择,最终都落在一个目标上:让期望累计回报最大化。我们可以把策略的“总成绩单”写成:
回到小厨身上:没有绝对最好的菜谱,只有最适合今天食材的选择。分类学的意义不是把人分成三六九等,而是让你在动手前,先知道自己在哪条路上。
- 策略总得分 J(π_θ)评价一个策略好不好用的最终指标。
- 轨迹 τ一条从开始到结束的状态动作序列。
- 累计折扣奖励把一条轨迹上所有奖励按时间折扣相加。
- 期望运算因为策略和环境的随机性,要取平均意义下的分数。
AI 应用场景
游戏 AI 陪练
阶段:策略选择与模型训练
解决的问题:传统游戏 AI 靠规则脚本写死,玩家多走几步就会被看穿。DQN 这类 Model-free、Value-based、Off-policy 算法可以从像素画面直接学习动作价值,配合经验回放,让 NPC 越打越聪明。
具体案例:某游戏团队用 DQN 训练一个 Boss 战 AI,先让它与自己的历史数据反复离线学习,再上线和玩家对战。因为用的是 Off-policy,训练时把早前“打不过”的经验也存进记忆库,模型进步明显快于传统脚本。
机器人抓取任务
阶段:策略选型与训练
解决的问题:机械臂在真实环境里试错成本高,砸坏夹爪很贵。工程师先在有模型的仿真器里训练策略,再用策略梯度方法学习连续关节控制,最后再迁移到真机上微调。
具体案例:某仓储机器人团队用 Model-based 方式搭建仿真环境,先生成大量“虚拟抓取”经验;再用 Policy-based 策略梯度优化连续动作,让机械臂学会不同角度抓取箱子,大幅减少真实试错次数。
推荐系统中的离线学习
阶段:离线评估与策略优化
解决的问题:推荐系统每次向用户展示内容,都是一次动作;用户点击与否就是奖励。若每次都重新采样,成本太高。Off-policy 方法可以直接利用历史行为日志训练价值函数,预估每个动作的价值。
具体案例:某在线内容平台把用户一周的曝光与点击日志存入经验池,用类似 Q-Learning 的价值更新方式训练“点击价值预估模型”,再用价值最高动作决定推荐顺序,使 CTR 提升了 8%。
Python 演示
import random # 一个只有 4 个状态、3 个动作的微型环境ENV = { (0, 0): (1, 0.0, False), (0, 1): (0, -1.0, False), (0, 2): (2, 0.0, False), (1, 0): (3, 1.0, True), (1, 1): (0, 0.0, False), (1, 2): (1, -0.1, False), (2, 0): (2, 0.0, False), (2, 1): (3, 0.5, True), (2, 2): (1, -0.2, False),} def epsilon_greedy(Q, state, epsilon=0.1): """按 epsilon 概率随机探索,否则选 Q 值最大的动作""" if random.random() < epsilon: return random.randint(0, len(Q[state]) - 1) return max(range(len(Q[state])), key=lambda a: Q[state][a]) def q_learning_update(Q, s, a, r, s2, alpha=0.1, gamma=0.9): """Off-policy:用下一状态的最优 Q 值更新""" best_next = max(Q[s2]) Q[s][a] += alpha * (r + gamma * best_next - Q[s][a]) def sarsa_update(Q, s, a, r, s2, a2, alpha=0.1, gamma=0.9): """On-policy:用当前策略选出的下一个动作更新""" Q[s][a] += alpha * (r + gamma * Q[s2][a2] - Q[s][a]) def simulate(use_sarsa, episodes=500): Q = [[0.0, 0.0, 0.0] for _ in range(4)] for _ in range(episodes): s = 0 a = epsilon_greedy(Q, s) while True: s2, r, done = ENV[(s, a)] if use_sarsa: a2 = epsilon_greedy(Q, s2) sarsa_update(Q, s, a, r, s2, a2) a = a2 else: q_learning_update(Q, s, a, r, s2) a = epsilon_greedy(Q, s2) s = s2 if done: break return Q if __name__ == "__main__": random.seed(0) q_qlearning = simulate(use_sarsa=False) q_sarsa = simulate(use_sarsa=True) print("Q-learning final Q:") for row in q_qlearning: print([round(x, 2) for x in row]) print("SARSA final Q:") for row in q_sarsa: print([round(x, 2) for x in row])
best_next = max(Q[s2])这是 Q-Learning 的离策略关键:它直接取下一状态最优动作的价值,而不是当前行为策略实际选的动作。Q[s][a] += alpha * (r + gamma * best_next - Q[s][a])Q 表按 TD 误差方向更新,一步就把当前估计拉向目标。a2 = epsilon_greedy(Q, s2)SARSA 必须先按当前策略选出下一个动作,再用这个动作的价值来做目标。Q[s][a] += alpha * (r + gamma * Q[s2][a2] - Q[s][a])SARSA 的目标依赖行为策略实际选出的动作,所以是 On-policy。simulate(use_sarsa=False)同一个环境分两次实验,控制变量,只用是否使用 SARSA 来区分两种更新方式。
常见误区
误区无模型方法是不是完全不用模型?那 DQN 里的神经网络算什么模型?
正解这里的“模型”特指环境模型,即状态转移和奖励的预测器。DQN 用的神经网络是价值函数的拟合器,不属于环境模型。Model-free 只是不显式学习“环境会怎么变”,但可以用网络去拟合价值函数或策略。
为何常见:因为“model”这个词在机器学习里太常用来表示“任何函数”,人们容易把环境模型和值函数模型混为一谈。
误区Off-policy 能复用旧数据、样本效率高,是不是全面碾压 On-policy?
正解并非如此。On-policy 方法数据和目标策略保持一致,训练过程更稳定,策略更新不容易被分布偏移带偏。Off-policy 虽然样本效率高,但对超参数和经验回放的质量更敏感,也更容易不稳定。
为何常见:看到“复用旧经验”就觉得更聪明,忽略了训练稳定性和实现复杂度也是工程中的关键指标。
误区Policy-based 直接输出动作,还能处理连续控制,是不是比 Value-based 高级?
正解两者是不同路线的解题思路,没有高下。Value-based 在离散动作空间里通常更稳、数据效率也不错;Policy-based 更适合连续动作和随机策略。很多实际系统还会把两者结合成 Actor-Critic。
为何常见:因为 Policy-based 能解决的问题听起来更广,初学者容易被“能力范围”误导,而忽略了不同方法各自的适用边界。
误区DQN 用了深度网络,应该属于 Policy-based 吧?
正解DQN 的网络拟合的是动作价值函数 Q(s,a),最终策略只是对所有动作取 Q 值最大的那个,并没有直接输出策略。因此 DQN 属于 Value-based、Model-free、Off-policy 算法。
为何常见:把“深度学习”和“基于策略”两个概念混淆了,误以为所有深度方法都直接学策略。
面试题
Q1. 强化学习中,“无模型”(Model-free)最准确的含义是什么?
- A.不需要预测环境变化
- B.不需要环境转移模型← 正确答案
- C.不需要设置奖励信号
- D.不需要定义动作空间
答案:B。Model-free 指不显式学习环境的状态转移和奖励模型,只从真实交互数据中学习。A 说法接近但不够准确,C 和 D 明显错误。就像小厨不背菜谱,但不代表他不需要锅和调料。
Q2. On-policy 学习最大的特点是什么?
- A.用当前策略产生的数据更新← 正确答案
- B.用任意历史数据也能更新
- C.只使用固定不变的数据集
- D.完全不需要探索动作空间
答案:A。On-policy 要求目标策略与行为策略一致,数据必须由当前策略产生。B 是 Off-policy 的特点,C 是监督学习,D 不可能,因为没有探索就学不到新经验。
Q3. DQN 在分类上属于哪种组合?
- A.无模型、基于值、离线学习← 正确答案
- B.有模型、基于值、在线学习
- C.无模型、基于策略、在线学习
- D.有模型、基于策略、离线学习
答案:A。DQN 没有显式学习环境转移规律,属于 Model-free;它用神经网络拟合 Q 值函数,属于 Value-based;它使用经验回放和 max 目标,目标策略与行为策略不同,属于 Off-policy。
Q4. 值函数 Q(s,a) 表示什么含义?
- A.状态s下执行动作a的期望回报← 正确答案
- B.状态s下所有动作的平均回报
- C.当前策略输出的动作概率
- D.环境结束时的累计奖励
答案:A。Q(s,a) 是给定状态 s 后执行动作 a,然后继续按策略走下去的期望累计回报。B 没有固定动作,C 是策略函数的定义,D 只取了终止时刻,都不完整。
Q5. 策略梯度方法相比值函数方法的主要优势之一是?
- A.能处理连续动作空间← 正确答案
- B.只需要更少的训练样本
- C.保证找到全局最优解
- D.不需要奖励信号反馈
答案:A。策略梯度直接输出策略,不依赖对每个离散动作求 max,所以能处理机械臂关节角度这样的连续动作空间。它并不保证全局最优,也需要奖励,样本效率通常也不比值函数方法更高。
Q6. Model-based 方法和 Model-free 方法的核心区别是?
- A.是否显式学习环境转移模型← 正确答案
- B.是否使用神经网络做函数逼近
- C.是否需要智能体与环境交互
- D.是否使用经验回放存储器
答案:A。核心区别在于是否学习“环境会如何变化”的模型。Model-based 用模型做规划,Model-free 跳过这一步。B、D 只是实现手段,C 是两者都需要的。
Q7. 经验回放(Experience Replay)主要解决什么问题?
- A.打破样本相关性并提高利用率← 正确答案
- B.降低神经网络训练的参数数量
- C.让策略一定收敛到全局最优
- D.让算法不需要定义状态空间
答案:A。经验回放把交互数据存进记忆库,再随机抽样训练,能打破连续样本之间的强相关性,也提高了旧数据的利用率。它不降低参数数量,也不能保证全局最优。
Q8. 关于无模型方法的特点,下列说法正确的是?
- A.直接学习状态动作价值← 正确答案
- B.直接学习当前策略网络← 正确答案
- C.不依赖环境转移模型← 正确答案
- D.需要提前知道奖励函数
答案:ABC。无模型方法可以直接学价值函数,也可以直接学策略网络,共同点是不依赖环境转移模型。奖励函数仍然通过环境交互获得,而不是提前告知的,所以 D 错误。
Q9. 关于 Off-policy 学习,下列说法正确的是?
- A.可以从旧经验样本中学习← 正确答案
- B.行为策略与目标策略可以不同← 正确答案
- C.必须使用当前策略采样数据
- D.常见代表算法有 Q-Learning← 正确答案
答案:ABD。Off-policy 允许用产生数据的“行为策略”与最终要学习的“目标策略”不一致,因此能复用旧经验。C 是 On-policy 的特征,Q-Learning 的更新目标用的是 max,不依赖行为策略,属于 Off-policy。
Q10. 在算法选型时,以下哪些说法是合理的?
- A.连续控制任务优先考虑策略梯度← 正确答案
- B.样本稀缺时优先考虑有模型方法← 正确答案
- C.小离散动作空间适合值函数方法← 正确答案
- D.在线学习必须使用离策略方法
答案:ABC。连续控制适合策略梯度;样本稀缺时有模型方法可以白嫖一个模拟器;小离散动作空间用 Q 表或 DQN 都很顺手。在线学习也可以使用 On-policy,所以 D 过于绝对。