1. 从“盲人摸象”到“心中有图”:两种强化学习流派的根本分歧

大家好,我是老张,在AI和机器人领域摸爬滚打了十几年,带过不少强化学习的项目。今天咱们不聊那些复杂的数学公式,就聊聊强化学习里最让人纠结的一个选择题:Model-free(无模型)Model-based(基于模型),到底该用哪个?

你可以把强化学习想象成训练一个智能体(Agent)在一个未知的世界里做决策,目标是获得最多的奖励。那么,这个智能体是怎么认识这个世界的呢?这就引出了两种截然不同的哲学。

Model-free 方法,就像一个“直觉派”的探险家。他走进一片陌生的森林,不知道哪里有陷阱,哪里有宝藏。他的策略就是:大胆地走,踩到陷阱了就知道疼(负奖励),捡到宝了就开心(正奖励)。通过无数次试错,他最终能摸索出一条安全又高效的寻宝路径。他不需要一张森林的地图,他的“策略”完全来自于亲身经历积累的“肌肉记忆”。我们熟知的 Q-learning、DQN、Policy Gradient(策略梯度) 都属于这一类。

Model-based 方法,则像一个“规划派”的工程师。在进入森林前,他先要花时间勘察地形,绘制一张尽可能精确的地图。这张地图告诉他:从这里往东走100米有沼泽(状态转移概率),在树下挖可能找到金币(奖励函数)。有了这张“环境模型”,他就可以坐在帐篷里,对着地图反复推演、规划,找出理论上最优的路线,然后再去执行。Dyna-Q、MBPO(基于模型的策略优化) 就是这类方法的代表。

所以,最核心的差异,就在于这个智能体心里有没有一张“世界如何运转”的地图(模型)。这张地图的核心就是马尔可夫决策过程(MDP)中的两个关键函数:状态转移概率 T奖励函数 R。Model-based 方法试图学会或利用这个模型;Model-free 方法则绕过它,直接学习策略或价值。

我刚开始接触时也犯晕,后来一个前辈打了个比方让我豁然开朗:学开车。Model-free 就像你直接上车,在教练场里瞎撞,撞几次墙、压几次线之后,你自然就知道方向盘该打多少、刹车该踩多深。而 Model-based 就像你先在驾校模拟器上练习,模拟器里撞车没成本,你可以疯狂尝试各种极端操作,摸清了车辆的物理规律后,再上路就心里有底了。两者都能学会开车,但路径和体验完全不同。

2. 核心原理拆解:它们到底是如何工作的?

理解了根本分歧,我们再来深入看看这两类方法具体是怎么“思考”和“学习”的。这能帮你更好地判断它们的脾气秉性。

2.1 Model-free:在试错中锤炼“直觉”

Model-free 方法是强化学习领域的“实干派”和“主流大军”。它的信条是:与其费劲去猜环境到底有多复杂,不如直接上手干,从结果中学习。

它的学习过程可以概括为一个简单的循环:

  1. 观察状态:智能体看到当前环境的状态 s
  2. 做出动作:根据当前的策略(可能是随机的,也可能是初步学到的),选择一个动作 a 执行。
  3. 品尝后果:环境给出反馈,包括即时奖励 r 和新的状态 s'
  4. 更新认知:根据 (s, a, r, s') 这个四元组经验,更新自己的策略或价值函数,让自己下次在类似状态下能做出更好的选择。

这个过程完全不需要知道“为什么”状态会从 s 变成 s',也不需要知道奖励 r 具体是怎么算出来的。它只关心“输入-输出”的关联性。

这里有个关键概念叫“时间差分学习”,这是很多 Model-free 算法的核心,比如 Q-learning。我举个生活中的例子:你教小孩认水果。你不需要给他一本植物学教科书(模型),你只需要指着一个苹果说“这是苹果,甜”(状态 s,动作 ,奖励 )。下次他看到类似的红色水果(新状态 s'),他可能会尝试指认,如果对了得到夸奖(新的奖励),他就强化了“红色圆形物体可能是苹果”的认知。Q-learning 更新 Q 值(动作价值)的过程就类似于此,它利用当前估计和下一步的估计之差来不断修正自己的判断,非常像我们人类通过连续反馈进行学习的方式。

它的优势很明显:简单直接,通用性强。无论环境模型多么复杂、甚至难以用数学描述(比如游戏画面像素),Model-free 方法都能一头扎进去学习。但代价也很明显:数据效率低下。因为它纯粹靠试错,需要海量的交互数据才能学到靠谱的策略,就像那个在森林里乱撞的探险家,很可能在找到宝藏前就掉进无数次陷阱,学习成本非常高。

2.2 Model-based:先绘制“地图”,再规划“路线”

Model-based 方法则显得更“聪明”一些,它试图先理解这个世界的运行规则。它的学习过程通常分为两个阶段:

  1. 模型学习阶段:智能体像科学家一样,通过与环境交互收集数据 (s, a, r, s'),然后用这些数据来训练一个“世界模型”。这个模型的目标是学会两个映射:

    • 动力学模型:给定当前状态 s 和动作 a,预测下一个状态 s'。这相当于学习状态转移概率 T
    • 奖励模型:给定状态 s 和动作 a,预测能获得的即时奖励 r。这相当于学习奖励函数 R

    这个模型可以是一个神经网络,也可以是一个简单的查表法。我做过一个机械臂抓取的项目,我们就用神经网络来学习机械臂关节电机转动(动作 a)后,末端执行器位置和姿态(状态 s')的变化,以及是否成功抓取(奖励 r)的预测模型。

  2. 规划与策略学习阶段:有了这个学到的模型,智能体就可以“足不出户”地进行大量思考。它可以在模型内部进行“想象”或“推演”,尝试各种动作序列,利用模型预测结果,并评估这些虚拟轨迹的长期回报。基于这些虚拟经验,它可以通过规划算法(如随机打靶法、蒙特卡洛树搜索MCTS)快速找到一个好策略,或者用这些模拟数据来训练一个 Model-free 的策略网络。

它的最大魅力在于数据效率。一旦模型学得比较准,智能体就能在“脑海”里进行无限次的、零成本的试错,极大地减少了与真实昂贵环境的交互次数。但它的“阿喀琉斯之踵”是模型误差。如果学到的模型与真实环境有偏差,那么在这个有偏差的模型里规划出的“最优策略”,在真实世界里可能表现很差,甚至灾难性失败。这就好比你的地图画错了,把悬崖标成了平地,按图索骥的结果可想而知。

3. 实战场景PK:机器人路径规划 vs. 游戏AI训练

理论说再多,不如看实战。我们通过两个最典型的场景,来感受一下这两种方法在真实世界中的选择和表现。

3.1 场景一:机器人室内导航(Model-based 的主场)

想象你要开发一个扫地机器人的高级导航功能,让它能在复杂的家庭环境中,快速规划出一条覆盖所有区域且不碰撞的高效路径。

为什么这里 Model-based 方法更合适?

  1. 数据成本极高:让一个实体机器人在你家里横冲直撞地试错学习?它可能会撞坏你的花瓶、推倒你的孩子,或者卡在沙发底下无数次。每一次失败的交互,物理成本和时间成本都很高。我们必须尽量减少真实世界的试错。
  2. 环境相对稳定,可建模:家庭环境虽然复杂,但物理规律是确定的(重力、碰撞)、地图结构在短时间内是静态的。我们可以用激光雷达、摄像头先构建一个室内地图(这就是一个先验的几何模型)。在这个地图基础上,机器人可以轻松地预测“向前走一米会不会撞墙”(状态转移),也可以定义“清扫过一片区域获得正奖励”(奖励函数)。有了这个模型,机器人可以在内部进行大量的路径规划计算,找到最优路线后再优雅地执行。
  3. 安全性要求高:必须避免碰撞。在模型内部进行规划,可以预先排查所有可能导致碰撞的路径,确保最终执行的策略是安全的。

在实际项目中,我们通常会采用 Dyna 架构 这样的混合思路。机器人先通过少量真实交互学习一个环境动力学模型,然后大部分时间利用这个模型进行“冥想”训练(规划),只偶尔用真实动作去验证和修正模型。这就像飞行员先在模拟器上训练各种特情处置,熟练后再上真飞机,既安全又高效。

3.2 场景二:训练玩《星际争霸》的AI(Model-free 的舞台)

现在换个场景,我们要训练一个能在《星际争霸》这样复杂的即时战略游戏中达到人类顶尖水平的 AI。

为什么 Model-free 方法(如 DeepMind 的 AlphaStar)在这里大放异彩?

  1. 环境极度复杂,难以建模:《星际争霸》的状态空间是天文数字。游戏画面是像素,单位有上百种,动作是组合指令(移动、攻击、建造),对手策略千变万化。要想建立一个能准确预测下一帧游戏画面(状态)和即时得分(奖励)的模型,其难度不亚于直接学习制胜策略。相比之下,直接输入像素,输出操作指令的 Model-free 方法反而更直接。
  2. 数据成本极低:在游戏环境中,试错的成本几乎为零。AI 可以在成千上万个 CPU/GPU 上同时运行无数个游戏实例,每天产生相当于人类几百年游戏时长的数据。这种海量数据正好弥补了 Model-free 方法数据效率低的缺点。它不怕失败,可以疯狂地“死”上亿万次,只为找到那一次胜利的感觉。
  3. 探索复杂策略:Model-free 方法,特别是基于策略梯度的方法,在探索高维、连续的动作空间(如微操多个单位)时非常灵活。它可以通过随机性探索出人类都未曾想过的“骚操作”和战术组合。

在这个场景下,强行使用 Model-based 方法,很可能陷入“建模的偏差”大于“规划的收益”的困境。花大力气建了一个蹩脚的游戏模拟器,在里面练出的“高手”,一到真实游戏里就被打回原形。所以,DeepMind 等团队选择了用海量计算资源和数据,堆出一个基于 Model-free(混合了自对弈、多智能体等技巧)的超级游戏AI。

4. 如何选择?一张自检清单帮你决策

看到这里,你可能已经有点感觉了。但在实际项目开头,面对具体问题,到底该怎么选呢?我总结了一个简单的自检清单,你可以顺着这几个问题往下走:

问题一:你的环境交互,贵不贵?慢不慢?危不危险?

  • 如果贵/慢/危险(如机器人、自动驾驶、医疗):强烈倾向于 Model-based 或混合方法。你必须利用模型在虚拟空间中预先规划和验证,减少真实交互。
  • 如果便宜/快/安全(如游戏、广告推荐、模拟器)Model-free 是更简单直接的选择。你可以尽情挥霍数据,让智能体在试错中野蛮生长。

问题二:你能为环境建立一个“足够好”的模型吗?

  • 如果环境动力学相对简单、稳定,或你有强大的先验知识(如物理方程、已知地图):那么 Model-based 非常有吸引力。一个好的模型能带来巨大的数据效率提升。
  • 如果环境非常复杂、随机、充满未知,或者本身就是非平稳的(如股票市场、对手策略多变的游戏):建立准确模型极其困难。这时,与其建一个错误百出的模型,不如直接用 Model-free 方法去适应环境的复杂性。

问题三:你对策略的“可解释性”和“安全性”要求高吗?

  • 如果需要知道AI为什么这么决策(如金融风控、医疗诊断)Model-based 方法因为有了模型,往往能提供一定程度的解释(比如通过模型回溯推演)。规划过程也更容易加入安全约束。
  • 如果只关心最终性能,黑箱也无妨(如游戏AI、部分图像识别)Model-free 可以放手一用。

问题四:你的计算资源和数据资源哪样更充裕?

  • 如果数据稀缺,但你有较强的计算资源进行模型学习和内部规划:选 Model-based
  • 如果数据可以廉价地海量生成,但计算资源相对紧张:选 Model-free。Model-free 训练虽然总计算量可能更大,但通常更易于并行采集数据。

根据这张清单,你就能做出初步判断。在实际工业界,混合方法正变得越来越流行。比如,用 Model-based 方法学一个粗略的模型,用于快速探索和规划大方向;再用 Model-free 方法进行局部精细优化。或者,用 Model-free 作为主控制器,用 Model-based 的预测来做安全监控和校正。我在做自动驾驶决策模块时,就采用了这种思路,用基于规则的预测模型(轻量级Model-based)确保行车安全基线,再用深度强化学习(Model-free)去优化乘坐舒适性和通行效率。

5. 从零开始:动手体验两种方法的代码差异

光说不练假把式。我们用一个超级简单的环境——“格子世界”来直观感受一下代码层面的区别。假设有一个4x4的网格,智能体从左上角出发,目标是到达右下角,踩到陷阱格子得-1分,到达目标得+10分,每走一步扣0.1分(鼓励快速到达)。

5.1 Model-free 方法示例:Q-learning

Q-learning 是典型的 Model-free 算法,它直接学习一个 Q 表格,记录每个状态-动作对的价值。

import numpy as np

# 超参数
alpha = 0.1  # 学习率
gamma = 0.99  # 折扣因子
epsilon = 0.1  # 探索率

# 初始化Q表 (状态数, 动作数) 动作:0上,1右,2下,3左
q_table = np.zeros((16, 4))

def choose_action(state):
    """使用 epsilon-greedy 策略选择动作"""
    if np.random.uniform(0, 1) < epsilon:
        return np.random.choice([0, 1, 2, 3])  # 探索
    else:
        return np.argmax(q_table[state])  # 利用

def update_q_table(state, action, reward, next_state):
    """Q-learning 更新规则"""
    predict = q_table[state, action]
    target = reward + gamma * np.max(q_table[next_state])
    q_table[state, action] += alpha * (target - predict)

# 训练循环(伪代码框架)
for episode in range(1000):
    state = 0  # 初始状态
    while not done:
        action = choose_action(state)
        next_state, reward, done = env.step(action)  # 与环境交互,得到反馈
        update_q_table(state, action, reward, next_state)
        state = next_state

你看,在整个过程中,算法完全不需要知道 env.step(action) 内部是怎么工作的(即状态转移概率T和奖励函数R)。它只关心输入(state, action),输出(reward, next_state),然后根据这个经验更新自己的Q表。这就是典型的“无模型”。

5.2 Model-based 方法示例:学习一个简单模型

现在,我们尝试让智能体先学习这个格子世界的模型。

# 初始化模型:我们用一个字典来记录经验,或者用神经网络来拟合
# 这里用简单的计数法来估计转移概率和奖励
transition_counts = {}  # 键: (s,a), 值: 计数器,记录转移到s'的次数
reward_sum = {}         # 键: (s,a), 值: 累计奖励
count_sa = {}           # 键: (s,a), 值: 出现次数

def learn_model(state, action, reward, next_state):
    """用收集到的经验更新环境模型"""
    sa = (state, action)
    # 更新转移计数
    if sa not in transition_counts:
        transition_counts[sa] = {}
    if next_state not in transition_counts[sa]:
        transition_counts[sa][next_state] = 0
    transition_counts[sa][next_state] += 1
    
    # 更新奖励统计
    if sa not in reward_sum:
        reward_sum[sa] = 0
        count_sa[sa] = 0
    reward_sum[sa] += reward
    count_sa[sa] += 1

def get_model_prediction(state, action):
    """从学到的模型中预测下一个状态和奖励"""
    sa = (state, action)
    if sa not in transition_counts:
        return None, 0  # 没见过的情况,返回默认值
    
    # 预测下一个状态(按计数概率抽样)
    next_states = list(transition_counts[sa].keys())
    probs = np.array(list(transition_counts[sa].values())) / sum(transition_counts[sa].values())
    predicted_next_state = np.random.choice(next_states, p=probs)
    
    # 预测奖励(平均奖励)
    predicted_reward = reward_sum[sa] / count_sa[sa] if count_sa[sa] > 0 else 0
    
    return predicted_next_state, predicted_reward

# 训练循环:先收集数据学模型,再用模型规划
# 第一阶段:随机探索,收集数据学习模型
for _ in range(500):  # 收集500步经验
    action = np.random.randint(0,4)
    next_state, reward, done = env.step(action)
    learn_model(state, action, reward, next_state)
    state = next_state if not done else env.reset()

# 第二阶段:利用学到的模型进行内部规划(例如随机打靶)
for planning_step in range(200):
    # 从当前状态开始,在模型内部模拟多条轨迹,选择最优动作
    simulated_returns = []
    for a in [0,1,2,3]:
        total_return = 0
        sim_state = state
        for _ in range(10):  # 模拟10步
            pred_next, pred_reward = get_model_prediction(sim_state, a)
            if pred_next is None:
                break
            total_return += pred_reward
            sim_state = pred_next
            a = np.argmax([get_model_prediction(sim_state, aa)[1] for aa in [0,1,2,3]])  # 模拟中贪心选择
        simulated_returns.append(total_return)
    # 选择模拟中表现最好的动作执行
    best_action = np.argmax(simulated_returns)
    next_state, reward, done = env.step(best_action)  # 真实执行一次
    # 同时,可以用这次真实经验继续改进模型
    learn_model(state, best_action, reward, next_state)

对比一下就能发现,Model-based 的代码明显更复杂。它多了一个“模型”的数据结构(transition_counts, reward_sum)和一整套学习、查询模型的函数。它的智能体在做出真实动作前,会先在自己的模型里“思考”一番(get_model_prediction和模拟循环)。 在这个简单例子中,模型只是一个计数表。在复杂环境中,这个模型可能是一个深度神经网络。

6. 混合方法与未来展望:取长补短是趋势

纯 Model-free 和纯 Model-based 像是光谱的两端,而如今最活跃的研究和最有前景的应用,大多落在了光谱中间——混合方法。

Model-based 为 Model-free 提供想象力:学到的模型可以生成无限的、成本低廉的模拟数据,用来预训练 Model-free 的策略网络,大幅提升初期学习效率。这就像先让AI在模拟器里考驾照,考过了再上路实驾。

Model-free 为 Model-based 提供 robustness:当模型存在误差时,一个基于 Model-free 学到的鲁棒策略可以作为兜底,防止基于模型的规划出现灾难性失败。同时,Model-free 策略探索到的复杂行为数据,又可以反过来帮助提升模型的准确性。

我目前正在跟进的一些前沿工作,比如“世界模型”,就在尝试用深度学习(如变分自编码器VAE、循环神经网络RNN)来学习高维观测(如图像)的压缩表示和动态模型,然后在这个紧凑的潜在空间中进行高效规划。这相当于让AI先学会“做梦”,在梦境中演练,然后再行动。

选择哪种方法,从来不是非此即彼的单选题。它更像是在数据效率、计算成本、模型精度、实现复杂度、安全性要求等多个维度上的权衡。对于初学者,我的建议是从经典的 Model-free 算法(如 Q-learning、REINFORCE)入手,直观理解强化学习的核心——试错与奖励。当你开始面临真实机器人、自动驾驶等数据成本高昂的场景时,自然会转向对 Model-based 方法的探索。记住,没有最好的方法,只有最适合你当前问题约束的方法。多动手写代码,在不同的简单环境(如 OpenAI Gym)中把两种方法都实现一遍,你对他们差异和优劣的体会,会比读任何文章都来得深刻。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐