1. 强化学习概述强化学习Reinforcement Learning简称 RL是机器学习的一个重要分支研究智能体Agent如何在与环境的持续交互中通过试错方式学习最优决策策略。与监督学习和无监督学习不同强化学习没有预先标注好的标准答案智能体只能根据环境给出的奖励信号Reward来判断自己行为的优劣并据此不断调整行为策略以最大化长期累积回报。强化学习的核心思想可以概括为“尝试—反馈—改进”的循环过程智能体在某个状态下执行某个动作环境会返回即时奖励并转移到新状态智能体根据奖励的大小和未来预期调整自己的策略逐步学会在什么样的状态下应该采取什么样的动作。2. 强化学习与其他机器学习范式的区别为了更准确理解强化学习的定位可以将其与监督学习和无监督学习进行对比。监督学习训练数据包含“输入—标准输出”对模型学习从输入到输出的映射反馈形式是明确的标签误差常用于分类和回归任务。无监督学习训练数据没有标签模型需要从数据本身发现结构例如聚类、降维和生成式建模。强化学习没有标准答案只有延迟的、稀疏的奖励信号智能体通过与环境交互自主积累经验并优化长期回报反馈形式是奖励或惩罚。三者最大的区别在于反馈监督学习是即时且明确的标签无监督学习几乎没有外部反馈而强化学习反馈是延迟的、评估性的奖励。3. 强化学习的核心概念理解强化学习首先需要掌握以下基本要素智能体Agent学习者和决策者通过与环境的交互来优化自身行为。环境Environment智能体所处的世界负责对智能体的动作做出响应返回新状态和奖励。状态States环境的当前观察是智能体做决策的依据。在时间步 t 的状态通常记为 S_t。动作Actiona智能体在某个状态下可以采取的行为记为 A_t。奖励Rewardr智能体执行动作后环境返回的标量反馈用于衡量该动作的即时好坏记为 R_t。策略Policyπ智能体的决策规则表示在给定状态下选择各动作的概率分布。确定性策略直接输出动作随机策略输出动作的概率。轨迹Trajectory智能体与环境交互形成的时间序列例如 S_0, A_0, R_1, S_1, A_1, R_2, S_2 …回报ReturnG_t从时间步 t 开始未来所有奖励的某种累积是强化学习优化的真实目标。整个交互过程可以形式化地描述为智能体观察当前状态 S_t根据策略 π 选择动作 A_t环境接收 A_t 后产生即时奖励 R_{t1} 并转移到新状态 S_{t1}智能体继续观察并进行下一次决策如此循环往复直到一个回合结束或无限持续。4. 马尔可夫决策过程绝大多数强化学习问题都可以建模为马尔可夫决策过程Markov Decision Process简称 MDP。MDP 是描述序贯决策问题的标准数学框架它要求状态具有马尔可夫性质即当前状态已经包含了做决策所需的全部历史信息未来只取决于现在而与更早的历史无关。一个有限的 MDP 通常由五元组S, A, P, R, γ定义S有限的状态集合。A有限的动作集合。P状态转移概率P(s|s, a) 表示在状态 s 执行动作 a 后转移到状态 s 的概率。R奖励函数表示在状态 s 执行动作 a 后获得的期望即时奖励。γ折扣因子取值范围为 0 到 1用于权衡近期奖励与远期奖励的重要性。马尔可夫性质可以表示为P(S_{t1} | S_t, A_t) P(S_{t1} | S_0, A_0, ..., S_t, A_t)。也就是说在已知当前状态和动作的情况下未来的状态分布与更早的历史状态无关。智能体与环境之间的交互过程可以用下面的 Mermaid 流程图直观展示步骤参与者动作结果1智能体观察当前状态 S_t根据策略 π 选择动作 A_t2环境接收动作 A_t返回即时奖励 R_{t1}转移到新状态 S_{t1}3智能体接收奖励与新状态更新策略与价值估计进入下一轮交互上图中的每个环节都与 MDP 五元组S, A, P, R, γ存在明确的对应关系状态 S图中的“智能体观察当前状态 S_t”对应五元组中的状态集合 S。状态是智能体做决策的依据也是 MDP 中马尔可夫性质发挥作用的基础。动作 A图中的“根据策略 π 选择动作 A_t”对应五元组中的动作集合 A。智能体在状态 S_t 下从动作集合中选取一个动作这一选择由策略决定。状态转移概率 P图中的“环境转移到新状态 S_{t1}”对应五元组中的状态转移概率 P(s|s, a)。环境并非确定性地进入下一状态而是按照转移概率分布随机跳转这正是 MDP 中不确定性的来源。奖励函数 R图中的“环境执行动作并返回即时奖励 R_{t1}”对应五元组中的奖励函数 R。奖励是环境对智能体动作的即时评估信号也是智能体判断动作好坏、调整策略的核心依据。折扣因子 γ图中的“智能体更新策略与价值估计”环节间接体现了折扣因子 γ 的作用。智能体在更新价值估计时会用 γ 对未来的奖励进行折扣加权从而在近期收益与远期收益之间做出权衡。整个循环过程可以概括为智能体在状态 S_t 下选择动作 A_t环境依据转移概率 P 返回奖励 R_{t1} 并转移到新状态 S_{t1}智能体再结合折扣因子 γ 更新自己的策略与价值估计随后进入下一轮交互。如此循环往复智能体便能在不断试错中逐步逼近最优策略。5. 回报与折扣因子强化学习的目标不是最大化某一时刻的即时奖励而是最大化长期累积回报。回报Return的定义通常采用折扣累积形式G_t R_{t1} γR_{t2} γ²R_{t3} γ³R_{t4} …其中 γ 是折扣因子取值在 [0, 1) 之间。折扣因子的作用主要体现在三个方面数学便利当奖励有界且 γ 小于 1 时无限序列的回报之和是有限的便于理论分析。表达不确定性未来越远环境的不确定性越大折扣因子体现对未来奖励的不完全信任。控制时间偏好γ 越接近 0智能体越“短视”只关心即时奖励γ 越接近 1智能体越“远见”更重视长期收益。当问题属于“分幕式任务”Episodic Task即交互会在有限步后终止时也可以将 γ 设为 1此时的回报就是所有未来奖励的简单求和。实践中大多数算法都采用折扣回报以便统一处理有限和无限时域任务。6. 价值函数与 Q 函数价值函数用于评估智能体在某个状态或某个“状态—动作对”下的长期期望收益是几乎所有强化学习算法的核心工具。常见的价值函数有两种。状态价值函数State Value FunctionV_π(s) 表示从状态 s 开始一直遵循策略 π 所能获得的期望回报V_π(s) E_π[G_t | S_t s]它衡量的是“处于某个状态本身有多好”。动作价值函数Action Value FunctionQ_π(s, a) 表示在状态 s 首先执行动作 a之后一直遵循策略 π 所能获得的期望回报Q_π(s, a) E_π[G_t | S_t s, A_t a]它衡量的是“在某个状态下采取某个动作有多好”。Q 函数在实践中的重要性更高因为当环境模型未知时智能体可以直接比较各动作的 Q 值来选择最优动作而不需要知道状态转移概率。在价值函数的基础上可以定义最优价值函数 V*(s) 与 Q*(s, a)。最优策略对应的价值函数满足对所有状态 sV*(s) max_π V_π(s)对所有状态动作对Q*(s, a) max_π Q_π(s, a)。如果智能体获得了最优 Q 函数那么最优策略可以通过在任意状态选择 Q 值最大的动作得到。7. 贝尔曼方程贝尔曼方程Bellman Equation是动态规划和强化学习理论中最重要的方程它把价值函数表示为“即时奖励 后续状态价值的期望”的递归形式。状态价值函数的贝尔曼期望方程可以写为V_π(s) Σ_a π(a|s) [ R(s, a) γ Σ_{s} P(s|s, a) V_π(s) ]其含义是在状态 s 下遵循策略 π 的价值等于“按策略选择动作后获得的期望即时奖励”加上“转移到下一状态后的折扣期望价值”。动作价值函数同样存在贝尔曼方程Q_π(s, a) R(s, a) γ Σ_{s} P(s|s, a) Σ_{a} π(a|s) Q_π(s, a)贝尔曼最优方程则将上述递推中的策略替换为最优选择。对于动作价值函数贝尔曼最优方程非常简洁Q*(s, a) R(s, a) γ Σ_{s} P(s|s, a) max_{a} Q*(s, a)这个方程是 Q-Learning 等无模型算法的直接理论来源它告诉我们最优 Q 值等于即时奖励加上“下一状态所有动作中最优 Q 值”的折扣期望。许多强化学习算法本质上都是在用不同方式逼近贝尔曼方程的递推关系。8. 基于模型的动态规划方法当 MDP 的完整信息已知即状态转移概率 P 和奖励函数 R 都已知时可以直接使用动态规划Dynamic Programming方法求解最优策略。动态规划方法主要包括策略评估、策略改进、策略迭代和价值迭代。策略评估用于计算给定策略 π 的状态价值函数 V_π。它反复应用贝尔曼期望方程进行迭代更新V(s) ← Σ_a π(a|s) [ R(s, a) γ Σ_{s} P(s|s, a) V(s) ]当更新幅度足够小时V 收敛到 V_π。策略改进基于当前价值函数构造更好的策略核心是贪心化操作对每个状态 s 选择能使“即时奖励 折扣后继价值”最大的动作。可以证明这样得到的新策略不差于旧策略。策略迭代交替执行策略评估和策略改进直到策略不再变化最终收敛到最优策略。价值迭代则直接使用贝尔曼最优方程反复更新V(s) ← max_a [ R(s, a) γ Σ_{s} P(s|s, a) V(s) ]价值迭代收敛后再从最终价值函数中提取贪心策略即为最优策略。下面给出价值迭代的核心 Python 实现思路import numpy as np def value_iteration(n_states, n_actions, transition, reward, gamma0.9, eps1e-6): 价值迭代算法通过反复应用贝尔曼最优方程求解最优状态价值函数。 参数说明 n_states : 状态总数例如迷宫中的格子数量 n_actions : 动作总数例如上下左右四个方向 transition: 状态转移概率张量形状为 (n_states, n_actions, n_states) 其中 transition[s][a][s] 表示在状态 s 执行动作 a 后转移到状态 s 的概率 reward : 奖励矩阵形状为 (n_states, n_actions) reward[s][a] 表示在状态 s 执行动作 a 后获得的即时奖励 gamma : 折扣因子取值范围 [0, 1)用于权衡近期奖励与远期奖励的重要性 eps : 收敛阈值当两次迭代的价值变化小于该值时认为算法收敛 返回值 V : 一维数组长度为 n_statesV[s] 表示状态 s 的最优状态价值 # 初始化价值函数所有状态的初始价值都设为 0 V np.zeros(n_states) # 主循环不断迭代更新价值函数直到收敛 while True: delta 0.0 # 记录本轮迭代中所有状态价值变化的最大值用于判断是否收敛 # 遍历每一个状态更新其价值 for s in range(n_states): old_v V[s] # 保存更新前的旧价值用于计算变化量 q_values [] # 存放状态 s 下每个动作的动作价值 Q(s, a) for a in range(n_actions): # 计算执行动作 a 后转移到各后继状态的价值期望 # transition[s][a] 是一个长度为 n_states 的概率向量 # 与当前价值向量 V 做点积得到后继状态的期望价值 future np.sum(transition[s, a] * V) # 动作价值 即时奖励 折扣因子 * 后继状态期望价值 q_values.append(reward[s, a] gamma * future) # 贝尔曼最优方程状态价值取所有动作价值中的最大值 V[s] max(q_values) # 记录本状态价值的变化幅度并更新全局最大变化量 delta max(delta, abs(old_v - V[s])) # 如果所有状态的价值变化都小于阈值 eps说明已经收敛退出循环 if delta eps: break # 返回收敛后的最优状态价值函数 return V动态规划方法在理论上清晰严谨但对状态空间规模非常敏感。当状态数量巨大或连续时遍历整个状态空间的成本会变得不可接受这就是所谓的“维度灾难”。因此实际应用中动态规划主要用于小规模、模型已知的问题。9. 蒙特卡洛方法蒙特卡洛Monte Carlo简称 MC方法属于无模型方法它不需要已知状态转移概率和奖励函数而是通过采样完整回合的经验来估计价值函数。其核心思想很简单要估计某个状态的价值就运行多个完整回合统计从该状态出发后实际获得的回报并用这些回报的样本均值作为价值估计。蒙特卡洛策略评估的更新公式可以写成V(s) ← V(s) α [ G_t - V(s) ]其中 G_t 是本回合中从状态 s 首次访问到回合结束的真实回报α 是学习率。由于回报 G_t 是 V(s) 的无偏估计因此蒙特卡洛方法是无偏的但方差较高。蒙特卡洛方法的一个关键特点在于必须等待一个回合结束后才能进行更新因为只有回合结束才能计算完整回报 G_t。因此在连续任务或回合非常长的场景下蒙特卡洛方法会显得效率较低。此外蒙特卡洛方法还涉及“首次访问”和“每次访问”两种计数方式前者只统计每个回合中状态第一次出现时的回报后者统计所有出现的回报二者在极限情况下都会收敛到真实价值。在控制问题中蒙特卡洛方法可以结合探索性策略生成经验然后对状态动作对的价值做估计并根据估计结果逐步改进策略。其缺点是对探索要求较高如果某些动作从未被尝试就无法获得它的价值估计。10. 时序差分学习时序差分Temporal Difference简称 TD学习结合了动态规划的自举思想和蒙特卡洛的采样思想是强化学习中应用最广泛的一类方法。TD 方法既不需要环境模型也不需要等到回合结束而是在每一步执行后立即利用下一步的估计值来更新当前状态的价值。最基础的 TD(0) 更新公式为V(S_t) ← V(S_t) α [ R_{t1} γ V(S_{t1}) - V(S_t) ]其中括号内的差值称为 TD 误差TD Error记为 δ_t R_{t1} γ V(S_{t1}) - V(S_t)。TD 误差是整个 TD 系列算法的核心它衡量了当前估计值与基于新观察到的“目标值”之间的差异。与蒙特卡洛方法相比TD 方法的主要区别在于更新目标不同蒙特卡洛使用真实完整回报 G_t而 TD 使用即时奖励加上对下一状态价值的估计即 R_{t1} γ V(S_{t1})。因此 TD 是有偏估计但通常方差更小、更新更及时、计算效率更高在在线学习和连续任务中表现良好。TD(0) 只向前看一步将这一思想推广可以得到向前看 n 步的 n 步 TD 方法以及将不同步数回报按权重组合的 TD(λ) 方法。TD(λ) 通过资格迹统合不同时间跨度的更新信息在偏差与方差之间取得更灵活的平衡。11. Q-Learning 与 SARSA在动作价值函数层面两种最经典的 TD 控制算法是 Q-Learning 和 SARSA。二者都维护一个 Q 值表并在交互中不断更新但更新目标存在本质差异。Q-Learning是一种离线策略Off-Policy方法它的更新公式为Q(S_t, A_t) ← Q(S_t, A_t) α [ R_{t1} γ max_a Q(S_{t1}, a) - Q(S_t, A_t) ]Q-Learning 在更新时使用下一状态所有动作中的最大 Q 值与当前实际选择哪个动作无关因此它学习的是最优 Q 函数即使智能体当前遵循的是探索性策略。下面是一个表格型 Q-Learning 的 Python 实现示例import random def q_learning(env, episodes1000, alpha0.1, gamma0.9, epsilon0.1): 表格型 Q-Learning 算法通过与环境交互学习最优动作价值函数 Q(s, a)。 参数说明 env : 环境对象需要实现 get_states()、get_actions()、reset()、step(action) 四个接口 episodes : 训练回合数每个回合从初始状态开始直到终止状态结束 alpha : 学习率取值范围 (0, 1]控制新信息对旧估计的更新幅度 gamma : 折扣因子取值范围 [0, 1)用于权衡近期奖励与远期奖励的重要性 epsilon : 探索率以 epsilon 的概率随机选择动作探索 以 1-epsilon 的概率选择当前最优动作利用 返回值 q_table : 字典键为状态值为该状态下各动作的 Q 值字典 # 初始化 Q 值表为每个状态下的每个动作都赋予初始 Q 值 0 q_table {} for state in env.get_states(): q_table[state] {action: 0.0 for action in env.get_actions()} # 外层循环训练多个回合 for episode in range(episodes): state env.reset() # 重置环境回到初始状态 done False # 标记当前回合是否结束 # 内层循环在当前回合内持续交互直到回合结束 while not done: # 探索与利用以 epsilon 的概率随机探索否则选择当前 Q 值最大的动作 if random.random() epsilon: action random.choice(env.get_actions()) # 随机探索 else: # 贪心利用选择当前状态下 Q 值最大的动作 action max(q_table[state], keyq_table[state].get) # 执行动作环境返回下一状态、即时奖励和是否结束 next_state, reward, done env.step(action) # 计算 TD 目标即时奖励 折扣因子 * 下一状态所有动作中的最大 Q 值 # 注意Q-Learning 是离线策略方法更新时使用下一状态的最优 Q 值 # 与当前实际选择的动作无关 best_next max(q_table[next_state].values()) target reward gamma * best_next # 更新当前状态动作对的 Q 值 # 新 Q 值 旧 Q 值 学习率 * (TD 目标 - 旧 Q 值) q_table[state][action] alpha * (target - q_table[state][action]) # 转移到下一状态继续循环 state next_state # 返回训练完成的 Q 值表 return q_tableSARSA是一种在线策略On-Policy方法其名称来自经验片段 (S_t, A_t, R_{t1}, S_{t1}, A_{t1})更新公式为Q(S_t, A_t) ← Q(S_t, A_t) α [ R_{t1} γ Q(S_{t1}, A_{t1}) - Q(S_t, A_t) ]SARSA 在更新时使用下一状态实际选择动作的 Q 值因此它估计的是当前行为策略下的价值。两者差异最明显的场景往往涉及风险Q-Learning 在学习到的最优策略可能偏好“激进”路径因为它总是假设后续会采取最优动作SARSA 更保守因为它会考虑探索过程中的偶然事件。Q-Learning 和 SARSA 都使用表格存储 Q 值因此同样面临维度灾难当状态或动作空间极大、连续或高维时Q 表将无法存储和有效学习。为了解决这一问题深度强化学习引入了函数逼近方法。12. 深度强化学习与 DQN深度强化学习Deep Reinforcement Learning简称 DRL的核心思想是用深度神经网络作为价值函数或策略的函数逼近器从而将强化学习扩展到高维、连续状态空间问题。其中最具代表性的价值类方法是Deep Q-Network简称 DQN。DQN 用神经网络 Q(s, a; θ) 来近似最优 Q 函数。与表格型 Q-Learning 相比DQN 引入了三项关键技术来稳定训练经验回放Experience Replay智能体把交互经验 (s, a, r, s, done) 存入回放池训练时随机抽取小批量样本进行梯度更新。这种做法打破了样本之间的时间相关性提高了数据利用率。目标网络Target Network维护一个参数更新较慢的目标网络来计算 TD 目标 y r γ max_{a} Q(s, a; θ⁻)其余时间保持目标网络参数固定。这样可以避免更新目标与更新当前网络相互耦合导致的震荡。损失函数与梯度更新训练目标是最小化 TD 误差的平方损失仅对当前网络参数 θ 求梯度使预测 Q 值逼近 TD 目标。DQN 的训练目标可以表示为Loss(θ) E[ ( r γ max_{a} Q(s, a; θ⁻) - Q(s, a; θ) )² ]。下面给出 DQN 训练循环的核心代码示意import random from collections import deque def train_dqn(env, q_net, target_net, optimizer, episodes500, gamma0.99, batch_size64, buffer_size100000): DQN 训练循环使用经验回放和目标网络稳定深度 Q 网络的训练过程。 参数说明 env : 环境对象需要实现 reset()、step(action)、action_space.sample() 等接口 q_net : 当前 Q 网络策略网络负责预测 Q 值并选择动作 target_net : 目标网络参数更新较慢用于计算 TD 目标稳定训练 optimizer : 优化器用于更新 q_net 的网络参数 episodes : 训练回合数 gamma : 折扣因子取值范围 [0, 1)用于权衡近期奖励与远期奖励的重要性 batch_size : 每次梯度更新时从经验回放池中随机抽取的样本数量 buffer_size : 经验回放池的最大容量超出后自动丢弃最旧的经验 返回值 q_net : 训练完成的 Q 网络 # 初始化经验回放池使用双端队列容量为 buffer_size超出后自动淘汰最旧经验 replay_buffer deque(maxlenbuffer_size) # 探索率设置初始为 1.0完全随机探索随训练逐渐衰减到 epsilon_min epsilon 1.0 epsilon_min 0.05 # 探索率下限保证训练后期仍保留少量探索 epsilon_decay 0.995 # 每个回合结束后探索率的衰减系数 # 外层循环训练多个回合 for episode in range(episodes): state env.reset() # 重置环境回到初始状态 done False # 标记当前回合是否结束 total_reward 0 # 累计本回合获得的总奖励用于观察训练效果 # 内层循环在当前回合内持续交互直到回合结束 while not done: # 探索与利用以 epsilon 的概率随机探索否则选择当前 Q 值最大的动作 if random.random() epsilon: action env.action_space.sample() # 随机探索 else: action q_net.choose_best_action(state) # 利用当前网络选择最优动作 # 执行动作环境返回下一状态、即时奖励、是否结束和额外信息 next_state, reward, done, _ env.step(action) # 将本次交互经验存入回放池供后续随机采样训练 replay_buffer.append((state, action, reward, next_state, done)) # 转移到下一状态并累加本回合总奖励 state next_state total_reward reward # 当回放池中的经验数量足够时开始进行梯度更新 if len(replay_buffer) batch_size: # 从回放池中随机抽取一个小批量样本打破样本间的时间相关性 batch random.sample(replay_buffer, batch_size) # 计算 TD 损失预测 Q 值与目标 Q 值之间的均方误差 # 目标 Q 值由目标网络计算公式为 r gamma * max(Q(s, a)) optimizer.zero_grad() # 清空上一轮梯度 loss q_net.compute_td_loss(batch, target_net, gamma) loss.backward() # 反向传播计算梯度 optimizer.step() # 更新当前网络的参数 # 每个回合结束后衰减探索率使智能体逐渐从探索转向利用 epsilon max(epsilon_min, epsilon * epsilon_decay) # 每 10 个回合将当前网络的参数同步到目标网络 # 使目标网络缓慢跟踪当前网络避免训练震荡 if episode % 10 0: target_net.load_state_dict(q_net.state_dict()) # 返回训练完成的 Q 网络 return q_netDQN 及其变体如 Double DQN、Dueling DQN、Prioritized Experience Replay在处理离散动作空间问题时表现优异但对连续动作空间问题通常需要改用基于策略的方法。13. 策略梯度方法策略梯度Policy Gradient方法放弃了对价值函数的完全依赖直接对策略 π(a|s; θ) 进行参数化并优化。这类方法特别适合动作空间连续、或随机策略更自然的场景。其基本思想是朝着“增加高回报动作出现概率、降低低回报动作出现概率”的方向调整策略参数。策略梯度定理给出的梯度形式为∇J(θ) E_π [ ∇ log π(A_t | S_t; θ) · Q_π(S_t, A_t) ]在实际算法中Q_π 常常用采样回报或价值函数估计替代。最经典的策略梯度算法是 REINFORCE它使用完整回合回报 G_t 作为加权项def reinforce(env, policy_net, optimizer, episodes1000, gamma0.99): REINFORCE 算法最经典的策略梯度方法使用完整回合回报作为加权信号更新策略。 参数说明 env : 环境对象需要实现 reset()、step(action) 等接口 policy_net : 策略网络负责根据状态输出动作概率分布并采样动作 optimizer : 优化器用于更新策略网络的参数 episodes : 训练回合数 gamma : 折扣因子取值范围 [0, 1)用于权衡近期奖励与远期奖励的重要性 返回值 无直接修改 policy_net 的网络参数 # 外层循环训练多个回合 for episode in range(episodes): # 记录本回合的状态、动作和奖励序列用于回合结束后计算回报 states, actions, rewards [], [], [] state env.reset() # 重置环境回到初始状态 done False # 标记当前回合是否结束 # 内层循环在当前回合内持续交互直到回合结束 while not done: # 策略网络根据当前状态采样一个动作随机策略 action policy_net.choose_action(state) # 执行动作环境返回下一状态、即时奖励和是否结束 next_state, reward, done, _ env.step(action) # 记录本步的状态、动作和奖励 states.append(state) actions.append(action) rewards.append(reward) # 转移到下一状态继续循环 state next_state # 回合结束后从后往前计算每一步的折扣回报 G_t # G_t r_t gamma * r_{t1} gamma^2 * r_{t2} ... running_return 0.0 # 从回合末尾开始反向累积回报 returns [] for r in reversed(rewards): running_return r gamma * running_return # 折扣累积 returns.insert(0, running_return) # 插入到列表头部保持时间顺序 # 计算策略梯度损失 # 损失 -sum( log pi(a_t|s_t) * G_t ) # 负号是因为优化器默认做梯度下降而策略梯度需要梯度上升 optimizer.zero_grad() # 清空上一轮梯度 loss policy_net.compute_policy_loss(states, actions, returns) loss.backward() # 反向传播计算梯度 optimizer.step() # 更新策略网络参数提高高回报动作的出现概率纯策略梯度方法方差较大训练不够稳定因此实践中通常引入价值函数作为基线Baseline来降低方差。14. Actor-Critic 与 PPOActor-Critic 方法同时维护两个组件Actor策略网络负责选择动作Critic价值网络负责评估当前策略的好坏。Actor 通过策略梯度更新Critic 通过 TD 误差更新。Critic 的估计值一方面作为策略更新的加权信号另一方面作为基线来降低梯度方差。在 Actor-Critic 框架中常用优势函数 A(s, a) 代替原始回报或 Q 值作为加权项。优势函数定义为 A_π(s, a) Q_π(s, a) - V_π(s)表示“在状态 s 采取动作 a 相比平均水平好多少”。使用优势函数的更新具有更低的方差和更稳定的学习过程。实践中优势函数常用 TD 误差 δ 直接近似。PPOProximal Policy Optimization是目前应用最广泛的 Actor-Critic 类算法之一其设计目标是让策略更新既充分又不过度偏离旧策略。PPO 的核心思想是限制新旧策略之间的概率比 r_t(θ) π_θ(a_t|s_t) / π_θold(a_t|s_t)通过对目标函数进行裁剪Clipping来避免过大的策略更新L^CLIP(θ) E[ min( r_t(θ) A_t, clip(r_t(θ), 1-ε, 1ε) A_t ) ]当优势为正时若概率比超过 1ε就把目标值裁剪掉防止策略变化过大当优势为负时同理。这种简单而有效的机制使 PPO 在稳定性、样本效率和实现难度之间取得良好平衡被广泛应用于机器人控制、游戏 AI 和大语言模型强化学习对齐。15. 探索与利用的平衡探索与利用的权衡Exploration-Exploitation Trade-off是强化学习中最根本的问题之一。智能体一方面要利用Exploit当前已知的最优动作来获得高回报另一方面又要探索Explore尚未尝试的动作以获取更多信息避免陷入局部最优。常见的探索策略包括ε-贪心ε-Greedy以 ε 的概率随机选择动作以 1-ε 的概率选择当前最优动作。实现简单但在复杂环境中探索效率有限。玻尔兹曼探索Softmax根据各动作 Q 值的软最大化分布采样动作温度参数控制探索强度。UCBUpper Confidence Bound优先选择不确定性高的动作通过“价值估计 置信上界”来平衡探索。参数噪声与熵正则在深度强化学习中可以向网络参数或动作加入噪声也可以在损失函数中加入策略熵项鼓励策略保留随机性以持续探索。如果探索不足智能体可能过早收敛到次优策略如果探索过度则会浪费大量时间在低回报动作上。16. 离线强化学习与人类反馈强化学习随着深度强化学习的发展一些更贴近实际应用场景的变体逐渐受到关注。离线强化学习Offline RL指的是智能体不与环境进行实时交互只利用预先采集好的固定数据集进行训练。这在医疗、自动驾驶等交互成本高或风险大的场景中尤为重要。离线 RL 的主要挑战是“分布偏移”问题模型可能高估那些在数据集中很少出现的动作的价值导致部署时行为异常。为此出现了保守 Q-LearningCQL等方法通过抑制对分布外动作的过高估计来提高策略稳健性。基于人类反馈的强化学习RLHF则把人类偏好纳入训练流程。其典型流程是先让模型生成多个候选输出再由人类标注偏好排序训练一个奖励模型来预测人类偏好最后使用 PPO 等强化学习算法基于奖励模型优化生成策略。17. 模拟环境与常用工具强化学习的算法验证通常需要合适的模拟环境。以下工具建议使用OpenAI Gym / Gymnasium提供大量标准环境接口覆盖经典控制、倒立摆、小车上山、Atari 游戏等任务是入门强化学习最常用的环境库。Stable-Baselines3基于 PyTorch 的强化学习算法库实现了 PPO、DQN、SAC、TD3 等常用算法适合快速复现和对比实验。18. 总结强化学习以马尔可夫决策过程为数学基础通过价值函数、贝尔曼方程和策略优化等工具让智能体在试错中学习最大化长期回报的决策方式。
