这几天在思考为什么策略梯度的目标函数会是这样的形式:
L=−∑k,tQk,tlog(π(sk,t,ak,t))
\mathcal{L}=-\sum_{k, t} Q_{k, t} \log \left(\pi\left(s_{k, t}, a_{k, t}\right)\right)
L=−k,t∑Qk,tlog(π(sk,t,ak,t))
主要奇怪于为什么突然冒出来log\loglog。 尽管物理意义上我比较容易理解,反正就是鼓励QQQ值大的动作,打压QQQ值小的动作。但是还是比较较真其推导是如何来的。今天参考了DeepSeek的回答,加上一些自己的心得体会,用博客记录下。
策略梯度算法:原始目标函数、梯度、代理目标函数及其正确性
原始目标函数 (Original Objective Function)
在强化学习中,目标是最大化策略πθ(a∣s)\pi_\theta(a|s)πθ(a∣s)下的期望累积奖励。令τ=(s0,a0,s1,a1,…,sT)\tau = (s_0, a_0, s_1, a_1, \dots, s_T)τ=(s0,a0,s1,a1,…,sT)表示一个轨迹(trajectory),其中sts_tst是状态,ata_tat是动作,TTT是轨迹长度(可能无限)。轨迹的累积奖励定义为:
R(τ)=∑t=0Tγtr(st,at),
R(\tau) = \sum_{t=0}^{T} \gamma^t r(s_t, a_t),
R(τ)=t=0∑Tγtr(st,at),
其中γ∈[0,1]\gamma \in [0, 1]γ∈[0,1]是折扣因子,r(st,at)r(s_t, a_t)r(st,at)是即时奖励。
原始目标函数J(θ)J(\theta)J(θ)是策略参数θ\thetaθ下的期望累积奖励:
J(θ)=Eτ∼pθ(τ)[R(τ)].
J(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ R(\tau) \right].
J(θ)=Eτ∼pθ(τ)[R(τ)].
这里,pθ(τ)p_\theta(\tau)pθ(τ)是策略πθ\pi_\thetaπθ和环境动态p(st+1∣st,at)p(s_{t+1} | s_t, a_t)p(st+1∣st,at)共同定义的轨迹分布:
pθ(τ)=p(s0)∏t=0T−1πθ(at∣st)p(st+1∣st,at).
p_\theta(\tau) = p(s_0) \prod_{t=0}^{T-1} \pi_\theta(a_t | s_t) p(s_{t+1} | s_t, a_t).
pθ(τ)=p(s0)t=0∏T−1πθ(at∣st)p(st+1∣st,at).
优化目标是通过调整θ\thetaθ来最大化J(θ)J(\theta)J(θ). 这个目标函数的定义非常直观,但是很难直接对θ\thetaθ求梯度。换言之,不太明确该如何套用到当前神经网络已经非常成熟的反向传播流程中。
梯度 (Gradient)
策略梯度定理(Policy Gradient Theorem)提供了J(θ)J(\theta)J(θ)的梯度表达式。REINFORCE算法直接使用该梯度进行随机梯度上升。梯度的推导基于似然比技巧(Likelihood Ratio Trick):
∇θJ(θ)=∇θEτ∼pθ(τ)[R(τ)]=Eτ∼pθ(τ)[R(τ)∇θlogpθ(τ)].
\nabla_\theta J(\theta) = \nabla_\theta \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ R(\tau) \right] = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ R(\tau) \nabla_\theta \log p_\theta(\tau) \right].
∇θJ(θ)=∇θEτ∼pθ(τ)[R(τ)]=Eτ∼pθ(τ)[R(τ)∇θlogpθ(τ)].
其中,∇θlogpθ(τ)\nabla_\theta \log p_\theta(\tau)∇θlogpθ(τ)是轨迹的对数似然梯度。由于环境动态p(st+1∣st,at)p(s_{t+1} | s_t, a_t)p(st+1∣st,at)与θ\thetaθ无关,我们有:
∇θlogpθ(τ)=∑t=0T−1∇θlogπθ(at∣st).
\nabla_\theta \log p_\theta(\tau) = \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t | s_t).
∇θlogpθ(τ)=t=0∑T−1∇θlogπθ(at∣st).
代入梯度表达式:
∇θJ(θ)=Eτ∼pθ(τ)[(∑t=0T−1∇θlogπθ(at∣st))R(τ)].
\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ \left( \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t | s_t) \right) R(\tau) \right].
∇θJ(θ)=Eτ∼pθ(τ)[(t=0∑T−1∇θlogπθ(at∣st))R(τ)].
在实际中,R(τ)R(\tau)R(τ)通常替换为从时间步ttt开始的折扣累积奖励Gt=∑k=tTγk−tr(sk,ak)G_t = \sum_{k=t}^{T} \gamma^{k-t} r(s_k, a_k)Gt=∑k=tTγk−tr(sk,ak)(称为回报),以减小方差。这是因为动作ata_tat只影响未来奖励,因此:
∇θJ(θ)=Eτ∼pθ(τ)[∑t=0T−1∇θlogπθ(at∣st)⋅Gt].
\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot G_t \right].
∇θJ(θ)=Eτ∼pθ(τ)[t=0∑T−1∇θlogπθ(at∣st)⋅Gt].
这是REINFORCE算法的核心梯度公式。这里我们先在数学上推导了梯度的准确形式。
等效的代理目标函数 (Equivalent Surrogate Objective Function)
直接优化J(θ)J(\theta)J(θ)困难,因为其涉及期望计算。因此,REINFORCE使用一个代理目标函数J~(θ)\tilde{J}(\theta)J~(θ),其梯度与∇θJ(θ)\nabla_\theta J(\theta)∇θJ(θ)相同。
代理目标函数定义为:
J~(θ)=Eτ∼pθ(τ)[∑t=0T−1logπθ(at∣st)⋅Gt].
\tilde{J}(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ \sum_{t=0}^{T-1} \log \pi_\theta(a_t | s_t) \cdot G_t \right].
J~(θ)=Eτ∼pθ(τ)[t=0∑T−1logπθ(at∣st)⋅Gt].
注意:
- logπθ(at∣st)\log \pi_\theta(a_t | s_t)logπθ(at∣st)是动作的对数概率,而非其梯度。
- GtG_tGt是从时间ttt开始的折扣累积奖励。
- J~(θ)\tilde{J}(\theta)J~(θ)是J(θ)J(\theta)J(θ)的代理(surrogate),因为优化J~(θ)\tilde{J}(\theta)J~(θ)能间接优化J(θ)J(\theta)J(θ)。
代理函数的关键在于其梯度:
∇θJ~(θ)=∇θEτ∼pθ(τ)[∑t=0T−1logπθ(at∣st)⋅Gt]=Eτ∼pθ(τ)[∑t=0T−1∇θlogπθ(at∣st)⋅Gt].
\nabla_\theta \tilde{J}(\theta) = \nabla_\theta \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ \sum_{t=0}^{T-1} \log \pi_\theta(a_t | s_t) \cdot G_t \right] = \mathbb{E}_{\tau \sim p_\theta(\tau)} \left[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot G_t \right].
∇θJ~(θ)=∇θEτ∼pθ(τ)[t=0∑T−1logπθ(at∣st)⋅Gt]=Eτ∼pθ(τ)[t=0∑T−1∇θlogπθ(at∣st)⋅Gt].
这与∇θJ(θ)\nabla_\theta J(\theta)∇θJ(θ)完全一致:
∇θJ~(θ)=∇θJ(θ).
\nabla_\theta \tilde{J}(\theta) = \nabla_\theta J(\theta).
∇θJ~(θ)=∇θJ(θ).
因此,J~(θ)\tilde{J}(\theta)J~(θ)是J(θ)J(\theta)J(θ)的等效代理目标函数。
注意到 J~(θ)\tilde{J}(\theta)J~(θ) 可以很容易通过已有样本计算得到, 相较于原始目标J(θ)J(\theta)J(θ), 无疑更适配当前的AI训练架构。