手推公式之“层归一化”梯度

昨天推导了一下交叉熵的反向传播梯度,今天再来推导一下层归一化(LayerNorm),这是一种常见的归一化方法。

前向传播

假设待归一化的

m维向量为
x,均值和标准差分别是
\mu{(x)}
\sigma{(x)},LayerNorm的参数是
w
b,那么层归一化后的输出为:

y = w \odot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + b \\

这里的极小量

\epsilon是为了防止标准差为0导致溢出。为了简单起见,我们不加上这一项,原公式也就变成了:

y = w \odot \frac{x - \mu}{\sigma} + b \\

反向传播

假设损失函数

\mathcal{L}对输出
y的梯度是
\frac{\partial{\mathcal{L}}}{\partial{y}},那么这里需要求三个梯度:
\frac{\partial{\mathcal{L}}}{\partial{w}}
\frac{\partial{\mathcal{L}}}{\partial{b}}
\frac{\partial{\mathcal{L}}}{\partial{x}}

\hat x = \frac{x - \mu}{\sigma},那么原公式就变成了:

y = w \odot \hat x + b \\

两个参数的梯度非常简单:

\begin{aligned} \frac{\partial{\mathcal{L}}}{\partial{w_i}} &= \frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot \frac{\partial{\mathcal{y_i}}}{\partial{w_i}} = \frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot \hat x_i \\\ \frac{\partial{\mathcal{L}}}{\partial{b_i}} &= \frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot \frac{\partial{\mathcal{y_i}}}{\partial{b_i}} = \frac{\partial{\mathcal{L}}}{\partial{y_i}} \end{aligned} \\

对输入

x的梯度等于:

\frac{\partial{\mathcal{L}}}{\partial{x_i}} = \frac{1}{\sigma} \cdot \left[\frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot w_i - \frac{1}{m}\cdot \left( \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j} + \hat x_i \cdot \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \hat x_j}\right)\right] \\

推导过程

对输入

x的梯度可以写成:

\begin{aligned} \frac{\partial{\mathcal{L}}}{\partial{x_i}} &= \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot \frac{\partial{\mathcal{y_j}}}{\partial{\hat x_j}}} \cdot \frac{\partial{\mathcal{\hat x_j}}}{\partial{x_i}} \\\ &= \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \frac{\partial{\mathcal{\hat x_j}}}{\partial{x_i}}} \end{aligned} \\

这里只需要计算最后一项就行了:

\begin{aligned} \frac{\partial{\mathcal{\hat x_j}}}{\partial{x_i}} &= \frac{\partial}{\partial{x_i}}\left(\frac{x_j - \mu}{\sigma}\right) \\\ &= \frac{\partial{(x_j - \mu)}}{\partial x_i} \cdot \sigma^{-1} + (x_j - \mu) \cdot \frac{\partial\sigma}{\partial x_i} \cdot (-\sigma^{-2}) \\\ &= \left(\delta_{ij} - \frac{\partial{\mu}}{\partial x_i}\right) \cdot \sigma^{-1} - \sigma^{-2} \cdot (x_j - \mu) \cdot \frac{\partial\sigma}{\partial x_i} \end{aligned} \\

其中

\delta_{ij}只有当
i=j的时候才会等于1,否则都等于0。这里只需要求出均值和标准差对
x_i的梯度就行了。直接给出结论,证明比较简单,放在了文末:

\begin{aligned} \frac{\partial \mu}{\partial x_i} &= \frac{1}{m} \\\ \frac{\partial \sigma}{\partial x_i} &= \frac{1}{m} \cdot \sigma^{-1} \cdot (x_i - \mu) \end{aligned} \\

代入可以得到:

\begin{aligned} \frac{\partial{\mathcal{\hat x_j}}}{\partial{x_i}} &= \left(\delta_{ij} - \frac{\partial{\mu}}{\partial x_i}\right) \cdot \sigma^{-1} - \sigma^{-2} \cdot (x_j - \mu) \cdot \frac{\partial\sigma}{\partial x_i} \\\ &= \left(\delta_{ij} - \frac{1}{m}\right) \cdot \sigma^{-1} - \sigma^{-2} \cdot (x_j - \mu) \cdot \frac{1}{m} \cdot \sigma^{-1} \cdot (x_i - \mu) \\\ &= \sigma^{-1} \cdot \delta_{ij} - \frac{1}{m} \cdot \sigma^{-1} - \frac{1}{m} \cdot \sigma^{-3} \cdot (x_i - \mu) \cdot (x_j - \mu) \\\ &=  \sigma^{-1} \cdot \delta_{ij} - \frac{1}{m} \cdot \sigma^{-1} - \frac{1}{m} \cdot \sigma^{-1} \cdot {\hat x_i} \cdot {\hat x_j} \end{aligned} \\

最后带入梯度

\frac{\partial{\mathcal{L}}}{\partial{x_i}}中可以得到:

\begin{aligned} \frac{\partial{\mathcal{L}}}{\partial{x_i}} &= \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \frac{\partial{\mathcal{\hat x_j}}}{\partial{x_i}}} \\\ &= \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \left(\sigma^{-1} \cdot \delta_{ij} - \frac{1}{m} \cdot \sigma^{-1} - \frac{1}{m} \cdot \sigma^{-1} \cdot {\hat x_i} \cdot {\hat x_j}\right)} \\\ &= \frac{1}{\sigma} \cdot \frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot w_i - \frac{1}{m \sigma} \cdot \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j} - \frac{\hat x_i}{m \sigma} \cdot \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \hat x_j} \\\ &= \frac{1}{\sigma} \cdot \left[\frac{\partial{\mathcal{L}}}{\partial{y_i}} \cdot w_i - \frac{1}{m}\cdot \left( \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j} + \hat x_i \cdot \sum_j {\frac{\partial{\mathcal{L}}}{\partial{y_j}} \cdot w_j \cdot \hat x_j}\right)\right] \end{aligned} \\

均值和标准差的梯度

均值的梯度为:

\begin{aligned} \frac{\partial \mu}{\partial x_i} &= \frac{\partial}{\partial x_i} \left(\frac{1}{m} \cdot \sum_j{x_j}\right) \\\ &= \frac{1}{m} \end{aligned} \\

标准差的计算公式可以写成

\sigma = \left[\mu(x^2) - \mu^2(x)\right]^{\frac{1}{2}},所以梯度为:

\begin{aligned} \frac{\partial \sigma}{\partial x_i} &=  \frac{\partial}{\partial x_i} \left[\mu(x^2) - \mu^2(x)\right]^{\frac{1}{2}} \\\ &= \frac{1}{2} \cdot \left[\mu(x^2) - \mu^2(x)\right]^{-\frac{1}{2}} \cdot \left(\frac{2}{m} \cdot x_i - \frac{2}{m} \cdot \mu \right) \\\ &= \frac{1}{m} \cdot \sigma^{-1} \cdot (x_i - \mu) \end{aligned} \\
<think>嗯,用户现在问的是面试官如果问反向传播算法该怎么回答。之前他们问过数据库索引为什么能提高查询速度,我给了比较结构化的四点,现在这个反向传播算法可能也需要类似的逻辑。首先,我需要确定用户的需求,他们可能是在准备面试,需要简明扼要地解释反向传播,同时展示深度,所以需要涵盖原理、步骤、优化、常见问题等。 反向传播算法的核心是链式法则和梯度下降,我得先讲清楚这个基本概念。然后可能需要分步骤说明,比如前向传播、计算损失、反向梯度等。用户可能希望了解为什么反向传播有效,以及其中的数学推导,但面试中可能不需要太复杂的公式,所以需要平衡理论和直观解释。 另外,用户可能还想知道实际应用中的技巧,比如梯度消失、爆炸问题,以及优化方法如Adam。这些属于进阶内容,但面试中常被问到,所以应该包括进去。还有,反向传播的优缺点,可能也是面试官关注的,比如计算效率高但可能陷入局部最优。 需要对比之前的回答结构,保持一致性,比如分点、层次,可能用加粗标题,代码示例或者数学公式。不过用户提到系统级指令要求行内数学表达式用$...$,独立公式用$$...$$,需要注意格式正确。另外要使用中文,避免术语混淆。 可能还需要考虑常见的面试问题,比如解释链式法则在反向传播中的作用,或者手推一个简单网络的梯度。这时候可以举例说明,比如用简单的神经网络结构,计算某个权重更新的过程,这样更具体。 总结一下,回答的结构应该是:核心思想、步骤详解、优化策略、常见问题、代码示例、优缺点、面试技巧。这样既全面又有条理,帮助用户应对不同深度的面试问题。</think>以下是针对面试场景的反向传播算法解析框架,按技术深度递进组织,建议根据面试官追问方向选择性展开: --- ### **Level 1:核心思想直击本质(30秒回答)** **定义**:反向传播是通过链式法则计算神经网络损失函数对参数的梯度,实现误差从输出层向输入层的逆向传播 **核心公式**: $$\frac{\partial L}{\partial w_{ij}^{(l)}} = \frac{\partial L}{\partial z_j^{(l+1)}} \cdot \frac{\partial z_j^{(l+1)}}{\partial w_{ij}^{(l)}}$$ **关键点**: - 链式法则逐层计算梯度 - 梯度下降更新参数:$w = w - \eta \cdot \nabla_w L$ - 计算图的高效复用(避免重复计算) --- ### **Level 2:步骤拆解+代码辅助(2分钟标准答案)** **三步核心流程**: 1. **前向传播**:计算各层输出 ```python z = x.dot(W1) + b1 a = sigmoid(z) # 激活函数 ``` 2. **损失计算**:输出层误差 $$L = \frac{1}{2}||y_{pred} - y_{true}||^2$$ 3. **反向传播**: - 输出梯度:$\delta^{(L)} = (y_{pred} - y_{true}) \odot \sigma'(z^{(L)})$ - 隐藏层梯度:$\delta^{(l)} = (W^{(l)T}\delta^{(l+1)}) \odot \sigma'(z^{(l)})$ - 参数梯度:$\frac{\partial L}{\partial W^{(l)}} = a^{(l-1)}\delta^{(l)T}$ --- ### **Level 3:深度优化策略(进阶展示)** 1. **梯度计算优化**: - 自动微分(Autograd)实现 - 矩阵运算并行加速(GPU优化) 2. **梯度问题处理**: - 梯度裁剪:`torch.nn.utils.clip_grad_norm_` - 归一化层缓解梯度消失 3. **二阶优化方法**: ```python # Adam优化器示例 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` --- ### **Level 4:高频追问点准备** 1. **梯度消失/爆炸的数学解释**: $$\prod_{k=l}^{L-1} W^{(k)} \odot \sigma'(z^{(k)})$$ 权重矩阵连乘导致指数级变化 2. **ReLU如何缓解梯度消失**: $$\frac{\partial ReLU(z)}{\partial z} = \begin{cases} 1 & z > 0 \\ 0 & \text{otherwise} \end{cases}$$ 避免sigmoid的梯度衰减 3. **与Hinton的对比散度算法区别**: | | 反向传播 | 对比散度 | |----------|----------|----------| | 适用场景 | 监督学习 | 无监督学习 | | 优化目标 | 损失函数 | 能量函数 | | 计算方式 | 精确梯度 | 近似梯度 | --- **面试技巧提示**: - 手写推导建议准备3层全连接网络的权重更新过程 - 解释计算图时可用简单例子:$f(x,y) = x + y \cdot \sin(x)$ - 强调反向传播的时间复杂度是$O(N)$(与参数数量线性相关) 掌握这个框架后,你可以根据面试时间灵活组合回答层次,建议重点准备Level 2+Level 4的组合应对技术面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法码上来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值