强化学习知识
2026/9/6 5:31:02 网站建设 项目流程

1. 强化学习概述

强化学习(Reinforcement Learning,简称 RL)是机器学习的一个重要分支,研究智能体(Agent)如何在与环境的持续交互中,通过试错方式学习最优决策策略。与监督学习和无监督学习不同,强化学习没有预先标注好的标准答案,智能体只能根据环境给出的奖励信号(Reward)来判断自己行为的优劣,并据此不断调整行为策略,以最大化长期累积回报。

强化学习的核心思想可以概括为“尝试—反馈—改进”的循环过程:智能体在某个状态下执行某个动作,环境会返回即时奖励并转移到新状态,智能体根据奖励的大小和未来预期调整自己的策略,逐步学会在什么样的状态下应该采取什么样的动作。

2. 强化学习与其他机器学习范式的区别

为了更准确理解强化学习的定位,可以将其与监督学习和无监督学习进行对比。

  • 监督学习:训练数据包含“输入—标准输出”对,模型学习从输入到输出的映射,反馈形式是明确的标签误差,常用于分类和回归任务。
  • 无监督学习:训练数据没有标签,模型需要从数据本身发现结构,例如聚类、降维和生成式建模。
  • 强化学习:没有标准答案,只有延迟的、稀疏的奖励信号,智能体通过与环境交互自主积累经验并优化长期回报,反馈形式是奖励或惩罚。

三者最大的区别在于反馈:监督学习是即时且明确的标签,无监督学习几乎没有外部反馈,而强化学习反馈是延迟的、评估性的奖励。

3. 强化学习的核心概念

理解强化学习,首先需要掌握以下基本要素:

  • 智能体(Agent):学习者和决策者,通过与环境的交互来优化自身行为。
  • 环境(Environment):智能体所处的世界,负责对智能体的动作做出响应,返回新状态和奖励。
  • 状态(State,s):环境的当前观察,是智能体做决策的依据。在时间步 t 的状态通常记为 S_t。
  • 动作(Action,a):智能体在某个状态下可以采取的行为,记为 A_t。
  • 奖励(Reward,r):智能体执行动作后环境返回的标量反馈,用于衡量该动作的即时好坏,记为 R_t。
  • 策略(Policy,π):智能体的决策规则,表示在给定状态下选择各动作的概率分布。确定性策略直接输出动作,随机策略输出动作的概率。
  • 轨迹(Trajectory):智能体与环境交互形成的时间序列,例如 S_0, A_0, R_1, S_1, A_1, R_2, S_2 …
  • 回报(Return,G_t):从时间步 t 开始未来所有奖励的某种累积,是强化学习优化的真实目标。

整个交互过程可以形式化地描述为:智能体观察当前状态 S_t,根据策略 π 选择动作 A_t;环境接收 A_t 后产生即时奖励 R_{t+1} 并转移到新状态 S_{t+1};智能体继续观察并进行下一次决策,如此循环往复,直到一个回合结束或无限持续。

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_{t+1} | S_t, A_t) = P(S_{t+1} | S_0, A_0, ..., S_t, A_t)。也就是说,在已知当前状态和动作的情况下,未来的状态分布与更早的历史状态无关。

智能体与环境之间的交互过程可以用下面的 Mermaid 流程图直观展示:

步骤参与者动作结果
1智能体观察当前状态 S_t根据策略 π 选择动作 A_t
2环境接收动作 A_t返回即时奖励 R_{t+1},转移到新状态 S_{t+1}
3智能体接收奖励与新状态更新策略与价值估计,进入下一轮交互

上图中的每个环节都与 MDP 五元组(S, A, P, R, γ)存在明确的对应关系:

  • 状态 S:图中的“智能体观察当前状态 S_t”对应五元组中的状态集合 S。状态是智能体做决策的依据,也是 MDP 中马尔可夫性质发挥作用的基础。
  • 动作 A:图中的“根据策略 π 选择动作 A_t”对应五元组中的动作集合 A。智能体在状态 S_t 下从动作集合中选取一个动作,这一选择由策略决定。
  • 状态转移概率 P:图中的“环境转移到新状态 S_{t+1}”对应五元组中的状态转移概率 P(s'|s, a)。环境并非确定性地进入下一状态,而是按照转移概率分布随机跳转,这正是 MDP 中不确定性的来源。
  • 奖励函数 R:图中的“环境执行动作并返回即时奖励 R_{t+1}”对应五元组中的奖励函数 R。奖励是环境对智能体动作的即时评估信号,也是智能体判断动作好坏、调整策略的核心依据。
  • 折扣因子 γ:图中的“智能体更新策略与价值估计”环节间接体现了折扣因子 γ 的作用。智能体在更新价值估计时,会用 γ 对未来的奖励进行折扣加权,从而在近期收益与远期收益之间做出权衡。

整个循环过程可以概括为:智能体在状态 S_t 下选择动作 A_t,环境依据转移概率 P 返回奖励 R_{t+1} 并转移到新状态 S_{t+1},智能体再结合折扣因子 γ 更新自己的策略与价值估计,随后进入下一轮交互。如此循环往复,智能体便能在不断试错中逐步逼近最优策略。

5. 回报与折扣因子

强化学习的目标不是最大化某一时刻的即时奖励,而是最大化长期累积回报。回报(Return)的定义通常采用折扣累积形式:

G_t = R_{t+1} + γR_{t+2} + γ²R_{t+3} + γ³R_{t+4} + …

其中 γ 是折扣因子,取值在 [0, 1) 之间。折扣因子的作用主要体现在三个方面:

  • 数学便利:当奖励有界且 γ 小于 1 时,无限序列的回报之和是有限的,便于理论分析。
  • 表达不确定性:未来越远,环境的不确定性越大,折扣因子体现对未来奖励的不完全信任。
  • 控制时间偏好:γ 越接近 0,智能体越“短视”,只关心即时奖励;γ 越接近 1,智能体越“远见”,更重视长期收益。

当问题属于“分幕式任务”(Episodic Task),即交互会在有限步后终止时,也可以将 γ 设为 1,此时的回报就是所有未来奖励的简单求和。实践中大多数算法都采用折扣回报,以便统一处理有限和无限时域任务。

6. 价值函数与 Q 函数

价值函数用于评估智能体在某个状态或某个“状态—动作对”下的长期期望收益,是几乎所有强化学习算法的核心工具。常见的价值函数有两种。

状态价值函数(State Value Function)V_π(s) 表示从状态 s 开始,一直遵循策略 π 所能获得的期望回报:

V_π(s) = E_π[G_t | S_t = s]

它衡量的是“处于某个状态本身有多好”。

动作价值函数(Action Value Function)Q_π(s, a) 表示在状态 s 首先执行动作 a,之后一直遵循策略 π 所能获得的期望回报:

Q_π(s, a) = E_π[G_t | S_t = s, A_t = a]

它衡量的是“在某个状态下采取某个动作有多好”。Q 函数在实践中的重要性更高,因为当环境模型未知时,智能体可以直接比较各动作的 Q 值来选择最优动作,而不需要知道状态转移概率。

在价值函数的基础上,可以定义最优价值函数 V*(s) 与 Q*(s, a)。最优策略对应的价值函数满足:对所有状态 s,V*(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, gamma=0.9, eps=1e-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_states,V[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_{t+1} + γ V(S_{t+1}) - V(S_t) ]

其中括号内的差值称为 TD 误差(TD Error),记为 δ_t = R_{t+1} + γ V(S_{t+1}) - V(S_t)。TD 误差是整个 TD 系列算法的核心,它衡量了当前估计值与基于新观察到的“目标值”之间的差异。

与蒙特卡洛方法相比,TD 方法的主要区别在于更新目标不同:蒙特卡洛使用真实完整回报 G_t,而 TD 使用即时奖励加上对下一状态价值的估计,即 R_{t+1} + γ V(S_{t+1})。因此 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_{t+1} + γ max_a Q(S_{t+1}, a) - Q(S_t, A_t) ]

Q-Learning 在更新时使用下一状态所有动作中的最大 Q 值,与当前实际选择哪个动作无关,因此它学习的是最优 Q 函数,即使智能体当前遵循的是探索性策略。下面是一个表格型 Q-Learning 的 Python 实现示例:

import random def q_learning(env, episodes=1000, alpha=0.1, gamma=0.9, epsilon=0.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], key=q_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_table

SARSA是一种在线策略(On-Policy)方法,其名称来自经验片段 (S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}),更新公式为:

Q(S_t, A_t) ← Q(S_t, A_t) + α [ R_{t+1} + γ Q(S_{t+1}, A_{t+1}) - 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, episodes=500, gamma=0.99, batch_size=64, buffer_size=100000): """ 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(maxlen=buffer_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_net

DQN 及其变体(如 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, episodes=1000, gamma=0.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_{t+1} + gamma^2 * r_{t+2} + ... 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 与 PPO

Actor-Critic 方法同时维护两个组件:Actor(策略网络)负责选择动作,Critic(价值网络)负责评估当前策略的好坏。Actor 通过策略梯度更新,Critic 通过 TD 误差更新。Critic 的估计值一方面作为策略更新的加权信号,另一方面作为基线来降低梯度方差。

在 Actor-Critic 框架中,常用优势函数 A(s, a) 代替原始回报或 Q 值作为加权项。优势函数定义为 A_π(s, a) = Q_π(s, a) - V_π(s),表示“在状态 s 采取动作 a 相比平均水平好多少”。使用优势函数的更新具有更低的方差和更稳定的学习过程。实践中优势函数常用 TD 误差 δ 直接近似。

PPO(Proximal 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 值的软最大化分布采样动作,温度参数控制探索强度。
  • UCB(Upper Confidence Bound):优先选择不确定性高的动作,通过“价值估计 + 置信上界”来平衡探索。
  • 参数噪声与熵正则:在深度强化学习中,可以向网络参数或动作加入噪声,也可以在损失函数中加入策略熵项,鼓励策略保留随机性以持续探索。

如果探索不足,智能体可能过早收敛到次优策略;如果探索过度,则会浪费大量时间在低回报动作上。

16. 离线强化学习与人类反馈强化学习

随着深度强化学习的发展,一些更贴近实际应用场景的变体逐渐受到关注。

离线强化学习(Offline RL)指的是智能体不与环境进行实时交互,只利用预先采集好的固定数据集进行训练。这在医疗、自动驾驶等交互成本高或风险大的场景中尤为重要。离线 RL 的主要挑战是“分布偏移”问题:模型可能高估那些在数据集中很少出现的动作的价值,导致部署时行为异常。为此出现了保守 Q-Learning(CQL)等方法,通过抑制对分布外动作的过高估计来提高策略稳健性。

基于人类反馈的强化学习(RLHF)则把人类偏好纳入训练流程。其典型流程是:先让模型生成多个候选输出,再由人类标注偏好排序,训练一个奖励模型来预测人类偏好,最后使用 PPO 等强化学习算法基于奖励模型优化生成策略。

17. 模拟环境与常用工具

强化学习的算法验证通常需要合适的模拟环境。以下工具建议使用:

  • OpenAI Gym / Gymnasium:提供大量标准环境接口,覆盖经典控制、倒立摆、小车上山、Atari 游戏等任务,是入门强化学习最常用的环境库。
  • Stable-Baselines3:基于 PyTorch 的强化学习算法库,实现了 PPO、DQN、SAC、TD3 等常用算法,适合快速复现和对比实验。

18. 总结

强化学习以马尔可夫决策过程为数学基础,通过价值函数、贝尔曼方程和策略优化等工具,让智能体在试错中学习最大化长期回报的决策方式。

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

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

立即咨询