当前位置: 首页 > news >正文

大模型简明八股——FFN, Residual Addition, LN

(更好的阅读体验参考小红书同名)

 

FFN, Residual Addition, LN

1 三个模块的作用

1.1 FFN(Feed Forward Network,前馈层)

为什么有了 Attention 还需要 FFN

FFN 为什么先升维再降维

1.2 Add (Residual Connection,残差连接)

残差连接为什么能缓解梯度消失?

残差连接为什么有助于训练深层网络?

1.3 LN (Layer Norm,层归一化)

2 Norm

2.1 LayerNorm

LayerNorm 为什么不用 BatchNorm

2.2 RMSNorm

2.3 Pre-Norm & Post-Norm

3 激活函数

Sigmoid

Tanh

ReLU

Softmax

Swish

SwiGLU

GELU

讲完这部分,模型篇还有一部分内容没讲完。接下来会讲一下目前面试最重要最灵活的后训练,学习路线参考《大模型学习路线(三)后训练Post-training》。

1 三个模块的作用

1.1 FFN(Feed Forward Network,前馈层)

过了MHA之后,tokens只是互相查看了一下信息,但是还没思考他们从其他token那里发现了什么。所以当token通过MHA把信息聚集起来之后,再通过前馈网络独立的去思考学习这些信息,简而言之就是交流加计算。

为什么有了 Attention 还需要 FFN

Attention 负责 token 之间的信息交互,让每个 token 看见上下文;FFN 负责对聚合后的信息做进一步非线性变换,提升表达能力

此外,Attention只对权重做softmax,本质上是输入的加权线性组合。FFN 中的激活函数提供了真正的非线性变换

FFN 为什么先升维再降维

FFN 本质上是在每个 token 上做一次逐位置的非线性映射,通常采用“升维 - 激活 - 降维”的结构,中间维度一般设为 d_model 的 4 倍。

先升维是为了把特征映射到更大的空间里,增强非线性表达能力;再降维是为了把维度还原回 d_model,方便做残差连接,同时控制参数量和计算量。

1.2 Add (Residual Connection,残差连接)

在Transformer架构中,残差连接(Residual Connection)是一种至关重要的技术,其核心目的是为了解决深度网络训练中的梯度消失和模型退化问题。它的实现方式是将一个模块(如自注意力层或前馈网络层)的输入x,直接加到该模块的输出F(x)上,形成F(x) + x的结构。这种“跳层”结构创建了一条梯度回传的“高速公路”,使得梯度可以绕过非线性变换层直接向后传播,保证了即使在堆叠了数十个Block的深度模型中,底层网络依然能接收到有效的更新信号。同时,它也让网络更容易学习恒等映射,极大地稳定了训练过程,使得构建非常深、表达能力更强的Transformer成为可能。

残差连接为什么能缓解梯度消失?

先看形式:残差连接是 y = x + F(x)

反向传播时,对 x 的梯度会变成:dy/dx = 1 + dF(x)/dx

关键就在这个 1。

因为哪怕 F(x) 这条支路里的梯度变得很小,梯度仍然可以通过 x -> y 这条恒等路径直接传回去,不会像普通深层网络那样,一层一层连乘后越来越小。

所以更直白地说:

残差连接相当于给梯度开了一条“直通车道”,即使非线性变换那条路不好走,梯度也还能沿着恒等映射传回去,因此能缓解梯度消失。

残差连接为什么有助于训练深层网络?

深层网络难训练,不只是因为梯度问题,还因为层数越深,优化越难。

如果没有残差连接,每一层都要学一个完整的新映射;

有了残差连接后,每一层只需要学:F(x) = 目标输出 - 输入

也就是“在原输入基础上改一点点”就行。

这样有两个好处:

  • 如果某一层暂时学不到有用东西,它至少可以让 F(x) ≈ 0,整个层退化成近似恒等映射,不会明显拖后腿。
  • 每层学的是“增量”,而不是“从零重构全部表示”,优化难度更低。

所以更本质地说:残差连接让深层网络更容易优化,因为每层学的是对输入的修正,而不是完整重建。

1.3 LN (Layer Norm,层归一化)

在Transformer架构中,层归一化(Layer Normalization, LN)是一种关键的稳定技术,它与残差连接相辅相成,主要用于平滑训练过程并加速模型收敛。与按批次(Batch)计算统计量的批归一化(BN)不同,LN在单个训练样本内部对该样本所有特征(即d_model维度)计算均值和方差来进行归一化。这种独立于批次大小的特性使其非常适合处理长度可变的序列数据。通过在每个子层(如自注意力或前馈网络)的输入处应用LN,可以确保数据始终保持在稳定且易于处理的分布范围内,从而让信息在深度网络中更顺畅地流动。加速模型收敛,缓解梯度消失和爆炸问题。

2 Norm

2.1 LayerNorm

对每个样本的所有特征做归一化,消除了不同样本间的大小关系,但是保留了一个样本内不同特征之间的大小关系

符号定义:

  • x: 输入张量,形状为 [b, l, d] (批量大小, 序列长度, 嵌入维度)
  • γ (gamma): 可学习的缩放参数,形状为 [d]
  • β (beta): 可学习的偏移参数,形状为 [d]
  • ε (epsilon): 一个极小的常数(如 1e-5),用于防止除以零

计算过程

对于输入的张量 x,层归一化独立地作用于 b * l 个 d 维向量中的每一个。以下是针对其中任意一个 d 维向量的计算步骤:

第1步:计算均值 (μ)

计算该向量内所有 d 个元素的均值。

  • 操作: mean = x.mean(dim=-1, keepdim=True)
  • 说明: 沿最后一个维度(特征维度 d)求均值。keepdim=True 使得输出张量的维度保持不变,只是该维度的大小变为1,这对于后续的广播计算至关重要。
  • mean 的形状: [b, l, 1]

第2步:计算方差 (σ²)

计算该向量内所有 d 个元素的方差。

  • 操作: variance = ((x - mean) ** 2).mean(dim=-1, keepdim=True)
  • 说明: 首先计算每个元素与均值的差的平方,然后再次沿特征维度 d 求均值。
  • variance 的形状: [b, l, 1]

第3步:执行归一化

用上面得到的均值和方差来归一化原始输入 x。

  • 操作: x_normalized = (x - mean) / torch.sqrt(variance + epsilon)
  • 说明: 在进行减法和除法时,mean 和 variance(形状为 [b, l, 1])会自动**广播(broadcast)**到与 x(形状为 [b, l, d])相同的形状。
  • x_normalized 的形状: [b, l, d]

第4步:缩放与偏移 (仿射变换)

将归一化后的结果乘以可学习的缩放参数 γ 并加上偏移参数 β。

  • 操作: output = x_normalized * gamma + beta
  • 说明: 参数 gamma 和 beta(形状为 [d])同样会自动广播,以匹配 x_normalized(形状为 [b, l, d])的形状,对每一个特征维度进行独立的缩放和偏移。
  • output 的形状: [b, l, d]

最终,输出张量的形状与输入张量的形状完全相同,但其数据分布在最后一个维度上已经被重新规范化,使得训练过程更加稳定。

代码

Python
class SimpleLayerNorm(nn.Module):
def __init__(self, embed_size):
super().__init__()

self.H = embed_size
self.beta = nn.Parameter(torch.zeros(embed_size))
self.gamma = nn.Parameter(torch.ones(embed_size))
self.eps = 1e-5

def forward(self, x):
# x: [B, L, H]

mean = x.mean(dim=-1, keepdim=True)
var = x.var(dim=-1, keepdim=True)
x = (x - mean) / torch.sqrt(var + self.eps)
x = x * self.gamma + self.beta
return x

LayerNorm 为什么不用 BatchNorm

BN 依赖 batch 统计量,不适合变长序列、小 batch 和自回归生成;LN 只依赖当前样本自身统计量,所以更适合 Transformer。

2.2 RMSNorm

RMSNorm (Root Mean Square Normalization) 是对层归一化(LayerNorm)的一种简化,它通过移除均值中心化的步骤,仅使用均方根(Root Mean Square)对输入进行缩放,从而在保持相当性能的同时显著提升了计算效率。

计算过程

同样,我们从一个尺寸为 [b, l, d] 的输入张量开始。RMSNorm的计算过程比LayerNorm更简单。

符号定义:

  • x: 输入张量,形状为 [b, l, d] (批量大小, 序列长度, 嵌入维度)
  • γ (gamma): 可学习的缩放参数,形状为 [d]
  • ε (epsilon): 一个极小的常数(如 1e-5),用于防止除以零

第1步:计算均方值 (Mean Square)

这是计算均方根的第一部分。我们计算每个词元向量(最后一个维度 d)中所有元素的平方的均值

  • 操作: mean_square = (x.pow(2)).mean(dim=-1, keepdim=True)
  • 说明: 先对x中的所有元素求平方,然后沿特征维度 d 求均值。
  • mean_square 的形状: [b, l, 1]

第2步:通过均方根(RMS)进行归一化

将原始输入 x 直接除以它的均方根。

  • 操作: x_normalized = x / torch.sqrt(mean_square + epsilon)
  • 说明: 这里没有减去均值的步骤,这是与LayerNorm最核心的区别。torch.sqrt(mean_square + epsilon) 就是均方根(RMS)。
  • x_normalized 的形状: [b, l, d]

第3步:缩放

将归一化后的结果乘以可学习的缩放参数 γ。标准的RMSNorm通常不使用偏置参数 β。

  • 操作: output = x_normalized * gamma
  • 说明: 可学习参数 gamma(形状为 [d])会自动广播,对归一化后的向量进行重新缩放。
  • output 的形状: [b, l, d]

总结来说,RMSNorm通过省去计算和减去均值的操作,减少了约25%-40%的计算时间,使其成为Llama等现代大型语言模型中非常受欢迎的归一化选择。

代码

Python
class SimpleRMSNorm(nn.Module):
def __init__(self, embed_size):
super().__init__()

self.H = embed_size
self.gamma = nn.Parameter(torch.ones(embed_size))
self.eps = 1e-5

def forward(self, x):
# x: [B, L, H]

norm = torch.sqrt(torch.mean(x**2, dim=-1, keepdim=True))
x = x / (norm + self.eps)
x = x * self.gamma

return x

2.3 Pre-Norm & Post-Norm

在Transformer中,层归一化(LayerNorm)的放置位置看似微小,实则深刻影响着模型的训练动态与最终性能。其核心差异在于训练稳定性模型性能潜力之间的权衡。

  1. 核心机制的差异
  • Post-Norm (LayerNorm(x + F(x))): 它将子模块的输出F(x)与输入x相加后,再进行归一化。这种方式对整个输出进行了规范,被认为有更强的正则化效果。通过“削弱”恒等分支(x)的权重,它能更突出子模块学到的新知识 (F(x)),因此在成功训练后,其最终性能的上限可能更高
  • Pre-Norm (x + F(LayerNorm(x))): 它在子模块计算前就对输入x进行归一化。这种设计的最大优势在于,它为梯度保留了一条纯净的、未经任何操作的残差“高速公路” (+ x部分)。这可以极有效地防止梯度爆炸或消失,使得非常深的网络也能获得出色的训练稳定性
  1. 训练动态与挑战
  • Post-Norm的挑战:不稳定

其不稳定性主要源于梯度消失/爆炸风险。由于每一层的输出在归一化前都有可能发生尺度上的累积变化,导致训练对初始化和学习率非常敏感,深层模型很容易训练失败。

  • Pre-Norm的挑战:初期学习慢

由于残差“高速公路”在训练初期过于强大,子模块的随机初始化输出相比之下影响微弱,导致模型学习缓慢。因此,Pre-Norm通常需要一个学习率热身(Warmup)阶段,给子模块足够的时间来“追赶”上主干道的影响,开始进行有效学习。

  1. 关于“有效深度”的思考

有一种观点认为,Pre-Norm虽然训练稳定,但其“有效深度”可能不如Post-Norm。因为Pre-Norm的纯净残差路径在一定程度上削弱了每层变换的强度,一个L层的Pre-Norm模型,其学到的特征变换复杂度可能只相当于一个层数更少的Post-Norm模型,这或许是其最终效果有时稍逊一筹的原因。

结论

  1. Post-Norm (原始方案):
  • 训练稳定性: 较差,训练难度高。
  • 最终性能: 潜力更高,上限可能更好。
  • 核心优势: 具有更强的正则化效果。
  1. Pre-Norm (主流方案):
  • 训练稳定性: 很好,训练过程稳定且容易。
  • 最终性能: 可能略有牺牲,上限可能稍低。
  • 核心优势: 拥有优异的梯度流,能稳定训练深度网络。

总而言之,Pre-Norm因其出色的训练稳定性,已成为构建当今超深度大型语言模型的主流选择;而Post-Norm则像一把需要高超技巧才能驾驭的利剑,虽然潜力巨大,但训练门槛也更高。

3 激活函数

Sigmoid

 

缺点:

  1. 输入较大或较小时梯度接近于0,容易导致梯度消失
  2. 函数输出不以0为中心,梯度可能向特定方向移动,从而降低权重更新的效率
  3. sigmoid函数执行指数运算,计算机运行得较慢,比较消耗计算资源

Tanh

优点:tanh是“0为中心”的。

缺点:

  1. 仍然存在梯度饱和的问题
  2. 依然进行的是指数运算

ReLU

优点:

  1. 解决了梯度消失的问题,输入值为正时,神经元不会饱和
  2. ReLU线性、非饱和,在SGD中能够快速收敛
  3. 计算复杂度低,无需指数运算

缺点:

  1. 输出不是以0为中心的
  2. Dead ReLU问题。当输入为负时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有响应,导致相应参数永远不会被更新

Softmax

softmax函数常在神经网络输出层充当激活函数,将输出层的值映射到0-1区间,将神经元输出构造成概率分布,用于多分类问题中。softmax激活函数映射值越大,则真实类别可能性越大。

Swish

  • 当 时,swish接近线性函数
  • 当 时,swish接近ReLU
  • 当 时,swish等价于SiLU

swish的优点在于其对负值的输入有一定的激活。

Swish可以看作是ReLU的升级版,它保留了ReLU的优点,同时修复了它的一些关键缺陷。

首先,Swish的函数曲线是平滑的,不像ReLU在零点有个急转弯,这让模型在训练时更新参数的过程更加稳定。

其次,对于负数输入,它会给出一个微小的负值并趋于一个下限,而不是像ReLU那样一律“杀死”为零。这有两个好处:一是能让模型学习到更丰富的特征,二是能忽略大的负向噪声,让模型更加“健-壮”。

同时,它也保留了ReLU对正数不设上限的优点,能让有用的强信号顺利通过,有效避免了梯度消失问题。

总而言之,Swish通过这些精巧的改进,在许多任务上的实际表现都比ReLU更好。

SwiGLU

其中:

  • :逐元素乘法(Hadamard 积)。
  • 和 是权重矩阵。
  • 是输入向量。

SwiGLU 的好处:

  1. 门控机制: 相比传统的 FFN,SwiGLU 引入了额外的线性变换 作为门控。这种结构极大地增强了模型的表达能力(Expression Power)。
  2. 更优的经验表现: 在大模型(如 Llama 2/3, Mistral)中,实验证明 SwiGLU 比 GELU 或 ReLU 具有更高的训练效率和下游任务精度。
  3. 梯度特性: 结合了 Swish 的非单调性和 GLU 的双线性特性,使得模型在处理长序列和复杂特征时,梯度流动更加健康,减少梯度消失或爆炸。

GELU

GELU 的好处:

  1. 平滑非线性: 不同于 ReLU 在 0 处的硬截断,GELU 处处可导,提供更平滑的梯度,有助于深度网络的收敛。
  2. 保留负值信息: 在 区域,GELU 并不是完全置零,而是以概率形式保留部分负值信息,能有效缓解“神经元死亡”问题。
  3. 符合概率分布: 它将激活与正则化(Dropout 的思想)结合,根据输入的幅值自动调节因子的权重,在视觉(ViT)和语言(BERT/GPT)任务中表现稳定。
http://www.jsqmd.com/news/657458/

相关文章:

  • 知识图谱+LLM:解锁数据价值的黄金组合,企业智能决策的必经之路!
  • OpenVINO模型量化指南:从FP32到INT8的性能提升实测与避坑经验分享
  • SukiUI深度解析:如何为AvaloniaUI构建现代化桌面应用界面
  • 2026中国AI CRM选型全攻略:四大维度看清谁是真AI原生
  • 2999基于单片机的四字语音播放器设计
  • 前端开发者学 .NET:零基础到部署上线
  • 从程序员到AI大模型专家:一份超全转行攻略与学习资源大放送!
  • OCR数据集全攻略:从COCO-TEXT到SCUT-CTW1500,如何选择适合你的语言识别任务
  • PLL锁相环中的locked信号:如何用它实现可靠的系统复位(附Verilog代码示例)
  • 【笔试真题】- 阿里系列-2026.04.15-算法岗
  • 夸克如何永久免费扩容+领取1T空间容量教程
  • 【大厂内部未公开】智能代码生成Context理解失效诊断手册:覆盖IDE插件、CI流水线、PR辅助三大高危场景
  • OpenClaw v2026.4.15 深度解读剖析:从“工程极致”到“感知智能”与“可控韧性”的范式跃迁
  • 2026 年优质书法培训推荐榜:汲古堂书法高考培训领衔,聚焦书法统考、书法校考、书法高考培训精品机构 - 海棠依旧大
  • Ubuntu Server无桌面环境,如何搞定校园网深澜(Srun)认证?一个命令行工具全搞定
  • AI写代码不再“耍花招”:7步将GitHub Copilot深度嵌入CI/CD流水线(含Jenkins+GitLab CI实测配置清单)
  • 医学影像AI进阶:如何用UNet3+的‘全尺度’思想优化你的分割模型?不止于肝脏和脾脏
  • GEE实战:基于哨兵2号SR数据的地表反射率年度合成与批量导出
  • 2026届学术党必备的十大AI写作网站横评
  • BilibiliDown:终极B站视频下载解决方案,轻松获取高清资源
  • 特斯拉AI5芯片流片成功同步启动Dojo3研发;特斯拉面临最高百亿美元诉讼风险多项法律纠纷待解决;三大芯片巨头注资推进端到端自动驾驶技术
  • 告别调参!用MVSAnywhere零样本搞定室内外三维重建,保姆级环境配置与避坑指南
  • AD7705数据跳得厉害?从硬件布线到软件滤波的完整稳定性实战指南
  • 从提示词工程到Harness Engineering,3分钟彻底搞懂!
  • 开启AI专著撰写新时代!揭秘高效工具,让专著写作快人一步
  • 直接撸代码才是硬道理!搞工控的都懂,IO监控画面最烦的就是一个个按钮指示灯拖到画面上。今天分享个骚操作——用下拉菜单+SCL动态绑定,直接一页搞定所有IO监控
  • 当AI能写SQL时,数据库表设计反而成了最后一道护城河
  • C4模型实战:从系统上下文到代码视图的架构设计指南
  • 从蓝牙到5G:一文搞懂日常无线技术背后的频率秘密(附实用对照表)
  • 全面解析吉客云和金蝶云星空的高效数据集成方案