自然语言处理:重要采样的梯度推导

本文详细解析了《DeepLearning》一书12.4.3.3节中,如何通过采样词的子集来避免计算所有未出现词对梯度的贡献,从而加速神经语言模型的训练过程。通过数学推导,展示了如何简化梯度计算,提高模型训练效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于《Deep Learning》一书中12.4.3.3节,公式(12.13)至(12.16)的详细推导过程。
加速神经语言模型训练的一种方式是,避免明确的计算所有未出现在下一位置的词对梯度的贡献。每个不正确的词在此模型下具有低概率。枚举所有这些词的计算成本可能会很高。相反,我们可以仅采样词的子集,梯度的推导过程如下:
∂logP(y∣C)∂θ=∂log softmaxy(a)∂θ=∂∂θlogeay∑ieai=∂∂θ(ay−log∑ieai)=∂ay∂θ−∂∂θlog∑ieai=∂ay∂θ−1∑jeaj∂∂θ∑ieai=∂ay∂θ−1∑jeaj∑i∂eai∂θ=∂ay∂θ−1∑jeaj∑ieai∂ai∂θ=∂ay∂θ−∑ieai∑jeaj∂ai∂θ=∂ay∂θ−∑iP(y=i∣C)∂ai∂θ \begin {aligned} \frac{\partial {\rm log}P(y|C)}{\partial \theta} &= \frac{\partial {\rm log\ softmax}_y(a) }{\partial \theta} \\ &= \frac{\partial}{\partial \theta} {\rm log} \frac{e^{a_y}}{\sum_i{e^{a_i}}}\\ &= \frac{\partial}{\partial \theta}(a_y - {\rm log}\sum_i{e^{a_i}}) \\ &=\frac{\partial a_y}{\partial \theta} -\frac{\partial}{\partial \theta}{\rm log} \sum_i{e^{a_i}}\\ &=\frac{\partial a_y}{\partial \theta} - \frac{1}{\sum_j{e^{a_j}}}\frac{\partial}{\partial \theta}\sum_i{e^{a_i}}\\ &= \frac{\partial a_y}{\partial\theta} - \frac{1}{\sum_j{e^{a_j}}} \sum_i\frac{\partial e^{a_i}}{\partial \theta}\\ &= \frac{\partial a_y}{\partial\theta} - \frac{1}{\sum_j{e^{a_j}}} \sum_i{e^{a_i}}\frac{\partial a_i}{\partial \theta}\\ &= \frac{\partial a_y}{\partial\theta} - \sum_i\frac{e^{a_i}}{\sum_j{e^{a_j}}} \frac{\partial a_i}{\partial \theta}\\ &= \frac{\partial a_y}{\partial\theta} - \sum_i P(y=i|C) \frac{\partial a_i}{\partial \theta} \end {aligned} θlogP(yC)=θlog softmaxy(a)=θlogieaieay=θ(aylogieai)=θayθlogieai=θayjeaj1θieai=θayjeaj1iθeai=θayjeaj1ieaiθai=θayijeajeaiθai=θayiP(y=iC)θai
本文内容编辑:郑杜磊

### 策略梯度定理的数学推导过程 策略梯度定理是强化学习中一种重要的理论基础,其核心在于通过优化参数化的策略 $\pi(a|s, \theta)$ 来最大化期望回报 $J(\theta)$。以下是该定理的具体数学推导过程: #### 定义目标函数 目标函数定义为策略在所有可能轨迹上的期望回报: $$ J(\theta) = \mathbb{E}_{\tau \sim p_{\theta}(\tau)}[R(\tau)] $$ 其中,$\tau$ 是由状态序列、动作序列以及奖励组成的轨迹;$p_\theta(\tau)$ 是在当前策略下生成轨迹的概率分布;$R(\tau)$ 是轨迹的累积奖励。 展开轨迹概率分布可得: $$ p_\theta(\tau) = p(s_0)\prod_t \pi(a_t | s_t, \theta)p(s_{t+1}|s_t,a_t) $$ 因此, $$ J(\theta) = \int p_\theta(\tau) R(\tau)d\tau = \sum_s d^\pi(s) \sum_a q^\pi(s, a) \pi(a|s,\theta), $$ 这里引入了平稳状态分布 $d^\pi(s)$ 和状态-动作价值函数 $q^\pi(s, a)$[^1]。 #### 计算梯度 为了更新策略参数 $\theta$,我们需要计算目标函数相对于 $\theta$ 的梯度: $$ \nabla_\theta J(\theta) = \nabla_\theta \mathbb{E}_{\tau \sim p_\theta(\tau)}[R(\tau)]. $$ 利用积分与微分交换顺序的原则,得到: $$ \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim p_\theta(\tau)}[\nabla_\theta \log p_\theta(\tau) R(\tau)]. $$ 进一步分解轨迹概率分布的对数项: $$ \nabla_\theta \log p_\theta(\tau) = \sum_t \nabla_\theta \log \pi(a_t|s_t,\theta). $$ 代入上式后,最终可以写成: $$ \nabla_\theta J(\theta) = \mathbb{E}_\tau \left[\sum_t \nabla_\theta \log \pi(a_t|s_t,\theta) R(\tau)\right]. $$ 注意到这里的奖励信号 $R(\tau)$ 可能存在高方差问题,为此可以用基线(Baseline)替代原始奖励值,从而降低估计的波动性。具体形式为: $$ \nabla_\theta J(\theta) = \mathbb{E}_\tau \left[\sum_t \nabla_\theta \log \pi(a_t|s_t,\theta)(G_t - b(s_t))\right], $$ 其中 $b(s_t)$ 是任意的状态依赖基线[^2]。 #### 推广到优势函数 更一般的形式会涉及优势函数 $A^\pi(s, a)$,即相对收益的概念。此时梯度表达式变为: $$ \nabla_\theta J(\theta) = \mathbb{E}_{s,a}\left[A^\pi(s, a) \nabla_\theta \log \pi(a|s,\theta)\right]. $$ 这种表示方式不仅能够减少采样噪声,还提供了更加灵活的设计框架[^3]。 ```python import numpy as np def policy_gradient_update(theta, trajectories, gamma=0.99): """ 实现简单的策略梯度更新逻辑。 参数: theta: 当前策略参数向量 trajectories: 收集的一批轨迹数据 [(state, action, reward), ...] gamma: 折扣因子 返回: 更新后的参数向量 """ gradients = [] for trajectory in trajectories: states, actions, rewards = zip(*trajectory) # 计算折扣累计奖励 G_t discounted_rewards = np.zeros_like(rewards, dtype=np.float32) running_add = 0 for t in reversed(range(len(rewards))): running_add = rewards[t] + gamma * running_add discounted_rewards[t] = running_add # 归一化奖励以稳定训练 discounted_rewards -= np.mean(discounted_rewards) discounted_rewards /= np.std(discounted_rewards) # 计算 log π(a|s,θ) 对 θ 的梯度并加权和 gradient_sum = sum( grad_log_pi(states[t], actions[t]) * discounted_rewards[t] for t in range(len(actions)) ) gradients.append(gradient_sum) avg_gradient = np.mean(gradients, axis=0) new_theta = theta + learning_rate * avg_gradient return new_theta ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值