☰
Q Learning离线策略本质:行为策略与目标策略的深度解析
2026/10/20 9:43:58 网站建设 项目流程

1. 这篇文章真正要解决的问题

如果你正在系统学习强化学习,大概率已经遇到过这样一个困惑:几乎所有教程都会告诉你,Q Learning 是一种 off-policy(离线策略)算法,而 SARSA 是 on-policy(在线策略)算法。但多数教程只给结论,不给原因。

于是你记住了"Q Learning 是 off-policy、SARSA 是 on-policy"这个结论,可一旦被问到"为什么"——为什么 Q Learning 就可以离线?离线到底离的是什么?行为策略和目标策略分离意味着什么?——就会卡壳。

这种"记住了结论、但讲不出原理"的状态,在面试、项目选型、复现论文时都是硬伤。因为你会发现自己无法解释 DQN 为什么能把经验回放(Experience Replay)直接用起来,也无法解释为什么 SARSA 在悬崖边缘会更"胆小",而 Q Learning 会更"激进"。

这篇文章要做的,就是把 Q Learning 的离线策略本质讲透。我们先从强化学习里最关键的策略概念说起,再用数学推导、代码对比和经典环境实验,一步步拆开 Q Learning 的工作原理。读完你会得到三个能力:

  1. 能用自己的话解释 off-policy 和 on-policy 的本质区别。
  2. 能看懂 Q Learning 更新公式里为什么会有max,以及这个max如何导致"离线"。
  3. 能在实际代码中理解 Q Learning 和 SARSA 的行为差异,知道什么场景该选谁。

2. 强化学习里的策略:行为策略与目标策略

在深入 Q Learning 之前,我们先把"策略"这件事说清楚。

强化学习中,智能体(Agent)与环境(Environment)交互的基本方式是:观察状态s,根据某个策略选择动作a,获得奖励r,进入新状态s'。这里的"策略"就是一个从状态到动作选择的映射关系。

但一个强化学习算法内部,其实存在两种策略角色:

  • 行为策略(Behavior Policy):智能体实际与环境交互、采集数据时使用的策略。它决定了"当前这一步到底执行哪个动作"。
  • 目标策略(Target Policy):智能体想要学习、最终希望得到的最优策略。它决定了"更新价值估计时,未来的动作按什么规则选择"。

这是一个非常关键的区分。在代码层面,行为策略往往是一个带有探索机制的策略,比如 ε-greedy:以 ε 的概率随机探索,以 1-ε 的概率选择当前价值最高的动作。而目标策略则是一个"贪心策略",即在每个状态都选择 Q 值最高的动作。

有了这两个概念的框架,我们就可以回答一个核心问题:一个算法是 on-policy 还是 off-policy,取决于更新价值时使用的数据,是否必须由当前正在学习的目标策略产生。

  • 如果更新必须使用当前目标策略产生的交互数据,那就是 on-policy。
  • 如果更新可以使用其他策略(包括历史策略、随机策略、甚至别人的策略)产生的数据,那就是 off-policy。

SARSA 属于前者,Q Learning 属于后者。下面我们具体看。

3. 为什么 Q Learning 能被称为离线策略

我们可以先用一个直白的类比建立直觉。

假设你要学习如何做一道菜。SARSA 的做法是:你必须自己严格按照一份菜谱一步步做,做完后根据成品味道调整这份菜谱,然后下一次继续用调整后的菜谱做,逐步改进。也就是说,你的学习资料必须来自"当前版本的你自己"。

Q Learning 的做法则是:你可以在旁边看不同的厨师做菜——有的厨师手艺好,有的厨师偶尔会放错调料,有的厨师今天心情不好乱做一气——你都可以把这些过程记录下来。然后你判断:在某个步骤,如果换成"水平最高的做法",结果会不会更好?基于这个判断更新你自己的菜谱。

这个类比里,SARSA 中"当前版本的你自己"就是行为策略兼目标策略,完全绑定;Q Learning 中"看其他厨师做菜"就是使用任意行为策略产生的数据,"换成水平最高的做法"就是在更新时使用贪心目标策略。这就是"离线"的本质。

更严谨地说,Q Learning 的更新公式是:

Q(s, a) ← Q(s, a) + α * [r + γ * max_{a'} Q(s', a') - Q(s, a)]

注意公式里的max_{a'} Q(s', a')。它在计算下一个状态s'的价值时,并不关心"行为策略实际选择了哪个动作a'",而是直接取s'下所有动作中 Q 值最大的那个。这意味着:更新方向完全由目标策略(贪心)决定,与产生数据的策略无关。

而 SARSA 的更新公式是:

Q(s, a) ← Q(s, a) + α * [r + γ * Q(s', a') - Q(s, a)]

这里的a'是行为策略在状态s'下实际选择的动作。它可能是探索动作,也可能是贪心动作,取决于行为策略当时的决策。所以 SARSA 的更新方向被行为策略"绑定"了——你学到的是"在当前这套探索策略下"的价值,而不是"最优策略下"的价值。

这就是两者最本质的差异:

对比维度Q LearningSARSA
更新下一个状态时使用什么动作max对应的最优动作行为策略实际选择的动作
更新依赖当前行为策略吗不依赖依赖
策略类型off-policy(离线策略)on-policy(在线策略)
学到的是"最优策略的价值"还是"行为策略的价值"最优策略的价值行为策略的价值

小结论:Q Learning 之所以是离线策略算法,是因为它的更新公式通过max操作将目标策略固定为贪心策略,从而剥离了对行为策略的依赖。数据可以是任何策略采出来的,但更新方向永远指向最优。

4. 贝尔曼方程视角:Q Learning 的更新到底在逼近什么

上面的结论需要从数学上再确认一遍,因为在实际代码里,Q 表格的更新是逐步迭代的,很多人看不出"离线"在哪里。我们用一个更接近底层原理的视角来理解。

4.1 从贝尔曼方程说起

贝尔曼最优方程告诉我们,最优动作价值函数Q*满足:

Q*(s, a) = E[ r + γ * max_{a'} Q*(s', a') ]

也就是说:在状态s执行动作a的"真正最优价值",等于立即奖励加上下一个状态中最优动作的折扣价值。

Q Learning 的更新公式本质上就是以一个采样到的(s, a, r, s')为样本,朝着贝尔曼最优方程的右侧逼近一步:

新估计 = 采样到的 (r + γ * max Q(s', a')) + 旧估计的剩余部分

因为方程右侧自带max,它描述的是一个"最优目标",所以 Q Learning 的每一次更新,都是在说:无论行为策略做了什么,我最终要学的是最优策略的价值。

4.2 行为策略只是数据的来源

在离线策略学习中,行为策略的角色是"采样器"(sampler),不是"学习目标"。我们用行为策略收集转移样本(s, a, r, s'),然后用这些样本去更新另一个策略(目标策略)的价值。

这个思想最极致的体现就是 DQN 中的经验回放(Experience Replay):智能体把自己经历过的所有转移样本存进一个缓冲区(replay buffer),更新时随机从中抽取小批量(mini-batch)数据来训练 Q 网络。这些样本可能来自很久以前的旧策略,甚至来自完全不同的探索阶段,但 Q Learning 的更新机制并不要求样本"新鲜"。换成 SARSA 就不行,因为 SARSA 更新需要的Q(s', a')必须是行为策略实际选择的那个a',如果样本是旧的,行为策略早就变了,更新就失去了意义。

小结论:从贝尔曼方程看,Q Learning 的数学目标是最优 Q 函数,而最优 Q 函数与"怎样采样"无关。采样策略只影响数据覆盖范围,不影响更新方向。这就是离线策略的根本来源。

5. ε-greedy 探索为什么不会破坏 Q Learning 的更新

很多人在实现 Q Learning 时会有一个疑问:训练时我明明用了 ε-greedy,即以 ε 的概率随机选择动作,那么随机探索产生的"坏数据"会不会把 Q 值带偏?

答案是不会。原因要从更新公式的结构来分析。

5.1 更新目标与实际动作的分离

在 Q Learning 中,更新Q(s, a)时,a是行为策略实际选择的动作,这个动作本身可能来自探索。比如在状态s,因为 ε=0.1,智能体以 10% 的概率随机选了动作right,即使此刻left的 Q 值更高。没关系,我们照样更新Q(s, right)的估计值。

问题的关键在于下一步:更新Q(s, right)时,公式里用的是状态s'中最大的 Q 值,而不是行为策略在s'中实际将要做出的动作。所以即使行为策略打算在s'中做一个很差劲的探索动作,Q Learning 也完全不关心。它计算的是"如果从s'开始采用最优策略,能获得多少价值"。

这样,探索数据只会影响"哪个(s, a)对被采样和更新",不会扭曲"每个(s, a)最终收敛到的最优价值"。

5.2 数学上的收敛性直觉

从数学上看,Q Learning 的更新算子是一个压缩映射(contraction mapping),只要每个(s, a)对在无限多次采样中被访问到,Q 值就一定会收敛到Q*。ε-greedy 恰好保证了"无限多次访问"——因为我们总有一定概率随机探索,理论上每个状态-动作对都可能被访问到。

这也是为什么 ε 通常随训练进度逐渐衰减,但不能直接衰减到 0。如果 ε=0,行为策略完全变成贪心,部分状态-动作对可能永远不被访问,Q 值就失去了收敛的充分条件。

5.3 SARSA 为什么做不到这一点

对比 SARSA:它的更新公式是Q(s, a) ← Q(s, a) + α * [r + γ * Q(s', a') - Q(s, a)],其中a'是行为策略在s'中实际选择的动作。如果行为策略因为探索在s'中选了坏动作,SARSA 就会把这个坏动作的价值纳入当前 Q 值的更新。因此,SARSA 学到的 Q 值始终带有"行为策略探索方式"的影子,学到的是"在 ε-greedy 策略下"的价值,而不是"最优策略"的价值。

小结论:ε-greedy 在 Q Learning 中只是一个保证充分探索的工具,它产生的数据被安全地用于更新指向最优策略的 Q 值。这是离线策略算法的核心优势——你可以在探索的同时,学习一个与探索策略本身无关的最优策略。

6. Q Learning 离线策略的工程价值:为什么 DQN 可以"回放经验"

前面说了这么多理论,现在我们要把它落到工程价值上。离线策略不仅仅是一个数学性质,它还直接催生了深度强化学习中最重要的一项工程实践——经验回放。

6.1 经验回放依赖的就是离线策略

DQN(Deep Q-Network)是 Q Learning 与深度神经网络的结合。它用一个神经网络Q(s, a; θ)来逼近 Q 函数。神经网络训练要求样本满足独立同分布假设,但强化学习中的样本是高度时序相关的:相邻两个转移样本之间的状态有强关联。

如果按顺序逐条使用样本训练,网络会反复看到相似的连续状态,导致训练不稳定,甚至发生灾难性遗忘。

经验回放的做法是:

  1. 智能体用当前行为策略与环境交互,把每一步得到(s, a, r, s')存入一个缓冲区(Replay Buffer)。
  2. 每次更新时,从缓冲区中随机抽取一个小批量样本进行梯度下降。
  3. 由于样本来自多个历史时刻、多种行为策略,相关性被打破,训练稳定性大幅提升。

关键点来了:如果这个算法不是离线策略,经验回放根本无法工作。

设想一下,如果你用的是 SARSA,从缓冲区中抽取一条(s, a, r, s')样本时,你必须知道当时行为策略在s'到底选了哪个动作a',并计算Q(s', a')。但这条样本是历史行为策略产生的,当前的行为策略可能已经变了,那么"历史行为策略选择的动作"对当前策略还有意义吗?严格说,没有再直接的意义。所以 SARSA 在样本采集和策略更新之间有强绑定关系,不能轻易打破时序。

而 Q Learning 的更新只用max_{a'} Q(s', a'),与历史行为策略无关,因此可以放心地从缓冲区随机抽样。样本的"新鲜度"和"来源策略"都不影响更新方向的正确性。

6.2 更进一步的工程影响

离线策略带来的优势在深度强化学习中远不止经验回放:

  • 样本效率提升:每个样本可以被反复使用多次,而不是用一次就丢弃。这在真实机器人、自动驾驶等采样成本高的场景中非常重要。
  • 数据来源多样化:不同探索阶段的样本可以混合使用,增加数据多样性。
  • 异步训练的可行性:多个环境并行采集数据、一个中心网络负责更新,这种架构天然要求更新算法与采样策略解耦。DQN 及后续的异步优势演员-评论家算法(A3C)等都在不同程度上受益于这种设计。
  • 离线强化学习(Offline RL):这是近年来的热门方向,目标是直接从固定数据集学习策略,不再与真实环境交互。所有离线强化学习方法的前提,都是更新过程可以与行为策略解耦。Q Learning 家族(以及在此基础上改进的 CQL、IQL 等方法)正是离线 RL 的核心基石。

小结论:Q Learning 的离线策略性质不只是理论上的分类标签,它直接影响着深度强化学习算法的工程架构。没有离线策略,就不会有经验回放,也就不会有我们今天看到的 DQN 系列方法。

7. 完整代码示例:Q Learning 与 SARSA 的核心差异

理论讲清楚了,接下来用代码把 Q Learning 和 SARSA 的差异固化下来。我们使用 Python 实现一个最简版本的 Q Learning 和一个最简版本的 SARSA,并用经典的 Cliff Walking(悬崖行走)环境来观察它们的行为差异。

7.1 环境说明

Cliff Walking 是一个经典网格世界任务,最早出现在 Sutton 和 Barto 的教材中。环境布局如下:

  • 网格大小为 4 行 × 12 列。
  • 起点在左下角(3, 0),终点在右下角(3, 11)。
  • 中间靠近底部的区域是"悬崖",走入悬崖会获得 -100 的奖励并回到起点。
  • 每一步的奖励是 -1,到达终点奖励为 0(不同实现略有差异,本文以常见版本为准)。

这个环境的精妙之处在于:最优路径(贴着悬崖边走过去)和"安全路径"(绕开悬崖边)之间的价值差异,能直观地暴露 Q Learning 与 SARSA 的策略差异。如果你没有深度强化学习框架,也可以直接用gymnasium来模拟这个环境。

7.2 安装依赖

pip install gymnasium

如果gymnasium版本较新,Cliff Walking 的注册 ID 通常是CliffWalking-v0。版本不同时环境 ID 可能略有差异,如果遇到Cannot find env相关报错,可以先查看已注册环境列表:

import gymnasium as gym env = gym.make("CliffWalking-v0", render_mode="ansi") print(env.observation_space) print(env.action_space)

7.3 Q Learning 核心实现

下面是一个最简的 Q Learning 实现。注意更新公式中max(next_q)的写法,这是整个算法的关键。

# 文件路径:q_learning_cliff.py import numpy as np import gymnasium as gym class QLearningAgent: def __init__(self, state_dim, action_dim, learning_rate=0.1, gamma=0.9, epsilon=0.1): self.state_dim = state_dim self.action_dim = action_dim self.lr = learning_rate self.gamma = gamma self.epsilon = epsilon self.q_table = np.zeros((state_dim, action_dim)) def choose_action(self, state): # ε-greedy:以 epsilon 概率随机探索,否则选择当前 Q 值最大的动作 if np.random.random() < self.epsilon: return np.random.randint(self.action_dim) return int(np.argmax(self.q_table[state])) def update(self, state, action, reward, next_state, done): # Q Learning 更新公式:使用 max 操作,与行为策略无关 if done: target = reward else: target = reward + self.gamma * np.max(self.q_table[next_state]) self.q_table[state, action] += self.lr * ( target - self.q_table[state, action] ) def train_q_learning(episodes=500): env = gym.make("CliffWalking-v0") agent = QLearningAgent(state_dim=env.observation_space.n, action_dim=env.action_space.n) rewards_per_episode = [] for ep in range(episodes): state, _ = env.reset() total_reward = 0 done = False while not done: action = agent.choose_action(state) next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated agent.update(state, action, reward, next_state, done) state = next_state total_reward += reward rewards_per_episode.append(total_reward) return agent, rewards_per_episode if __name__ == "__main__": agent, rewards = train_q_learning(500) print("Q Learning 最近100回合平均奖励:", np.mean(rewards[-100:]))

7.4 SARSA 核心实现

SARSA 与 Q Learning 的唯一区别在更新那一行:它使用next_action对应的 Q 值,而不是max Q。next_action是行为策略在next_state中实际选择的动作。

# 文件路径:sarsa_cliff.py import numpy as np import gymnasium as gym class SarsaAgent: def __init__(self, state_dim, action_dim, learning_rate=0.1, gamma=0.9, epsilon=0.1): self.state_dim = state_dim self.action_dim = action_dim self.lr = learning_rate self.gamma = gamma self.epsilon = epsilon self.q_table = np.zeros((state_dim, action_dim)) def choose_action(self, state): if np.random.random() < self.epsilon: return np.random.randint(self.action_dim) return int(np.argmax(self.q_table[state])) def update(self, state, action, reward, next_state, next_action, done): # SARSA 更新公式:使用行为策略实际选择的 next_action if done: target = reward else: target = reward + self.gamma * self.q_table[next_state, next_action] self.q_table[state, action] += self.lr * ( target - self.q_table[state, action] ) def train_sarsa(episodes=500): env = gym.make("CliffWalking-v0") agent = SarsaAgent(state_dim=env.observation_space.n, action_dim=env.action_space.n) rewards_per_episode = [] for ep in range(episodes): state, _ = env.reset() total_reward = 0 done = False # SARSA 需要先选择下一个动作 action = agent.choose_action(state) while not done: next_state, reward, terminated, truncated, _ = env.step(action) done = terminated or truncated if not done: next_action = agent.choose_action(next_state) else: next_action = 0 # 占位值,不会参与更新 agent.update(state, action, reward, next_state, next_action, done) state = next_state action = next_action if not done else None total_reward += reward rewards_per_episode.append(total_reward) return agent, rewards_per_episode if __name__ == "__main__": agent, rewards = train_sarsa(500) print("SARSA 最近100回合平均奖励:", np.mean(rewards[-100:]))

7.5 运行与验证

python q_learning_cliff.py python sarsa_cliff.py

预期结果是:

  • Q Learning 在训练后期会学到一条"贴着悬崖"的较短路径,因此每回合的平均总奖励更高(绝对值更接近 -13 左右)。
  • SARSA 因为更新时会考虑探索动作带来的风险,学到的是更保守的"绕开悬崖"路径,单回合奖励绝对值更大(更接近 -20 左右)。

这里有个细节需要注意:在 Cliff Walking 中,Q Learning 学到的"最优路径"本身贴着悬崖,一旦在推理阶段出现一个小概率的探索动作,就会坠崖拿到 -100。而 SARSA 学到的保守路径即使出现探索动作,也不容易坠崖。这就是两种策略在真实行为上的差异,也是为什么在某些风险敏感场景中,SARSA 类的在线策略算法反而表现更"稳健"。

7.6 代码对比小结

把两个更新公式放在一起看,差异极其清晰:

# Q Learning 更新核心 target = reward + self.gamma * np.max(self.q_table[next_state]) # SARSA 更新核心 target = reward + self.gamma * self.q_table[next_state, next_action]

Q Learning 不关心next_action是什么,它直接取next_state下的最大 Q 值。SARSA 则必须知道next_action,这个动作来自当前 ε-greedy 策略。一个字符的差异,决定了两个算法在"离线/在线"上的本质不同。

8. 常见问题与排查思路

在学习和调试 Q Learning 相关代码时,有几个问题是高频出现的。这里做一个集中梳理。

问题现象可能原因排查方式解决方案
Q 值长期不收敛,训练曲线震荡严重学习率 α 过大;探索率 ε 衰减过快或过慢打印 Q 表格变化幅度,观察 ε 曲线减小 α(如从 0.5 降到 0.1);设计合理的 ε 衰减计划
训练完成后推理阶段频繁"坠崖"Q Learning 学到了贴悬崖的激进路径,推理阶段少量探索动作导致坠崖检查最优路径与悬崖的贴合程度如果场景风险敏感,改用 SARSA;或者把推理阶段的 ε 设为 0
最终 Q 值看起来很小或全部为 0训练回合数不够,或 γ 设置太小导致远期奖励被低估增加回合数,打印近 100 回合平均奖励增大 γ(如 0.9 或 0.99),延长训练
环境创建失败,报Cannot find envgymnasium 版本不兼容,或环境名变更打印gym.envs.registry查看已注册环境换成gym.make("CliffWalking-v0")或查看当前版本支持的 ID
使用 SARSA 时出现NoneType相关错误没有正确维护next_action,在终止状态错误调用了动作选择检查循环中action的更新逻辑在done时使用占位动作,不参与更新
Q Learning 更新时把max写成了argmax概念混淆:max取最大值,argmax取最大值的索引检查更新代码中是否有np.argmax改为np.max(self.q_table[next_state])

这里最值得提醒的是第一个和最后一个问题。

第一个问题出现时,很多人第一反应是增加训练轮数,但真正的问题往往是学习率太大导致的震荡。建议先用固定 ε=0.1 和较小学习率检查 Q 值是否平稳,再逐步调整探索计划。

最后一个问题看似低级,实际在代码 review 中非常常见。max和argmax的区别正好对应"目标策略的意图"和"行为策略的决策"这两个不同概念:max表示"最优动作的价值",argmax表示"哪个动作最优"或"行为策略选中了哪个动作"。写错一个函数,算法性质就从 Q Learning 变成了近似 SARSA,这个问题务必重视。

9. 离线策略算法的工程建议与适用边界

理解了 Q Learning 的离线策略原理之后,还需要把它放到真实项目中去看边界。

9.1 什么时候选 Q Learning / DQN

  • 需要经验回放:样本采样成本高,或环境交互速度远低于训练速度时,Q Learning 的离线性质允许样本复用,这是 DQN 能大规模应用的基石。
  • 复杂状态输入:状态是高维的(图像、语音),需要神经网络提取特征时,经验回放 + 目标网络的组合是标准做法。
  • 探索与利用解耦:你希望在训练阶段自由设计探索策略(甚至混合多个历史策略的数据),而不影响最终学到的目标策略。
  • 离线学习:只有固定数据集,不能继续与环境交互时,必须使用离线策略算法。

9.2 什么时候要慎重

  • 在线、低延迟、高风险场景:机器人在真实物理环境中做安全关键决策时,SARSA 这类在线策略算法学到的"考虑到探索风险的保守策略"往往更安全。Q Learning 学到的激进策略在少量扰动下可能表现很差。
  • 探索成本不可控:如果你的探索动作会导致真实世界中的高代价后果(比如真实交易、医疗决策),需要额外设计安全约束,不能直接套用标准 Q Learning。
  • 环境动态变化:Q Learning 对价值的更新依赖"取最大"这个操作,在环境动态变化时,max容易引入过高估计(overestimation)。这也是 Double DQN 出现的原因——它通过两个 Q 网络解耦动作选择和价值估计,降低过高估计的影响。

9.3 实践中的五个建议

  1. 用表格型 Q Learning 验证原理,再用 DQN 解决复杂问题。不要在第一个复杂项目里直接上 DQN,先从小规模环境把 Q Learning 的更新逻辑吃透。

  2. 仔细设计探索计划。常见方案是线性衰减:训练前 20% 回合保持 ε=0.5,中间 60% 从 0.5 线性降到 0.05,后 20% 保持 0.05。具体比例要根据任务复杂度和训练时长调整。

  3. 关注max带来的过高估计问题。如果你发现 Q 值明显偏高、训练不稳定,优先检查是否使用了过大的 γ,并考虑 Double DQN 改进。

  4. 先固定随机种子复现结果,再谈调优。强化学习代码中的随机性很大,调参前务必备份运行记录,每次实验保持随机种子不变,否则很难判断改动是否有效。

  5. 在真实环境使用前,务必在测试环境中做完整验证。任何涉及安全、权限、生产环境的强化学习项目,都要先在小规模、模拟环境中跑通,并设计回滚方案。离线策略算法可以自由采样,但不代表它可以脱离安全约束随意上线。

10. 总结与后续学习方向

这篇文章围绕一个核心问题展开:为什么 Q Learning 可以实现离线策略?我们用三层递进的方式做了回答。

第一层,从概念上区分了行为策略与目标策略,指出"离线/在线"的判断标准是更新价值时是否依赖当前行为策略实际选择的动作。第二层,从贝尔曼方程和更新公式角度证明,Q Learning 通过max操作把目标策略固定在贪心策略上,从而与行为策略解耦。第三层,从代码和实验层面展示了 Q Learning 与 SARSA 的一个字符之差如何导致完全不同的学习结果,并延伸讨论了经验回放和 DQN 的工程基础。

如果你刚刚入门强化学习,建议你按以下路径继续深入:

  • 手写一遍 Q Learning 和 SARSA 的完整训练循环,在 Grid World 或 Cliff Walking 中观察行为差异。
  • 阅读 Sutton & Barto 的《强化学习》第 6 章,重点关注 TD(0)、Q Learning、SARSA 的推导过程。
  • 理解 DQN 的改进脉络:从 DQN 到 Double DQN、Dueling DQN、Prioritized Experience Replay,每一处改进都建立在对"离线策略更新"的理解之上。
  • 学习 Offline RL 的基础概念,你会发现 Q Learning 家族依然是这个方向的理论基石之一。

真正吃透一个概念的最好方式,就是把它讲给别人听,或者用代码让它可视化。强烈建议你把文中的两个代码文件复制下来,分别跑一遍,然后修改探索率、学习率、γ 这几个参数,观察不同设置下 Q 值的变化。等你能预判"改某个参数会导致什么结果"的时候,你对离线策略的理解才算真正到位了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询