
很多刚接触大模型微调、模型结构分析、推理优化的同学,第一眼看到 Transformer、FFN 前馈网络、SwiGLU、GELU、ReLU 这些名词都会觉得很抽象。大家普遍只知道注意力机制是大模型灵魂,却不知道激活函数才是决定模型深浅、长文本效果、梯度会不会消失、能不能叠几十上百层的关键底层组件。
不管是Qwen系列、ChatGLM2、ChatGLM3等几乎所有国产主流大模型,底层FFN结构都在疯狂迭代激活函数。从最早ReLU,到GELU,再到GLM2专用Gated GELU,GLM3、Qwen全面升级SwiGLU,每一次激活函数改动,都直接改变长文本理解、深层语义保留、训练收敛速度、显存占用、推理稳定性。
今天我们结合ChatGLM2-6B、ChatGLM3-6B两个模型,从基础完整理清大模型激活函数的核心知识,仔细的分析模型结构打印结果,手动复现FFN完整运算,一眼分清不同大模型激活优劣差异。

神经网络本质是无数线性矩阵乘法堆叠而成,如果全程只做线性运算,无论堆叠多少层网络,最终整体依然等价于单层线性变换。线性网络无法拟合复杂语义、上下文关联、逻辑推理、长文本依赖等高维非线性特征,完全无法胜任大语言模型任务。
激活函数,就是插入在线性变换之间的非线性数学函数,它给神经网络引入非线性表达能力,让几十层、上百层 Transformer 堆叠有效,让大模型可以学习人类语言复杂逻辑、上下文关联、语义抽象、知识记忆。
简单直白理解:
大语言模型Transformer结构里,注意力层负责上下文关联,FFN前馈神经网络全权负责语义特征变换、信息提炼、知识存储,而FFN性能100%由激活函数决定。
普通CV图像模型激活函数选择很宽松,但千亿级、百亿级大语言长文本模型,对激活函数有极高硬性标准:
早期ReLU、Sigmoid、Tanh完全无法满足大长文本大深度模型需求,因此大模型行业才一步步迭代出GELU、Gated GELU、SwiGLU三代主流激活方案。

相信大家刚开始也是,初一看gate、门控就觉得高深,其实门控 = 智能开关 + 权重调节阀,没有任何玄学,通俗理解大模型门控机制:信息开关,语义筛选阀门。
一句话本质定义:
门控就是Transformer FFN内部,自动给每个词语特征分配权重大小。
用生活最好懂类比:
我们看一段长句子:今天天气很好,我打算出门去公园散步晒太阳
就像家里灯光开关:
大模型FFN门控工作完整逻辑:
门控的核心作用:
ReLU/GELU vs Gated GELU/SwiGLU核心区别:
1.1 公式定义
ReLU(x)=max(0,x)
输入大于0,原样输出;输入小于等于0,直接输出0。
1.2 函数特性
1.3 大模型应用缺点
神经元死亡现象: 负数输入长期梯度为0,权重永远不再更新,神经元彻底报废。Transformer深层堆叠后,大量FFN神经元失效,模型知识残缺、表达能力暴跌。
无法表达负向语义: 自然语言有否定、转折、反向逻辑,ReLU完全压制负特征,不适合语言建模。
非线性能力极弱: 本质分段线性,多层叠加依然近似线性,无法拟合复杂长文本逻辑、因果推理。
梯度分布极不稳定: 深层堆叠容易梯度爆炸,训练震荡剧烈,千亿大模型几乎无法稳定收敛。
量化效果极差: 正负分布极端不均匀,INT4/INT8量化精度断崖式下跌,不适合落地部署。
1.4 适用场景
图像CNN小模型、浅层神经网络,完全不适合Transformer大语言模型。
1.5 直观图示

编辑
重点说明:
2.1 公式定义
GELU(x) = x ⋅ Φ(x)
Φ(x)是高斯正态分布累积概率函数,通俗理解:ReLU平滑概率版。
2.2 函数特性
2.3 大模型应用短板
2.4 适用场景
BERT、小参数量对话模型、百亿参数以内Transformer,千亿模型全面淘汰。
2.5 直观图示


编辑
重点说明:
3.1 基础构成
SwiGLU = Swish门控 + GLU线性门控单元
不是单一激活函数,是双支路FFN结构 + 门控非线性组合架构。
标准计算流程:
公式简化:
SwiGLU(x)=(xW1)⋅SiLU(xW2)
3.2 核心函数特性
3.3 大模型专属优势
3.4 适用场景
所有Decoder大模型、千亿、万亿参数大模型、MoE稀疏大模型、长上下文模型、私有化微调、云端 + 边缘全场景部署。
3.5 直观图示


编辑
重点说明:
ReLU:简单快、稀疏强,但易死神经元、非线性差、不适合大语言 GELU:平滑稳定、适配BERT,但表达上限低、推理慢、不适合千亿深层模型 SwiGLU:门控高阶非线性、训练稳、显存省、推理快、量化好、适配MoE,全方位碾压前两者


编辑
普通GELU只是单支路非线性变换,Transformer层数加深、文本长度加长后,FFN无法自主筛选关键语义。大模型需要一条支路控制信息强弱,一条支路传递原始特征,门控加权融合,这就是Gated门控FFN结构诞生原因。
ChatGLM2-6B是国内首个大规模采用Gated GELU门控 FFN的主流对话大模型,彻底改变单支路激活模式。


编辑
整个过程不是简单激活,而是门控自适应语义加权,比普通GELU表达能力翻倍,深层梯度衰减大幅缓解。
from transformers import AutoModel, AutoTokenizer
import torch
import torch.nn.functional as F
import warnings
warnings.filterwarnings("ignore")
# 你的本地模型路径
model_path = "/home/model/ZhipuAI/chatglm2-6b/"
# 加载模型
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model.eval()
# ========== 1. 查看 ChatGLM2 第一层FFN结构 ==========
# ChatGLM2结构: model.transformer.encoder.layers[0].mlp
encoder_layers = model.transformer.encoder.layers
mlp_layer = encoder_layers[0].mlp
print("=== ChatGLM2-6B 原生FFN结构 ===")
print(mlp_layer)
# ========== 2. 手动复现 ChatGLM2 真实前向计算 ==========
# ChatGLM2-6B 使用 Gated GELU:
# dense_h_to_4h 输出 4096→27392(=2×13696),拆为 gate + value 两半
# gate 走 GELU,再与 value 逐元素相乘,最后 dense_4h_to_h 降维回 4096
x = torch.randn(1, 128, 4096).half().cuda()
h1 = mlp_layer.dense_h_to_4h(x) # (1, 128, 27392)
gate, value = h1.chunk(2, dim=-1) # 各 (1, 128, 13696)
act_out = F.gelu(gate) * value # Gated GELU: gelu(gate) ⊙ value
h2 = mlp_layer.dense_4h_to_h(act_out) # (1, 128, 4096)
print("\n输入形状:", x.shape)
print("dense_h_to_4h 升维后:", h1.shape)
print("拆分 gate/value:", gate.shape)
print("Gated GELU 激活后:", act_out.shape)
print("dense_4h_to_h 降维后:", h2.shape)
print("ChatGLM2-6B 使用 Gated GELU(非纯 GELU):gate 半支走 GELU + value 半支线性门控")
# ========== 3. 长文本输入,直观体现GELU梯度衰减缺陷 ==========
long_text = "人工智能大模型技术发展日新月异" * 50
input_ids = tokenizer(long_text, return_tensors="pt").input_ids.cuda()
with torch.no_grad():
out = model(input_ids)
print(f"\n长文本长度:{input_ids.shape[1]}")
print("ChatGLM2-6B FFN = Gated GELU,相比纯 GELU 门控机制能缓解部分梯度衰减,但长文本深层仍存在语义退化")
运行输出:
=== ChatGLM2-6B 原生FFN结构 === MLP( (dense_h_to_4h): Linear(in_features=4096, out_features=27392, bias=False) (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False) ) 输入形状: torch.Size([1, 128, 4096]) dense_h_to_4h 升维后: torch.Size([1, 128, 27392]) 拆分 gate/value: torch.Size([1, 128, 13696]) Gated GELU 激活后: torch.Size([1, 128, 13696]) dense_4h_to_h 降维后: torch.Size([1, 128, 4096]) ChatGLM2-6B 使用 Gated GELU(非纯 GELU):gate 半支走 GELU + value 半支线性门控 长文本长度:403 ChatGLM2-6B FFN = Gated GELU,相比纯 GELU 门控机制能缓解部分梯度衰减,但长文本深层仍存在语义退化
输出分析:
- 1. FFN结构打印解读
MLP( (dense_h_to_4h): Linear(in_features=4096, out_features=27392, bias=False) (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False) )
- 2. 张量形状流程逐行解释
输入形状: torch.Size([1, 128, 4096])
dense_h_to_4h 升维后: torch.Size([1, 128, 27392])
拆分 gate/value: torch.Size([1, 128, 13696])
Gated GELU 激活后: torch.Size([1, 128, 13696])
dense_4h_to_h 降维后: torch.Size([1, 128, 4096])
短板:GELU本身负数区域梯度偏小,超长几千token长文本,深层网络依旧语义丢失,因此智谱后续直接升级为SwiGLU。
SwiGLU=SiLU 激活门控 + GLU 线性门控结构,是目前Qwen、GLM3、LLaMA全系国际国内顶级大模型统一标配FFN激活方案。
SiLU 曲线比 GELU全程梯度更平滑、正负区间响应更均匀、无梯度凹陷区域,长文本几十层叠加后,梯度几乎不衰减,超长上下文语义完整保留。
GLM3沿用GLM2单矩阵升维结构,依旧dense_h_to_4h统一输出,对半拆分gate与value,仅把激活函数从GELU替换为SiLU。
改动极小,但长文本、深层模型效果飞跃式提升。
ChatGLM3-6B相比ChatGLM2-6B的FFN核心变化就是激活从Gated GELU升级为SwiGLU。
from transformers import AutoModel, AutoTokenizer
import torch
import torch.nn.functional as F
import warnings
warnings.filterwarnings("ignore")
# 你的本地模型路径
model_path = "/home/model/ZhipuAI/chatglm3-6b/"
# 加载模型
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
model.eval()
# ========== 1. 查看 ChatGLM3 第一层FFN结构 ==========
# ChatGLM3结构: model.transformer.encoder.layers[0].mlp
encoder_layers = model.transformer.encoder.layers
mlp_layer = encoder_layers[0].mlp
print("=== ChatGLM3-6B 原生FFN结构 ===")
print(mlp_layer)
# ========== 2. 手动复现 ChatGLM3 真实前向计算 ==========
# ChatGLM3-6B 升级为 SwiGLU(对比 ChatGLM2 的 Gated GELU):
# dense_h_to_4h 输出 4096→27392(=2×13696),拆为 gate + value 两半
# gate 走 SiLU,再与 value 逐元素相乘,最后 dense_4h_to_h 降维回 4096
x = torch.randn(1, 128, 4096).half().cuda()
h1 = mlp_layer.dense_h_to_4h(x) # (1, 128, 27392)
gate, value = h1.chunk(2, dim=-1) # 各 (1, 128, 13696)
act_out = F.silu(gate) * value # SwiGLU: silu(gate) ⊙ value
h2 = mlp_layer.dense_4h_to_h(act_out) # (1, 128, 4096)
print("\n输入形状:", x.shape)
print("dense_h_to_4h 升维后:", h1.shape)
print("拆分 gate/value:", gate.shape)
print("SwiGLU 激活后:", act_out.shape)
print("dense_4h_to_h 降维后:", h2.shape)
print("ChatGLM3-6B 升级为 SwiGLU:gate 半支走 SiLU + value 半支线性门控(ChatGLM2 为 Gated GELU)")
# ========== 3. 长文本输入,观察 SwiGLU 深层表现 ==========
long_text = "人工智能大模型技术发展日新月异" * 50
input_ids = tokenizer(long_text, return_tensors="pt").input_ids.cuda()
with torch.no_grad():
out = model(input_ids)
print(f"\n长文本长度:{input_ids.shape[1]}")
print("ChatGLM3-6B FFN 升级为 SwiGLU:SiLU 平滑非单调 + 自门控,深层梯度衰减相比 GELU 显著改善")
运行输出:
=== ChatGLM3-6B 原生FFN结构 === MLP( (dense_h_to_4h): Linear(in_features=4096, out_features=27392, bias=False) (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False) ) 输入形状: torch.Size([1, 128, 4096]) dense_h_to_4h 升维后: torch.Size([1, 128, 27392]) 拆分 gate/value: torch.Size([1, 128, 13696]) SwiGLU 激活后: torch.Size([1, 128, 13696]) dense_4h_to_h 降维后: torch.Size([1, 128, 4096]) ChatGLM3-6B 升级为 SwiGLU:gate 半支走 SiLU + value 半支线性门控(ChatGLM2 为 Gated GELU) 长文本长度:403 ChatGLM3-6B FFN 升级为 SwiGLU:SiLU 平滑非单调 + 自门控,深层梯度衰减相比 GELU 显著改善
输出分析:
- 1. FFN结构解读
MLP( (dense_h_to_4h): Linear(in_features=4096, out_features=27392, bias=False) (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False) )
- 2. 张量流程逐行解释
输入形状: torch.Size([1, 128, 4096])
dense_h_to_4h 升维后: torch.Size([1, 128, 27392])
拆分 gate/value: torch.Size([1, 128, 13696])
硬性对半分割
SwiGLU 激活后: torch.Size([1, 128, 13696])
计算公式:
核心就换了一个激活函数,天差地别
dense_4h_to_h 降维后: torch.Size([1, 128, 4096])
ChatGLM2-6B:
ChatGLM3-6B:
总的来说,学习大模型只看注意力机制,忽略FFN与激活函数,实际上Transformer注意力负责找关系,FFN激活函数负责存储知识、处理语义、支撑深度、支撑长文本。没有优秀激活函数,再强注意力架构也无法做成可用商用大模型。
从ReLU淘汰,到GELU过渡,GLM2 Gated GELU尝试,GLM3、Qwen全面普及SwiGLU,大模型激活函数迭代史,就是国产大模型长文本能力、深层训练能力、落地服务能力不断变强的发展史。
看懂激活函数,才算真正踏入大模型底层架构大门,后续学习模型剪枝、量化推理、结构修改、自定义FFN、模型蒸馏、分布式训练,都会一通百通、豁然开朗。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。