第一部分:强化学习基础
在讲解策略梯度之前,我们需要先理解强化学习的基本框架,因为策略梯度是强化学习中的一种方法。
1.1 什么是强化学习?
强化学习是一种机器学习范式,目标是让智能体(Agent)通过与环境(Environment)的交互,学习如何采取行动以最大化长期的累积奖励(Cumulative Reward)。与监督学习(给定输入-输出对)不同,强化学习没有明确的标签,智能体需要通过试错(Trial-and-Error)来发现哪些行动是“好的”。
强化学习的经典例子:
- 游戏:智能体在游戏中选择动作(如移动、跳跃),环境返回奖励(如得分)或惩罚(如游戏失败)。
- 机器人控制:机器人学习走路,环境提供反馈(如是否摔倒)。
1.2 强化学习的核心组件
强化学习的数学框架可以用以下几个核心概念来描述:
-
状态(State, SSS):
- 表示智能体当前所处的环境情况。例如,在迷宫游戏中,状态可以是智能体的位置。
- 状态空间 S\mathcal{S}S 是所有可能状态的集合。
-
动作(Action, AAA):
- 智能体在某个状态下可以采取的行为。例如,在迷宫中,动作可以是“向左走”或“向右走”。
- 动作空间 A\mathcal{A}A 是所有可能动作的集合。
-
奖励(Reward, RRR):
- 环境对智能体动作的反馈,是一个标量值。例如,走出迷宫可能得到 +100+100+100 的奖励,撞墙可能得到 −10-10−10。
- 奖励函数 R(s,a,s′)R(s, a, s')R(s,a,s′) 定义了在状态 sss,采取动作 aaa,转移到状态 s′s's′ 时获得的奖励。
-
策略 Wǔ(Policy, π\piπ):
- 策略是智能体决定动作的规则,定义了在状态 sss 下选择动作 aaa 的概率。
- 形式化表示为 π(a∣s)\pi(a|s)π(a∣s),表示在状态 sss 下选择动作 aaa 的概率。
- 策略可以是确定性的(总是选择某个动作)或随机性的(按概率分布选择动作)。
-
环境模型(Environment Model):
- 环境决定了状态转移和奖励的规则。通常用状态转移概率 P(s′∣s,a)P(s'|s, a)P(s′∣s,a) 表示从状态 sss,采取动作 aaa,转移到状态 s′s's′ 的概率。
-
回报(Return, GGG):
- 回报是智能体从某一时刻开始,未来获得的累积奖励。通常用折扣因子 γ∈[0,1]\gamma \in [0, 1]γ∈[0,1] 来平衡短期和长期奖励:
Gt=Rt+1+γRt+2+γ2Rt+3+⋯=∑k=0∞γkRt+k+1G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \sum_{k=0}^\infty \gamma^k R_{t+k+1}Gt=Rt+1+γRt+2+γ2Rt+3+⋯=∑k=0∞γkRt+k+1
其中 γ\gammaγ 越接近 1,智能体越重视长期奖励。
- 回报是智能体从某一时刻开始,未来获得的累积奖励。通常用折扣因子 γ∈[0,1]\gamma \in [0, 1]γ∈[0,1] 来平衡短期和长期奖励:
-
价值函数(Value Function):
- 价值函数评估状态或状态-动作对的“价值”,即在该状态下遵循策略 π\piπ 能获得的期望回报。
- 状态价值函数:
Vπ(s)=Eπ[Gt∣St=s]V^\pi(s) = \mathbb{E}_\pi[G_t | S_t = s]Vπ(s)=Eπ[Gt∣St=s] - 动作价值函数:
Qπ(s,a)=Eπ[Gt∣St=s,At=a]Q^\pi(s, a) = \mathbb{E}_\pi[G_t | S_t = s, A_t = a]Qπ(s,a)=Eπ[Gt∣St=s,At=a]
1.3 强化学习的目标
强化学习的目标是找到一个最优策略 π∗\pi^*π∗,使得智能体在任意状态下都能最大化期望累积回报:
π∗=argmaxπEπ[Gt]\pi^* = \arg\max_\pi \mathbb{E}_\pi[G_t]π∗=argmaxπEπ[Gt]
1.4 强化学习的分类
强化学习的方法可以分为两类:
- 基于价值的方法(Value-Based Methods):如 Q-Learning,学习动作价值函数 Q(s,a)Q(s, a)Q(s,a),然后选择价值最大的动作。
- 基于策略的方法(Policy-Based Methods):直接优化策略 π(a∣s)\pi(a|s)π(a∣s),使之输出更好的动作分布。策略梯度就属于这一类。
- 演员-评论家方法(Actor-Critic Methods):结合基于价值和基于策略的方法,既学习策略(演员),又学习价值函数(评论家)。
第二部分:策略梯度简介
2.1 为什么需要策略梯度?
在强化学习中,基于价值的方法(如 Q-Learning)通过估计每个状态-动作对的价值来选择动作。然而,这种方法有以下局限性:
- 离散动作空间:当动作空间很大或连续时,计算每个动作的 Q(s,a)Q(s, a)Q(s,a) 变得困难。
- 策略的表达能力:基于价值的方法通常选择最大价值的动作(确定性策略),难以处理需要随机性的场景(如部分可观测环境)。
- 复杂环境:在高维或连续动作空间中,基于价值的方法可能收敛缓慢或不稳定。
策略梯度方法通过直接优化策略 π(a∣s;θ)\pi(a|s; \theta)π(a∣s;θ),克服了这些问题。策略通常用神经网络参数化,参数为 θ\thetaθ,通过梯度上升优化策略,使其输出更可能带来高回报的动作。
2.2 策略梯度的核心思想
策略梯度方法的核心是:
- 将策略 π(a∣s;θ)\pi(a|s; \theta)π(a∣s;θ) 表示为一个参数化的概率分布(通常用神经网络实现)。
- 定义一个目标函数 J(θ)J(\theta)J(θ),表示策略的期望累积回报。
- 通过计算目标函数对参数 θ\thetaθ 的梯度 ∇θJ(θ)\nabla_\theta J(\theta)∇θJ(θ),使用梯度上升更新参数:
θ←θ+α∇θJ(θ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)θ←θ+α∇θJ(θ)
其中 α\alphaα 是学习率。
这个过程类似于深度学习中的梯度下降,但这里是梯度上升,因为我们希望最大化期望回报。
第三部分:策略梯度的数学推导
为了深入理解策略梯度,我们需要推导其核心公式:策略梯度定理。这一部分会涉及一些数学,但我会尽量分解步骤,确保清晰。
3.1 目标函数的定义
我们希望优化的目标是期望累积回报:
J(θ)=Eτ∼πθ[R(τ)]J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)]J(θ)=Eτ∼πθ[R(τ)]
其中:
- τ=(s0,a0,r1,s1,a1,r2,… )\tau = (s_0, a_0, r_1, s_1, a_1, r_2, \dots)τ=(s0,a0,r1,s1,a1,r2,…) 是一个轨迹(Trajectory),表示智能体与环境的交互序列。
- R(τ)=∑t=0Tγtrt+1R(\tau) = \sum_{t=0}^T \gamma^t r_{t+1}R(τ)=∑t=0Tγtrt+1 是轨迹的累积奖励。
- τ∼πθ\tau \sim \pi_\thetaτ∼πθ 表示轨迹的概率分布由策略 πθ\pi_\thetaπθ 决定。
轨迹的概率为:
p(τ∣θ)=p(s0)∏t=0Tπ(at∣st;θ)P(st+1∣st,at)p(\tau|\theta) = p(s_0) \prod_{t=0}^T \pi(a_t|s_t; \theta) P(s_{t+1}|s_t, a_t)p(τ∣θ)=p(s0)∏t=0Tπ(at∣st;θ)P(st+1∣st,at)
其中:
- p(s0)p(s_0)p(s0) 是初始状态分布。
- π(at∣st;θ)\pi(a_t|s_t; \theta)π(at∣st;θ) 是策略输出的动作概率。
- P(st+1∣st,at)P(s_{t+1}|s_t, a_t)P(st+1∣st,at) 是环境的状态转移概率。
因此,目标函数可以写为:
J(θ)=∫p(τ∣θ)R(τ)dτJ(\theta) = \int p(\tau|\theta) R(\tau) d\tauJ(θ)=∫p(τ∣θ)R(τ)dτ
3.2 计算策略梯度
我们需要计算目标函数 J(θ)J(\theta)J(θ) 对策略参数 θ\thetaθ 的梯度 ∇θJ(θ)\nabla_\theta J(\theta)∇θJ(θ),以通过梯度上升优化策略 πθ\pi_\thetaπθ。目标函数定义为在策略 πθ\pi_\thetaπθ 下轨迹 τ\tauτ 的期望回报:J(θ)=Eτ∼p(τ∣θ)[R(τ)]=∫p(τ∣θ)R(τ)dτ J(\theta) = \mathbb{E}_{\tau \sim p(\tau|\theta)}[R(\tau)] = \int p(\tau|\theta) R(\tau) d\tau J(θ)=Eτ∼p(τ∣θ)[R(τ)]=∫p(τ∣θ)R(τ)dτ,其中,τ=(s0,a0,s1,a1,…,sT,aT,sT+1)\tau = (s_0, a_0, s_1, a_1, \dots, s_T, a_T, s_{T+1})τ=(s0,a0,s1,a1,…,sT,aT,sT+1) 是一条完整的轨迹,p(τ∣θ)p(\tau|\theta)p(τ∣θ) 是轨迹 τ\tauτ 的概率密度,R(τ)=∑t=0Tγtr(st,at,st+1) R(\tau) = \sum_{t=0}^T \gamma^t r(s_t, a_t, s_{t+1}) R(τ)=t=0∑Tγtr(st,at,st+1) 是轨迹的累积回报,γ\gammaγ 为折扣因子。
梯度计算
对目标函数求梯度:∇θJ(θ)=∇θ∫p(τ∣θ)R(τ)dτ \nabla_\theta J(\theta) = \nabla_\theta \int p(\tau|\theta) R(\tau) d\tau ∇θJ(θ)=∇θ∫p(τ∣θ)R(τ)dτ
由于积分内部的 p(τ∣θ)p(\tau|\theta)p(τ∣θ) 依赖于 θ\thetaθ,我们将梯度算子移入积分(假设积分满足交换性条件):∇θJ(θ)=∫∇θ[p(τ∣θ)R(τ)]dτ \nabla_\theta J(\theta) = \int \nabla_\theta [p(\tau|\theta) R(\tau)] d\tau ∇θJ(θ)=∫∇θ[p(τ∣θ)R(τ)]dτ
注意到,R(τ)R(\tau)R(τ) 是环境的回报函数,与 θ\thetaθ 无关,因此:∇θ[p(τ∣θ)R(τ)]=R(τ)∇θp(τ∣θ) \nabla_\theta [p(\tau|\theta) R(\tau)] = R(\tau) \nabla_\theta p(\tau|\theta) ∇θ[p(τ∣θ)R(τ)]=R(τ)∇θp(τ∣θ)
代入:∇θJ(θ)=∫R(τ)∇θp(τ∣θ)dτ \nabla_\theta J(\theta) = \int R(\tau) \nabla_\theta p(\tau|\theta) d\tau ∇θJ(θ)=∫R(τ)∇θp(τ∣θ)dτ
使用对数梯度技巧
为了计算 ∇θp(τ∣θ)\nabla_\theta p(\tau|\theta)∇θp(τ∣θ),我们引入对数梯度技巧(Log-Likelihood Trick)。对于概率密度 p(τ∣θ)p(\tau|\theta)p(τ∣θ),有:∇θlogp(τ∣θ)=∇θp(τ∣θ)p(τ∣θ) \nabla_\theta \log p(\tau|\theta) = \frac{\nabla_\theta p(\tau|\theta)}{p(\tau|\theta)} ∇θlogp(τ∣θ)=p(τ∣θ)∇θp(τ∣θ)
重排得:∇θp(τ∣θ)=p(τ∣θ)∇θlogp(τ∣θ) \nabla_\theta p(\tau|\theta) = p(\tau|\theta) \nabla_\theta \log p(\tau|\theta) ∇θp(τ∣θ)=p(τ∣θ)∇θlogp(τ∣θ)
将此代入梯度公式:∇θJ(θ)=∫R(τ)[p(τ∣θ)∇θlogp(τ∣θ)]dτ \nabla_\theta J(\theta) = \int R(\tau) [p(\tau|\theta) \nabla_\theta \log p(\tau|\theta)] d\tau ∇θJ(θ)=∫R(τ)[p(τ∣θ)∇θlogp(τ∣θ)]dτ
注意到积分 ∫p(τ∣θ)[⋅]dτ\int p(\tau|\theta) [\cdot] d\tau∫p(τ∣θ)[⋅]dτ 是对轨迹 τ∼p(τ∣θ)\tau \sim p(\tau|\theta)τ∼p(τ∣θ) 的期望,因此:∇θJ(θ)=Eτ∼p(τ∣θ)[R(τ)∇θlogp(τ∣θ)] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p(\tau|\theta)} [R(\tau) \nabla_\theta \log p(\tau|\theta)] ∇θJ(θ)=Eτ∼p(τ∣θ)[R(τ)∇θlogp(τ∣θ)]
这一形式表明,策略梯度可以通过采样轨迹 τ\tauτ 来估计,具体为轨迹回报 R(τ)R(\tau)R(τ) 和轨迹概率对数梯度 ∇θlogp(τ∣θ)\nabla_\theta \log p(\tau|\theta)∇θlogp(τ∣θ) 的乘积的期望。
计算轨迹概率的对数梯度
为了计算 ∇θlogp(τ∣θ)\nabla_\theta \log p(\tau|\theta)∇θlogp(τ∣θ),需要明确轨迹概率 p(τ∣θ)p(\tau|\theta)p(τ∣θ) 的表达式。轨迹 τ\tauτ 的概率由以下部分组成:
- 初始状态分布:p(s0)p(s_0)p(s0)。
- 策略概率:π(at∣st;θ)\pi(a_t|s_t; \theta)π(at∣st;θ),表示在状态 sts_tst 下选择动作 ata_tat 的概率。
- 状态转移概率:P(st+1∣st,at)P(s_{t+1}|s_t, a_t)P(st+1∣st,at),表示环境从状态 sts_tst 采取动作 ata_tat 后转移到状态 st+1s_{t+1}st+1 的概率。
轨迹的联合概率为:p(τ∣θ)=p(s0)∏t=0Tπ(at∣st;θ)P(st+1∣st,at) p(\tau|\theta) = p(s_0) \prod_{t=0}^T \pi(a_t|s_t; \theta) P(s_{t+1}|s_t, a_t) p(τ∣θ)=p(s0)t=0∏Tπ(at∣st;θ)P(st+1∣st,at)
取对数:logp(τ∣θ)=logp(s0)+∑t=0T[logπ(at∣st;θ)+logP(st+1∣st,at)] \log p(\tau|\theta) = \log p(s_0) + \sum_{t=0}^T \left[ \log \pi(a_t|s_t; \theta) + \log P(s_{t+1}|s_t, a_t) \right] logp(τ∣θ)=logp(s0)+t=0∑T[logπ(at∣st;θ)+logP(st+1∣st,at)]
对 θ\thetaθ 求梯度:∇θlogp(τ∣θ)=∇θ[logp(s0)+∑t=0T(logπ(at∣st;θ)+logP(st+1∣st,at))] \nabla_\theta \log p(\tau|\theta) = \nabla_\theta \left[ \log p(s_0) + \sum_{t=0}^T \left( \log \pi(a_t|s_t; \theta) + \log P(s_{t+1}|s_t, a_t) \right) \right] ∇θlogp(τ∣θ)=∇θ[logp(s0)+t=0∑T(logπ(at∣st;θ)+logP(st+1∣st,at))]
分析每一项:
- logp(s0)\log p(s_0)logp(s0):初始状态分布由环境决定,不依赖 θ\thetaθ,因此 ∇θlogp(s0)=0 \nabla_\theta \log p(s_0) = 0 ∇θlogp(s0)=0
- logP(st+1∣st,at)\log P(s_{t+1}|s_t, a_t)logP(st+1∣st,at):状态转移概率是环境动态模型,不依赖 θ\thetaθ,因此 ∇θlogP(st+1∣st,at)=0 \nabla_\theta \log P(s_{t+1}|s_t, a_t) = 0 ∇θlogP(st+1∣st,at)=0
- logπ(at∣st;θ)\log \pi(a_t|s_t; \theta)logπ(at∣st;θ):策略概率显式依赖 θ\thetaθ,其梯度非零。
因此:∇θlogp(τ∣θ)=∑t=0T∇θlogπ(at∣st;θ) \nabla_\theta \log p(\tau|\theta) = \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) ∇θlogp(τ∣θ)=t=0∑T∇θlogπ(at∣st;θ)
最终策略梯度表达式
将 ∇θlogp(τ∣θ)\nabla_\theta \log p(\tau|\theta)∇θlogp(τ∣θ) 代回:∇θJ(θ)=Eτ∼p(τ∣θ)[R(τ)∑t=0T∇θlogπ(at∣st;θ)] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p(\tau|\theta)} \left[ R(\tau) \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) \right] ∇θJ(θ)=Eτ∼p(τ∣θ)[R(τ)t=0∑T∇θlogπ(at∣st;θ)]。这表明策略梯度可以通过以下步骤估计:
- 从策略 πθ\pi_\thetaπθ 采样多条轨迹 τ(i),i=1,…,N\tau^{(i)}, i=1,\dots,Nτ(i),i=1,…,N。
- 对每条轨迹,计算累积回报 R(τ(i))R(\tau^{(i)})R(τ(i))。
- 计算每个时间步的策略对数概率梯度 ∇θlogπ(at∣st;θ)\nabla_\theta \log \pi(a_t|s_t; \theta)∇θlogπ(at∣st;θ)。
- 对所有轨迹求平均,近似期望:∇θJ(θ)≈1N∑i=1N[R(τ(i))∑t=0T∇θlogπ(at(i)∣st(i);θ)] \nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \left[ R(\tau^{(i)}) \sum_{t=0}^T \nabla_\theta \log \pi(a_t^{(i)}|s_t^{(i)}; \theta) \right] ∇θJ(θ)≈N1i=1∑N[R(τ(i))t=0∑T∇θlogπ(at(i)∣st(i);θ)]
补充说明
-
对数梯度技巧的作用:将 ∇θp(τ∣θ)\nabla_\theta p(\tau|\theta)∇θp(τ∣θ) 转换为 p(τ∣θ)∇θlogp(τ∣θ) p(\tau|\theta) \nabla_\theta \log p(\tau|\theta) p(τ∣θ)∇θlogp(τ∣θ),将梯度计算转化为期望形式,便于蒙特卡洛采样,避免直接处理复杂的概率密度。
-
因果性改进:动作 ata_tat 只影响时间 ttt 及之后的奖励,因此可将梯度改写为:∇θJ(θ)=Eτ∼p(τ∣θ)[∑t=0T∇θlogπ(at∣st;θ)∑k=tTγk−tr(sk,ak,sk+1)] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p(\tau|\theta)} \left[ \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) \sum_{k=t}^T \gamma^{k-t} r(s_k, a_k, s_{k+1}) \right] ∇θJ(θ)=Eτ∼p(τ∣θ)[t=0∑T∇θlogπ(at∣st;θ)k=t∑Tγk−tr(sk,ak,sk+1)]这利用了因果性,降低了梯度方差。
-
基线函数:为进一步降低方差,可引入基线函数 b(st)b(s_t)b(st)(如值函数估计),修改梯度为:∇θJ(θ)=Eτ∼p(τ∣θ)[∑t=0T∇θlogπ(at∣st;θ)(Rt−b(st))] \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p(\tau|\theta)} \left[ \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) (R_t - b(s_t)) \right] ∇θJ(θ)=Eτ∼p(τ∣θ)[t=0∑T∇θlogπ(at∣st;θ)(Rt−b(st))],其中 Rt=∑k=tTγk−tr(sk,ak,sk+1) R_t = \sum_{k=t}^T \gamma^{k-t} r(s_k, a_k, s_{k+1}) Rt=k=t∑Tγk−tr(sk,ak,sk+1) 是从时间 ttt 开始的回报。
3.3 策略梯度定理
策略梯度定理是策略梯度方法的核心,它提供了一种简洁的方式来计算目标函数 J(θ)J(\theta)J(θ) 的梯度,避免直接对整个轨迹的回报求导。为了进一步简化计算,我们希望梯度只依赖于每个时间步的动作及其价值,而不是整个轨迹的累积回报。策略梯度定理指出:
∇θJ(θ)=Eτ∼πθ[∑t=0T∇θlogπ(at∣st;θ)Qπ(st,at)]
\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) Q^\pi(s_t, a_t) \right]
∇θJ(θ)=Eτ∼πθ[t=0∑T∇θlogπ(at∣st;θ)Qπ(st,at)]
其中:
- π(at∣st;θ)\pi(a_t|s_t; \theta)π(at∣st;θ) 是策略,表示在状态 sts_tst 下选择动作 ata_tat 的概率。
- ∇θlogπ(at∣st;θ)\nabla_\theta \log \pi(a_t|s_t; \theta)∇θlogπ(at∣st;θ) 是策略对数概率对参数 θ\thetaθ 的梯度。
- Qπ(st,at)=Eτ∼πθ[∑k=tTγk−trk∣st,at]Q^\pi(s_t, a_t) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{k=t}^T \gamma^{k-t} r_k \mid s_t, a_t \right]Qπ(st,at)=Eτ∼πθ[∑k=tTγk−trk∣st,at] 是动作价值函数,表示在状态 sts_tst 采取动作 ata_tat,随后遵循策略 π\piπ 的期望回报。
定理的意义
策略梯度定理将梯度分解为两个核心部分:
- 策略梯度 ∇θlogπ(at∣st;θ)\nabla_\theta \log \pi(a_t|s_t; \theta)∇θlogπ(at∣st;θ):表示参数 θ\thetaθ 对动作 ata_tat 概率的敏感性,反映调整 θ\thetaθ 如何改变策略在状态 sts_tst 下选择动作 ata_tat 的倾向。
- 动作价值 Qπ(st,at)Q^\pi(s_t, a_t)Qπ(st,at):衡量在状态 sts_tst 采取动作 ata_tat 后,遵循策略 π\piπ 的期望回报,代表该动作的“价值”。
通过这两部分的乘积,定理确保策略朝着选择高价值动作的方向优化:
- 如果 Qπ(st,at)>0Q^\pi(s_t, a_t) > 0Qπ(st,at)>0,策略会增加 π(at∣st;θ)\pi(a_t|s_t; \theta)π(at∣st;θ) 的概率,倾向于更频繁地选择动作 ata_tat。
- 如果 Qπ(st,at)<0Q^\pi(s_t, a_t) < 0Qπ(st,at)<0,策略会减少 π(at∣st;θ)\pi(a_t|s_t; \theta)π(at∣st;θ) 的概率,降低选择动作 ata_tat 的可能性。
- 动作价值 Qπ(st,at)Q^\pi(s_t, a_t)Qπ(st,at) 的绝对值越大,策略调整的幅度越大;价值较高的动作会更显著地增加其概率。
这个机制使策略能够通过梯度上升逐步学习到更优的动作选择策略。
3.4 蒙特卡洛采样
在实际中,我们无法直接计算期望,因此使用蒙特卡洛方法采样多条轨迹,近似梯度:
∇θJ(θ)≈1N∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)Gt(i)\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^T \nabla_\theta \log \pi(a_t^{(i)}|s_t^{(i)}; \theta) G_t^{(i)}∇θJ(θ)≈N1∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)Gt(i)
其中:
- NNN 是采样轨迹数。
- Gt(i)G_t^{(i)}Gt(i) 是第 iii 条轨迹在时间 ttt 的实际回报,近似 Qπ(st,at)Q^\pi(s_t, a_t)Qπ(st,at)。
第四部分:策略梯度算法
4.1 REINFORCE算法
REINFORCE 是最基本的策略梯度算法,基于蒙特卡洛采样。其伪代码如下:
- 初始化策略参数 θ\thetaθ。
- 重复以下步骤:
- 采样 NNN 条轨迹 τ(i)\tau^{(i)}τ(i),每条轨迹包含状态、动作和奖励序列。
- 对于每条轨迹,计算回报 Gt(i)G_t^{(i)}Gt(i)。
- 计算梯度:
∇θJ(θ)≈1N∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)Gt(i)\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^T \nabla_\theta \log \pi(a_t^{(i)}|s_t^{(i)}; \theta) G_t^{(i)}∇θJ(θ)≈N1∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)Gt(i) - 更新参数:
θ←θ+α∇θJ(θ)\theta \leftarrow \theta + \alpha \nabla_\theta J(\theta)θ←θ+α∇θJ(θ)
优点:
- 简单,易于实现。
- 适用于离散和连续动作空间。
缺点:
- 方差高:蒙特卡洛采样的回报 GtG_tGt 波动大,导致梯度估计不稳定。
- 收敛缓慢:需要大量样本。
4.2 减小方差的技巧
为了提高策略梯度的稳定性,常用以下技巧:
-
基线(Baseline):
- 在梯度中引入基线 b(st)b(s_t)b(st),不改变期望,但降低方差:
∇θJ(θ)≈1N∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)(Gt(i)−b(st(i)))\nabla_\theta J(\theta) \approx \frac{1}{N} \sum_{i=1}^N \sum_{t=0}^T \nabla_\theta \log \pi(a_t^{(i)}|s_t^{(i)}; \theta) (G_t^{(i)} - b(s_t^{(i)}))∇θJ(θ)≈N1∑i=1N∑t=0T∇θlogπ(at(i)∣st(i);θ)(Gt(i)−b(st(i))) - 常用的基线是状态价值函数 Vπ(st)V^\pi(s_t)Vπ(st),可以用神经网络估计。
- 在梯度中引入基线 b(st)b(s_t)b(st),不改变期望,但降低方差:
-
优势函数(Advantage Function):
- 用优势函数 A(st,at)=Q(st,at)−V(st)A(s_t, a_t) = Q(s_t, a_t) - V(s_t)A(st,at)=Q(st,at)−V(st) 替代 Q(st,at)Q(s_t, a_t)Q(st,at),进一步降低方差:
∇θJ(θ)≈E[∑t=0T∇θlogπ(at∣st;θ)A(st,at)]\nabla_\theta J(\theta) \approx \mathbb{E} \left[ \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) A(s_t, a_t) \right]∇θJ(θ)≈E[∑t=0T∇θlogπ(at∣st;θ)A(st,at)]
- 用优势函数 A(st,at)=Q(st,at)−V(st)A(s_t, a_t) = Q(s_t, a_t) - V(s_t)A(st,at)=Q(st,at)−V(st) 替代 Q(st,at)Q(s_t, a_t)Q(st,at),进一步降低方差:
-
折扣因子:
- 在计算回报时,使用折扣因子 γ\gammaγ 限制未来奖励的影响,减少方差。
4.3 演员-评论家算法(Actor-Critic)
为了解决 REINFORCE 的高方差问题,演员-评论家方法结合了基于策略和基于价值的方法:
- 演员(Actor):学习策略 π(a∣s;θ)\pi(a|s; \theta)π(a∣s;θ),负责选择动作。
- 评论家(Critic):学习价值函数 V(s;w)V(s; w)V(s;w) 或 Q(s,a;w)Q(s, a; w)Q(s,a;w),评估动作的好坏。
梯度更新为:
∇θJ(θ)≈∑t=0T∇θlogπ(at∣st;θ)A(st,at)\nabla_\theta J(\theta) \approx \sum_{t=0}^T \nabla_\theta \log \pi(a_t|s_t; \theta) A(s_t, a_t)∇θJ(θ)≈∑t=0T∇θlogπ(at∣st;θ)A(st,at)
其中 A(st,at)A(s_t, a_t)A(st,at) 由评论家估计,例如:
A(st,at)=rt+1+γV(st+1;w)−V(st;w)A(s_t, a_t) = r_{t+1} + \gamma V(s_{t+1}; w) - V(s_t; w)A(st,at)=rt+1+γV(st+1;w)−V(st;w)
优点:
- 实时更新,适合在线学习。
- 方差较低,收敛更快。
缺点:
- 需要同时优化演员和评论家,增加了计算复杂性。
第五部分:策略梯度的实际应用
5.1 常见应用场景
策略梯度方法在以下领域表现优异:
- 机器人控制:如机械臂抓取、无人机导航,动作空间通常是连续的。
- 游戏:如 Atari 游戏、围棋,策略梯度可以处理复杂的策略空间。
- 自然语言处理:如对话系统,策略梯度用于优化生成序列的策略。
- 金融:如自动交易,策略梯度用于优化投资组合。
5.2 现代策略梯度算法
基于策略梯度的现代算法进一步改进了性能:
-
TRPO(Trust Region Policy Optimization):
- 通过限制策略更新的步长,保证稳定性。
- 使用信任区域约束优化目标函数。
-
PPO(Proximal Policy Optimization):
- 改进 TRPO,简化计算,使用剪切概率比(Clipped Surrogate Objective)。
- 易于实现,广泛应用于实际任务。
-
SAC(Soft Actor-Critic):
- 引入熵正则化,鼓励探索,适合连续动作空间。
第六部分:实现策略梯度的代码示例
以下是一个简单的 REINFORCE 算法的 Python 实现,使用 PyTorch 和 Gym 环境(以 CartPole 为例):
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
class PolicyNetwork(nn.Module):
"""
策略网络:基于神经网络实现,用于输出动作概率分布。
该网络用于REINFORCE算法,采用简单的前馈神经网络结构,包含一个隐藏层。
"""
def __init__(self, input_dim, hidden_dim, output_dim):
"""
初始化策略网络。
参数:
input_dim (int): 输入状态的维度,例如CartPole中的状态向量维度为4。
hidden_dim (int): 隐藏层的神经元数量,用于控制网络的容量。
output_dim (int): 输出层的维度,对应可能动作的数量(例如CartPole的2个动作)。
"""
super(PolicyNetwork, self).__init__()
# 定义第一全连接层,将输入状态映射到隐藏层
self.fc1 = nn.Linear(input_dim, hidden_dim)
# 定义第二全连接层,将隐藏层映射到动作空间
self.fc2 = nn.Linear(hidden_dim, output_dim)
# Softmax层,将动作 logits 转换为概率分布
self.softmax = nn.Softmax(dim=-1)
def forward(self, x):
"""
前向传播,计算给定状态下的动作概率分布。
参数:
x (torch.Tensor): 输入状态张量,形状为 (batch_size, input_dim) 或 (input_dim,)。
返回:
torch.Tensor: 动作的概率分布,形状为 (batch_size, output_dim) 或 (output_dim,)。
"""
# 通过第一层并应用 ReLU 激活函数,增加非线性
x = torch.relu(self.fc1(x))
# 通过第二层,得到动作的 logits
x = self.fc2(x)
# 应用 Softmax,转换为概率分布
return self.softmax(x)
def compute_returns(rewards, gamma=0.99):
"""
计算折扣回报:基于奖励序列计算每个时间步的累积折扣回报,并进行归一化处理。
策略梯度方法的核心思想:
- 策略梯度方法是一种强化学习算法,直接优化策略函数 π(a|s;θ),通过梯度上升最大化期望回报。
- 折扣回报(discounted return)用于衡量一个动作序列的长期价值,考虑未来的奖励并通过折扣因子 gamma 衰减。
- 归一化回报可以减少训练过程中的方差,使梯度更新更稳定。
参数:
rewards (list): 单次回合中每个时间步的奖励列表。
gamma (float): 折扣因子,控制未来奖励的重要性,范围为 [0, 1),通常接近1。
返回:
torch.Tensor: 归一化的折扣回报张量,形状为 (episode_length,)。
"""
returns = []
discounted_return = 0
# 从后向前遍历奖励,计算折扣回报
for reward in reversed(rewards):
# 当前时间步的折扣回报 = 当前奖励 + gamma * 后续折扣回报
discounted_return = reward + gamma * discounted_return
# 将当前时间步的回报插入到列表头部,保持时间顺序
returns.insert(0, discounted_return)
# 将回报转换为张量
returns = torch.tensor(returns, dtype=torch.float32)
# 归一化处理:减去均值,除以标准差(加小值防止除零)
returns = (returns - returns.mean()) / (returns.std() + 1e-8)
return returns
def train_reinforce():
"""
使用REINFORCE算法训练策略网络,应用于CartPole-v1环境。
REINFORCE算法(Monte Carlo Policy Gradient)的核心思想:
1. 策略网络 π(a|s;θ) 输出动作概率分布,参数为 θ。
2. 通过与环境交互,采样一条完整轨迹(状态、动作、奖励序列)。
3. 计算每个时间步的折扣回报 G_t,作为动作价值的估计。
4. 计算策略梯度:∇_θ J(θ) ≈ Σ_t [ G_t * ∇_θ log π(a_t|s_t;θ) ]。
5. 使用梯度上升更新策略网络参数:θ ← θ + α * ∇_θ J(θ)。
优点:
- 直接优化策略,适合离散动作空间。
- 简单直观,易于实现。
缺点:
- 基于蒙特卡洛采样的高方差,可能导致训练不稳定。
- 需要完整轨迹,计算效率较低。
CartPole-v1 环境:
- 任务:控制小车移动,使杆保持平衡。
- 状态:4维向量(小车位置、速度、杆角度、角速度)。
- 动作:2种(向左或向右推小车)。
- 奖励:每一步+1,直到回合结束(杆倒下或达到最大时间步)。
"""
# 初始化环境
env = gym.make('CartPole-v1')
input_dim = env.observation_space.shape[0] # 状态维度(4)
output_dim = env.action_space.n # 动作数量(2)
# 初始化策略网络和优化器
policy = PolicyNetwork(input_dim, hidden_dim=128, output_dim=output_dim)
optimizer = optim.Adam(policy.parameters(), lr=0.01) # Adam优化器,学习率为0.01
# 训练循环,运行1000个回合
for episode in range(1000):
# 重置环境,开始新回合
state, _ = env.reset() # 新版 gym 返回 (state, info)
# 初始化轨迹存储
states, actions, rewards = [], [], []
done = False
# 采样一条完整轨迹
while not done:
# 将当前状态转换为张量
state_tensor = torch.FloatTensor(state)
# 通过策略网络获取动作概率分布
action_probs = policy(state_tensor)
# 从概率分布中采样一个动作
action = torch.multinomial(action_probs, 1).item()
# 执行动作,获取下一状态、奖励和结束标志
next_state, reward, terminated, truncated, _ = env.step(action)
# 新版 gym 使用 terminated 和 truncated,done 是两者的结合
done = terminated or truncated
# 存储轨迹数据
states.append(state_tensor)
actions.append(action)
rewards.append(reward)
# 更新当前状态
state = next_state
# 计算折扣回报
returns = compute_returns(rewards)
# 计算策略梯度损失
policy_loss = 0
for t in range(len(rewards)):
# 获取当前时间步的状态和动作
state = states[t]
action = actions[t]
# 获取当前状态下的动作概率分布
action_probs = policy(state)
# 计算所选动作的对数概率
log_prob = torch.log(action_probs[action])
# 计算损失:-log π(a_t|s_t) * G_t
# 负号是因为优化器默认最小化,而我们需要最大化期望回报
policy_loss -= log_prob * returns[t]
# 更新策略网络参数
optimizer.zero_grad() # 清空之前的梯度
policy_loss.backward() # 反向传播,计算梯度
optimizer.step() # 更新网络参数
# 打印回合信息
total_reward = sum(rewards)
print(f'回合 {episode:4d}, 总奖励: {total_reward:7.2f}')
if __name__ == "__main__":
train_reinforce()
这个代码实现了一个简单的 REINFORCE 算法,训练一个神经网络策略在 CartPole 环境中保持平衡。
第七部分:常见问题与解答
-
策略梯度与 Q-Learning 的区别?
- Q-Learning 学习动作价值函数,间接推导策略;策略梯度直接优化策略。
- 策略梯度适合连续动作空间,Q-Learning 更适合离散动作空间。
-
为什么策略梯度方差高?
- 蒙特卡洛采样依赖实际回报,环境随机性和奖励波动导致梯度估计不稳定。
-
如何选择基线?
- 状态价值函数 V(s)V(s)V(s) 是常用的基线,可以用神经网络估计。理想的基线应接近真实价值函数。
-
PPO 和 TRPO 有什么优势?
- PPO 和 TRPO 通过约束更新步长,防止策略变化过大,提高训练稳定性。PPO 更简单,应用更广泛。
第八部分:进一步学习的建议
-
理论学习:
- 阅读《Reinforcement Learning: An Introduction》(Sutton & Barto),深入理解强化学习理论。
- 学习策略梯度的高级算法,如 PPO、SAC,参考原始论文。
-
实践:
- 使用 OpenAI Gym 或 Stable-Baselines3 实现 PPO、TRPO 等算法。
- 尝试在复杂环境(如 MuJoCo、Atari)上训练策略梯度模型。
-
资源:
- David Silver 的强化学习课程(YouTube 公开课)。
- OpenAI Spinning Up 教程,提供代码和理论讲解。
总结
策略梯度是强化学习中强大且灵活的方法,通过直接优化策略,适用于离散和连续动作空间。从基础的 REINFORCE 到现代的 PPO、SAC,策略梯度方法在理论和实践上都取得了巨大成功。通过理解其数学推导、算法实现和优化技巧,你可以将其应用于各种复杂任务。
1256

被折叠的 条评论
为什么被折叠?



