ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

从橡皮鸭子到代码实战:强化学习核心概念与Q-Learning实现

2026/9/5 16:59:38 拓冰建站 浏览量
从橡皮鸭子到代码实战:强化学习核心概念与Q-Learning实现 最近在刷社交动态的时候看到 Thomas WolfHugging Face 联合创始人兼首席科学家转发了一条用橡皮鸭子演示强化学习的科普视频。起初以为只是个轻松搞笑的 AI 梗图结果点进去看完后发现这个视频把强化学习里最抽象的“试错”、“奖励信号”、“策略更新”讲得明明白白连完全没接触过 RL 的朋友也能看懂。作为长期写技术教程的人我立刻意识到这是一个绝佳的切入点。今天这篇文章不打算只是复述视频内容而是顺着“鸭子演示”这个思路把强化学习的核心概念拆开揉碎再用 Python 代码实战一遍。即使你之前没碰过强化学习看完也能理解强化学习的核心要素到底是什么。智能体如何通过“试错”学会策略。扰动、奖励、状态转移这些抽象概念如何落地到代码。从玩具鸭到真实机器人、无人机控制中间还差哪些工程步骤。本文适合强化学习初学者、想转型 AI 算法的开发者以及任何对“AI 如何从零学会做决策”感兴趣的人。1. 为什么一只橡皮鸭子能讲清楚强化学习1.1 Thomas Wolf 转发的视频到底讲了什么先还原一下视频里的场景。实验者把一只橡皮鸭子放在一个简易轨道上鸭子的初始位置随机目标位置固定。鸭子本身没有任何传感器也没有内置程序实验者通过反复“推”鸭子观察鸭子是否接近目标位置。如果鸭子离目标更近实验者会给出正向反馈比如点头、发出提示音如果离目标更远就给出负向反馈。重复若干轮之后神奇的事情发生了鸭子开始“自发”朝目标位置移动。当然鸭子不可能真的学会物理动作真正学习的是实验者脑中或代码中的控制策略。视频通过这种直观的物理演示把强化学习抽象成一句话智能体通过与环境互动、根据奖励信号调整行为最终学会完成任务。这个演示之所以出圈是因为它把强化学习和监督学习区分得非常清楚。监督学习需要“正确答案”告诉模型这张图片是猫还是狗而强化学习没有标准答案只有一个“好/坏”的反馈信号需要智能体自己摸索出达成目标的动作序列。1.2 为什么这个科普方式如此有效大多数强化学习教程开篇就是马尔可夫决策过程、贝尔曼方程、策略梯度定理数学公式堆满屏幕。对于新手来说这些符号本身就是一道门槛。而橡皮鸭子演示的好处在于把“状态”变成你能看到鸭子当前所在的位置。把“动作”变成你用手推鸭子的方向和力度。把“奖励”变成你的点头或摇头。把“策略”变成你脑中对“下一步推哪里”的判断。这些概念一旦具象化后续再看公式就不会觉得是空中楼阁。Thomas Wolf 转发这样的内容其实也代表了 AI 社区的一种主流观点好的技术科普应该让新手先建立直觉再接触数学。1.3 强化学习到底解决什么问题强化学习Reinforcement Learning简称 RL是机器学习三大范式之一另外两个是监督学习和无监督学习。它研究的是一个智能体Agent在环境Environment中如何通过选择动作Action来最大化累积奖励Cumulative Reward。对应到鸭子实验中Agent控制策略的“大脑”。Environment轨道和鸭子构成的物理系统。State鸭子的当前位置。Action推鸭子的方向和力度。Reward接近目标得正分远离目标得负分。这套框架能解决很多传统编程难以处理的问题。比如 AlphaGo 下围棋、机器人行走、无人机避障、自动驾驶决策、游戏 AI、推荐系统中的排序策略等等。它们的共同特点是没有现成的正确答案只能通过大规模试错来学习。2. 强化学习核心概念详解在动手写代码之前需要先理解强化学习中最基本的几个概念。不追求数学严谨重点是把直觉建立起来。2.1 智能体与环境智能体是做出决策的主体。环境是智能体之外的一切包括物理世界、游戏引擎、仿真器等等。两者之间的交互关系可以用一个循环来描述智能体 --(动作)-- 环境 环境 --(新状态 奖励)-- 智能体智能体观察当前状态选择一个动作环境接收动作后更新状态并返回一个奖励信号智能体根据新的状态和奖励调整下一步决策。这个循环不断重复直到任务结束或达到最大步数。2.2 状态、动作与奖励状态State是对当前环境情况的描述。在鸭子实验中是位置坐标在围棋中是棋盘上的落子分布在无人机控制中是飞行器的姿态和速度。动作Action是智能体可以执行的操作集合。可以是离散的左、右、前、后也可以是连续的推力大小、转向角度。奖励Reward是环境反馈给智能体的标量信号告诉它当前动作是好是坏。奖励函数的设计是强化学习中最关键也最困难的部分。奖励设置得太稀疏比如只有到达终点才给奖励智能体学得很慢设置得太密集又可能学了“钻空子”的策略。2.3 策略与价值函数策略Policy是智能体的行为准则定义了在某个状态下应该选择什么动作。策略可以是确定性的比如“看到红灯就停车”也可以是随机性的比如“90% 概率左转10% 概率右转”。价值函数Value Function用于评估某个状态或某个状态-动作对的好坏。它回答的是“如果在当前状态下继续按照某策略行动未来能获得多少累积奖励”。价值函数是强化学习算法优化策略的核心工具。2.4 折扣因子与累积奖励未来奖励存在不确定性而且通常越早获得奖励越好。所以强化学习在计算累积奖励时引入折扣因子Discount Factor通常记作 gamma。累积奖励被定义为G(t) R(t) gamma * R(t1) gamma^2 * R(t2) ...gamma 取值为 0 到 1 之间。gamma 越接近 1表示智能体越看重长远利益越接近 0表示智能体越短视。在鸭子实验中如果每推一步都有一点小惩罚只有到达目标才有大奖励智能体就会学会“尽快到达目标”。2.5 强化学习 vs 监督学习 vs 无监督学习三者的区别可以简单概括监督学习有标签数据模型学习输入到输出的映射。无监督学习无标签数据模型学习数据内在结构。强化学习有奖励信号但没有正确答案模型通过与环境互动逐步优化策略。举一个形象的例子教你投篮。监督学习相当于给你看一万张“正确投篮姿势”的照片让你模仿无监督学习相当于给你一万段投篮视频让你自己总结经验强化学习相当于你直接上场投篮投进了教练点头投丢了教练摇头你自己摸索最合适的姿势。3. 从“推鸭子”到真实算法核心原理逐步拆解理解了概念层级之后我们再回到鸭子实验把它翻译成强化学习算法的标准流程。3.1 试错学习机制橡皮鸭子实验中实验者不断尝试新的推动方式观察鸭子落点然后根据奖励来调整下一次推动的方向和力度。这个过程的本质就是试错学习Trial and Error。在算法中试错学习对应的是探索Exploration和利用Exploitation的权衡探索尝试新的动作可能带来更好的策略。利用选择已知最好的动作保证当前收益。如果只探索不利用智能体永远停留在一个水平如果只利用不探索智能体会陷入局部最优。优秀算法会在早期多探索后期多利用。3.2 时间差分学习与 Q-Learning时间差分学习Temporal Difference LearningTD Learning是强化学习中最核心的思想之一。它不等到任务结束才开始更新而是每走一步就根据“当前奖励 未来估计”来修正之前的判断。Q-Learning 是 TD Learning 最经典的算法之一。它维护一张 Q 表Q(s, a) 表示“在状态 s 下执行动作 a 的期望累积奖励”。每次互动后按如下公式更新Q(s, a) Q(s, a) alpha * (r gamma * max(Q(s, a)) - Q(s, a))其中alpha学习率决定新信息覆盖旧信息的速度。r当前动作获得的奖励。gamma折扣因子。max(Q(s, a))下一个状态中所有动作的最大 Q 值代表“未来最优收益估计”。r gamma * max(Q(s, a))当前奖励加未来估计被称为 TD Target。在鸭子实验中鸭子的每个位置都可以看成状态推鸭子的每种方式都可以看成动作。Q 表记录“在位置 A 用力度 B 推预计能获得多少累积奖励”。经过大量试错后Q 表收敛智能体就能得到最优策略。3.3 策略梯度方法Q-Learning 适合动作空间较小、状态离散的场景。但如果动作是连续的比如“推鸭子”推力的大小可以是 0.1N、0.2N、0.3N……用 Q 表就不好维护了。这时可以使用策略梯度方法Policy Gradient。策略梯度方法不再维护 Q 表而是直接用神经网络输出“在某个状态下的动作分布”。训练过程大致是用当前策略在环境中采样若干条轨迹。计算每条轨迹的累积奖励。奖励越高的动作被选中的概率越大。通过反向传播更新网络参数。PPOProximal Policy Optimization是目前最常用的策略梯度算法之一在机器人控制、游戏 AI 中应用非常广泛。它通过裁剪目标函数控制每次更新的幅度保证训练稳定性。3.4 基于模型的强化学习前面两种方法都不需要对环境建立模型属于无模型Model-Free强化学习。而无模型方法有两个痛点需要海量样本安全风险高。基于模型的强化学习Model-Based RL则先学习一个环境模型预测“在当前状态下执行动作后下一步状态和奖励是什么”然后在这个模型上进行规划和学习。相当于在实验中先建立一个“鸭子运动仿真器”让鸭子在虚拟环境里多撞几次墙学会之后再上真实轨道。基于模型的强化学习在工程中往往更实用。真实机器人的训练成本很高物理磨损明显无人机试飞更是一次失误就可能炸机。先用模型学习环境动态能显著减少真实试错次数。4. 用代码实战从零训练一个“鸭子找目标”智能体理论说了这么多下面进入实战环节。我们用 Python 实现一个简化版“鸭子找目标”任务。环境是一个一维坐标轴鸭子初始位置随机目标位置固定智能体通过向左或向右移动来接近目标。4.1 环境准备与依赖安装本文示例环境如下操作系统Windows / macOS / Linux 均可Python 版本3.8 或以上核心依赖numpy、matplotlib可选依赖gymnasium用于构建更复杂的强化学习环境版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示实现思路。使用 pip 安装依赖pip install numpy matplotlib如果节点缺少 pip 或 Python需要先安装 Python 环境。这里不展开讲建议使用 3.8 及以上版本。4.2 设计鸭子环境我们首先需要定义一个“鸭子环境”类。这个类负责初始化鸭子的位置。接收智能体的动作。更新鸭子的位置。计算奖励。判断是否到达目标。示例代码如下# 文件路径duck_env.py import random class DuckEnv: 一维鸭子找目标环境 def __init__(self, target5.0, max_steps50): self.target target self.max_steps max_steps self.state None self.step_count None self.reset() def reset(self): 重置环境返回初始状态 self.state random.uniform(0, 10) self.step_count 0 return self.state def step(self, action): 执行动作返回新状态、奖励、是否结束 action: -1 表示向左走一步, 1 表示向右走一步 # 移动鸭子 self.state action * 0.5 # 如果越界拉回边界 self.state max(0.0, min(10.0, self.state)) # 步数增加 self.step_count 1 # 计算奖励 distance abs(self.state - self.target) if distance 0.5: reward 10.0 # 到达目标区域给大奖励 done True else: # 离目标越近奖励越高 reward -distance * 0.1 done False # 超过最大步数也结束 if self.step_count self.max_steps: done True return self.state, reward, done这段代码中reset方法将鸭子随机放置在 0 到 10 的坐标轴上。step方法根据动作移动鸭子并计算当前距离目标的误差。距离小于 0.5 视为到达目标区域给予 10 分否则惩罚会随着距离增加而变大。这里的设计思路很重要奖励函数既包含了稀疏的“是否到目标”又包含了密集的距离信息。这样一来即使智能体前期靠随机动作也能因为“慢慢靠近目标”而获得梯度信号学习速度明显加快。4.3 实现 Q-Learning 算法Q-Learning 算法需要把连续的状态离散化。我们把 0 到 10 的坐标轴分成 20 个区间每个区间是一个状态。动作只有两个向左或向右。# 文件路径q_learning.py import numpy as np from duck_env import DuckEnv class QLearningAgent: def __init__(self, n_states20, n_actions2, alpha0.1, gamma0.99, epsilon0.9): self.n_states n_states self.n_actions n_actions self.alpha alpha # 学习率 self.gamma gamma # 折扣因子 self.epsilon epsilon # 探索率 self.q_table np.zeros((n_states, n_actions)) def discretize_state(self, state): 将连续状态映射到离散区间 max_state 10.0 interval max_state / self.n_states state_idx min(int(state // interval), self.n_states - 1) return state_idx def choose_action(self, state): epsilon-greedy 策略选择动作 state_idx self.discretize_state(state) if np.random.random() self.epsilon: # 探索随机选择动作 return np.random.choice(self.n_actions) else: # 利用选择 Q 值最大的动作 return np.argmax(self.q_table[state_idx]) def update(self, state, action, reward, next_state, done): 更新 Q 表 state_idx self.discretize_state(state) next_state_idx self.discretize_state(next_state) # 计算 TD Target if done: td_target reward else: td_target reward self.gamma * np.max(self.q_table[next_state_idx]) # 更新 Q 值 self.q_table[state_idx][action] self.alpha * ( td_target - self.q_table[state_idx][action] )这里特别说明epsilon参数。初始探索率设为 0.9意味着前 90% 的动作都是随机采样用于充分探索环境。随着训练推进探索率会逐渐衰减智能体逐渐利用学到的经验。这是典型的 Exploration-Exploitation 平衡策略。4.4 训练循环与可视化训练循环的代码相对简单但需要注意几个细节每回合开始时重置环境。每步用当前策略选择动作执行动作得到新状态和奖励然后更新 Q 表。累计每个回合的总奖励。训练过程中逐步降低探索率。# 文件路径train.py import matplotlib.pyplot as plt from duck_env import DuckEnv from q_learning import QLearningAgent def train(episodes500): env DuckEnv(target5.0) agent QLearningAgent() total_rewards [] for episode in range(episodes): state env.reset() total_reward 0 done False while not done: action agent.choose_action(state) next_state, reward, done env.step(action) agent.update(state, action, reward, next_state, done) state next_state total_reward reward total_rewards.append(total_reward) # 探索率线性衰减最低为 0.01 agent.epsilon max(0.01, agent.epsilon * 0.995) if (episode 1) % 50 0: print(fEpisode {episode 1}, Total Reward: {total_reward:.2f}) # 绘制奖励曲线 plt.plot(total_rewards) plt.xlabel(Episode) plt.ylabel(Total Reward) plt.title(Q-Learning Training Progress) plt.show() if __name__ __main__: train()运行训练后的输出大致如下Episode 50, Total Reward: -10.32 Episode 100, Total Reward: -6.48 Episode 150, Total Reward: -3.21 Episode 200, Total Reward: 8.55 Episode 250, Total Reward: 9.21当然由于存在探索阶段的随机性每个人的输出会有所不同。只要奖励曲线呈上升趋势说明智能体在逐渐学会把鸭子推向目标位置。4.5 测试训练好的策略训练完成后我们还需要验证策略的稳定性。关闭训练过程保持探索率为 0只选择 Q 值最大的动作连续测试 100 个回合统计成功率。# 文件路径test.py from duck_env import DuckEnv from q_learning import QLearningAgent def test(episodes100): env DuckEnv(target5.0) agent QLearningAgent() # 加载训练好的 Q 表这里为了演示直接假设已训练完成 # 实际项目中需要将 Q 表保存到文件再加载 success_count 0 for _ in range(episodes): state env.reset() done False while not done: state_idx agent.discretize_state(state) action int(agent.q_table[state_idx].argmax()) # 纯利用 next_state, reward, done env.step(action) state next_state # 判断是否成功到达目标 if abs(state - env.target) 0.5: success_count 1 success_rate success_count / episodes * 100 print(fSuccess Rate: {success_rate:.1f}%)注意这里的 Q 表没有从文件加载是重新初始化的所以测试结果会很差。实际项目中需要将训练完成的 Q 表保存到 CSV 或 npy 文件。下面是保存和加载的示例# 保存 Q 表 np.save(q_table.npy, agent.q_table) # 加载 Q 表 agent.q_table np.load(q_table.npy)4.6 扩展到策略梯度方法Q-Learning 在离散动作环境中表现不错但真实控制问题比如无人机油门控制动作是连续的。这时需要切换策略。由于策略梯度代码量较大本文给一个简单的 PyTorch 风格示例方便理解整体流程。# 文件路径policy_gradient_demo.py import numpy as np import torch import torch.nn as nn import torch.optim as optim class PolicyNet(nn.Module): 策略网络输入状态输出动作概率 def __init__(self, n_state1, n_action2, hidden_dim64): super().__init__() self.fc1 nn.Linear(n_state, hidden_dim) self.fc2 nn.Linear(hidden_dim, n_action) self.relu nn.ReLU() self.softmax nn.Softmax(dim-1) def forward(self, state): x self.relu(self.fc1(state)) x self.softmax(self.fc2(x)) return x def compute_loss(log_probs, rewards): 计算策略梯度损失 # 标准化奖励减少方差 rewards (rewards - rewards.mean()) / (rewards.std() 1e-8) loss -(log_probs * rewards).sum() return loss策略梯度完整训练需要维护一个轨迹缓存采样完成后计算累积奖励再反向传播更新网络。这里不展开完整实现因为它涉及到采样、折扣奖励计算等多个环节如果读者需求高后续可以单独写一篇 PPO 实战教程。如果只做入门练习Q-Learning 已经足够理解核心思想。5. 从鸭子到真实机器人工程化要跨越的几道门槛看完代码示例可能有人会觉得强化学习训练起来也没有那么难为什么真实机器人落地这么慢5.1 真实环境中的采样效率问题鸭子实验和代码训练之所以能接受上万次试错是因为虚拟环境成本极低。但在真实机器人上一次动作执行需要电机驱动、机械结构响应一次失败的策略可能导致机械臂撞坏、无人机坠毁。这就是采样效率Sample Efficiency问题。强化学习算法动辄需要百万级样本真实环境根本无法承受。解决方案有两个方向离线强化学习和基于模型的强化学习。离线强化学习利用历史数据集训练策略不需要在线采样适合自动驾驶、医疗等高风险场景。基于模型的强化学习先学一个世界模型在虚拟世界中大量练习再把策略迁移到真实环境。近几年这两个方向都是研究热点。5.2 奖励函数的“魔鬼细节”前面提到的鸭子演示中奖励函数非常直观靠近目标得正分远离目标得负分。但真实任务的奖励函数往往需要精心设计。举个例子无人机避障任务。如果只奖励“到达终点”无人机可能学会贴着障碍物高速飞行因为这样路径最短。如果只惩罚“碰撞”无人机可能干脆停在原地不动因为这样永远不会碰撞。这就是典型的奖励黑客Reward Hacking问题。解决思路通常包括奖励塑形Reward Shaping在过程上增加辅助奖励引导智能体走向期望行为。约束优化在损失函数中加入安全约束比如“任何时刻都不能接近障碍物”。逆强化学习从专家演示数据中自动学习奖励函数。5.3 仿真到现实的迁移问题机器人领域有个著名的说法Sim-to-Real Gap仿真到现实的鸿沟。仿真器中的物理参数、摩擦系数、传感器噪声与真实世界存在偏差。在仿真中训练好的策略拿到真实环境往往表现不佳。常用的缓解手段包括域随机化Domain Randomization在仿真中随机改变物理参数让策略学会适应各种环境变化。系统辨识通过真实数据校准仿真器参数。在线微调在真实环境继续训练但用较小学习率避免破坏仿真中学到的能力。5.4 与经典控制方法的对比在无人机、机械臂控制领域传统 PID 控制仍然是工业界的绝对主力。强化学习和 PID 之间的关系不是完全替代而是互补。PID 控制器的优势在于参数少、稳定、可解释性强。缺点是需要人工调参且面对强非线性、复杂耦合系统时效果不佳。强化学习的优势在于能自动学习复杂策略适应动态环境。缺点是不稳定、不可解释、训练成本高。现在很多工业项目采用混合方案底层用 PID 保证稳定性上层用强化学习做路径规划和参数自适应。搜索热词里出现“基于强化学习的 PID 控制”指的正是这种混合思路。6. 强化学习入门常见误区与排查清单新手在学习强化学习时经常会遇到下面这些问题。6.1 训练一直不收敛问题现象常见原因解决思路奖励曲线完全不动探索率过低智能体一直沿用早期次优策略调高初始 epsilon 或动作噪声训练后半段奖励反而下降探索率衰减过快陷入局部最优放慢衰减速度Q 值持续增大不收敛学习率过高TD Target 估计有误调低 alpha检查奖励函数是否存在上溢偶发性能很好但平均很差训练方差大随机种子影响严重固定随机种子多跑几次取平均6.2 奖励越来越差不是智能体变笨了训练中期奖励下降不一定说明代码有 bug。探索率较高时智能体会故意做一些“看起来很傻”的动作来获取未知信息。这就像鸭子实验中如果实验者总尝试新的推动方式偶尔会把鸭子推离目标这是探索的必要代价。正确的排查方式是看滑动平均曲线不要被单次回合的噪声干扰。如果训练后期奖励仍然剧烈波动说明探索率没有降下来或者学习率偏大。6.3 代码可以运行但结果很差这类问题最隐蔽。原因可能包括状态离散化粒度太粗丢失关键信息。奖励尺度过小或过大导致梯度消失或爆炸。折扣因子 gamma 取值不合适。动作空间设计不合理。排查顺序建议先检查奖励函数是否符合预期再检查状态空间是否区分度高最后调整超参数。不要一开始就上复杂算法先拿最基础的方法跑通基线再逐步升级。6.4 强化学习适合我的项目吗这是一个很现实的问题。判断标准可以参考是否有明确的奖励信号是否能承受大量试错是否有安全的仿真环境或离线数据问题本身是否适合用序贯决策模型描述如果这四点答案都是否那么现在用经典算法或监督学习可能更合适。强化学习不是银弹选择技术方案要根据问题特征来决定。7. 最佳实践与工程建议如果要在实际项目中应用强化学习下面这些经验值得参考。7.1 先跑通最小示例再扩展不要一开始就挑战机械臂或无人机。先在 Gymnasium 提供的经典环境CartPole、MountainCar上把 Q-Learning、DQN、PPO 跑通理解代码框架和数据流再迁移到自己的任务。这样定位问题会更准确。7.2 强化学习代码的工程化建议与普通深度学习代码相比强化学习代码更强调以下几个部分统一的 Environment 接口便于切换仿真器或真实环境。轨迹缓存与数据管理确保采样数据和训练数据不混在一起。随机种子管理固定种子保证实验可复现。日志记录每回合的奖励、平均奖励、Q 值分布都要记录便于分析训练状态。模型保存与回滚训练到峰值时保存一份模型防止后续训练把策略练坏。7.3 安全边界必须前置在真实机器人上使用强化学习必须在训练前设置安全边界。常见做法包括定义动作空间边界限制最大速度或力矩。在环境中加入安全约束超限立即终止并施加惩罚。使用离线强化学习先用历史数据训练再逐步上线。训练时全程人工监控准备紧急停止机制。这部分不是可选项。强化学习的探索过程意味着它一定会尝试危险动作不设安全边界等于把系统暴露在不可控风险之中。7.4 善用已有工具和社区资源Hugging Face 不仅做 NLP也维护了一个强化学习生态包括gymnasium标准强化学习环境接口库。stable-baselines3主流强化学习算法的可靠实现新手可以直接调用。huggingface-deep-rl-class免费课程包含理论讲解和代码实战。如果只想快速验证某个环境用 stable-baselines3 可以省下大量手写算法的时间。但理解底层的 Q-Learning 和策略梯度原理仍然很重要否则出了问题很难排查。8. 总结与下一步学习路线从 Thomas Wolf 转发的橡皮鸭子演示出发我们拆解了强化学习最核心的思想智能体通过试错与环境互动用奖励信号塑造策略。然后通过一个 Python 实战例子完成了 Q-Learning 从环境定义、算法实现到训练测试的完整闭环并讨论了从玩具场景到真实机器人落地需要解决的问题采样效率、奖励设计、仿真迁移、安全边界。如果你第一次接触强化学习下一步建议按这个顺序学习吃透本文的概念和代码确保自己能独立写出并训练一个完整小案例。学习 Gymnasium 内置环境理解不同任务的状态、动作、奖励设计。阅读 Stable-Baselines3 的官方文档用现成算法跑通几个经典环境。选择一个真实场景的小项目比如倒立摆控制、迷宫寻路从环境建模开始完整做一遍。学习 PPO、SAC 等进阶算法理解它们的数学推导和工程实现。接触离线强化学习和基于模型的强化学习了解如何降低采样成本和安全风险。强化学习是一条值得投入的技术路线它与生成式 AI、机器人、自动驾驶的交叉越来越多。Thomas Wolf 转发鸭子实验本身也在传递一个重要信号复杂的技术概念往往可以用最简单的比喻讲清楚。当你理解概念的本质后再去看论文和源码会发现很多所谓“高大上”的算法背后其实都是这个“推鸭子”的过程在不断重复。如果本文对你有帮助可以收藏备用。后续有时间我会继续写关于 PPO 实战、离线强化学习、机器人控制等更深入的文章到时欢迎回来继续交流。