一个反直觉的设计选择
如果你在2018年告诉一个深度学习研究者,未来最先进的大语言模型会删除所有线性层的偏置项,他们可能会觉得你疯了。毕竟,偏置项是神经网络最基础的组成部分之一——从单层感知机到深度卷积网络,几乎每一个神经元的输出都包含一个偏置参数。
然而,到了2024年,LLaMA、PaLM、Mistral等主流大模型无一例外地采用了"无偏置"设计。Google在PaLM论文中甚至明确写道:“在所有稠密核和层归一化中不使用偏置项,我们发现这增加了大模型的训练稳定性。”
这究竟是怎么发生的?一个被视为"必不可少"的参数,为什么在大模型时代变成了累赘?要理解这个转变,我们需要深入探究Transformer架构的本质,以及大模型训练中的独特挑战。
flowchart TD
A[2017: 原始Transformer<br/>使用偏置项] --> B[2018: BERT/GPT-2<br/>延续偏置设计]
B --> C[2020: GPT-3<br/>仍使用偏置]
C --> D[2022: PaLM<br/>首次移除所有偏置]
D --> E[2023: LLaMA<br/>继承无偏置设计]
E --> F[2024: 开源大模型<br/>全面采用无偏置]
style A fill:#e1f5fe
style B fill:#e1f5fe
style C fill:#e1f5fe
style D fill:#c8e6c9
style E fill:#c8e6c9
style F fill:#c8e6c9
偏置项:神经网络的传统基石
在深入讨论之前,让我们先回顾偏置项在传统神经网络中的作用。
数学定义
在最基本的线性层中,输出计算为:
$$y = Wx + b$$其中$W$是权重矩阵,$x$是输入向量,$b$是偏置向量。偏置项允许神经元在没有输入或输入为零时仍然产生非零输出。
这个设计可以追溯到线性回归的截距概念。如果我们把激活函数之前的神经元输出看作一个线性模型,那么偏置项就相当于$y = mx + c$中的$c$——它允许决策边界不经过原点。
graph LR
subgraph 有偏置项
A1[输入 x] --> B1[权重 W]
B1 --> C1[求和]
A1 --> D1[偏置 b]
D1 --> C1
C1 --> E1[输出 y = Wx + b]
end
subgraph 无偏置项
A2[输入 x] --> B2[权重 W]
B2 --> C2[输出 y = Wx]
end
style A1 fill:#fff3e0
style A2 fill:#f3e5f5
为什么偏置项"看似"必不可少
考虑一个简单的二分类问题。如果数据分布使得两个类别完全分离,但没有一个过原点的超平面能够正确分类,那么没有偏置项的神经元就永远无法解决这个问题。
在早期的神经网络研究中,偏置项被认为是增加模型表达能力的关键。一个没有偏置项的隐藏层,其表达能力会受到显著限制——所有的决策边界都必须经过原点。
在传统深度学习时代,这个观点是正确的。从LeNet到ResNet,从Word2Vec到BERT,偏置项都是标准配置。那么,是什么改变了一切?
timeline
title 偏置项在大模型中的演变
section 传统时代
2012 : AlexNet使用偏置项
2014 : GLoVe使用偏置项
2017 : 原始Transformer使用偏置项
2018 : BERT/GPT-2使用偏置项
section 转折点
2022 : PaLM移除所有偏置项
2023 : LLaMA继承无偏置设计
2024 : Mistral/Qwen等跟进
LayerNorm:偏置项的第一个"终结者"
要理解为什么偏置项变得多余,我们首先需要理解Transformer中的层归一化(Layer Normalization)机制。
LayerNorm的工作原理
LayerNorm对每个token的特征向量进行归一化,使其均值为0、方差为1:
$$\text{LayerNorm}(x) = \gamma \cdot \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$其中$\mu$和$\sigma^2$分别是输入向量的均值和方差,$\gamma$和$\beta$是可学习的缩放和偏移参数。
关键在于第一步:减去均值$\mu$。这个操作会将输入"拉回"到零中心,无论原始输入是多少。
flowchart LR
A[输入 x] --> B[计算均值 μ]
B --> C[减去均值<br/>x - μ]
C --> D[除以标准差]
D --> E[乘以 γ]
E --> F[加上 β]
F --> G[归一化输出]
style A fill:#ffcdd2
style C fill:#c8e6c9
style G fill:#bbdefb
偏置项被抵消的数学证明
假设一个线性层的输出为$y = Wx + b$,然后经过LayerNorm:
$$\text{LayerNorm}(Wx + b) = \gamma \cdot \frac{Wx + b - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta$$这里的$\mu$是$Wx + b$的均值。但是,$Wx + b$的均值等于$Wx$的均值加上$b$的均值:
$$\mu = \text{mean}(Wx) + \text{mean}(b)$$当我们减去这个均值时:
$$Wx + b - \mu = Wx + b - \text{mean}(Wx) - \text{mean}(b)$$$$= Wx - \text{mean}(Wx) + b - \text{mean}(b)$$
如果偏置项$b$是一个常数向量(这是最常见的设置),那么$\text{mean}(b) = b$,于是:
$$Wx + b - \mu = Wx - \text{mean}(Wx)$$偏置项完全消失了!这就是为什么在LayerNorm之后,偏置项的效果会被归一化操作抵消。
当然,LayerNorm本身有可学习的$\beta$参数,它可以起到类似偏置的作用。但关键区别在于:$\beta$是在归一化之后应用的,而线性层的偏置是在归一化之前。既然归一化会抵消偏置的效果,那么在线性层中保留偏置就变成了多余的计算。
BatchNorm vs LayerNorm
细心的读者可能会问:BatchNorm也会抵消偏置,为什么CNN仍然普遍使用偏置?
答案是:BatchNorm在CNN中通常只用于特定层,而且CNN的结构与Transformer有本质区别。Transformer的每一层都有LayerNorm,而且使用的是Pre-Norm结构(归一化在子层之前),这使得偏置项在几乎所有线性投影中都会被抵消。
残差连接:第二个"终结者"
Transformer的另一个关键设计是残差连接(Residual Connection),它同样削弱了偏置项的重要性。
残差连接的作用
残差连接的形式是:
$$y = x + \text{Sublayer}(x)$$其中Sublayer可以是注意力层或前馈网络。这个设计允许梯度直接流过网络,缓解了梯度消失问题。
为什么残差连接使偏置项"多余"
考虑一个子层的输出$Wx + b$,加上残差连接后:
$$y = x + Wx + b = (I + W)x + b$$偏置项$b$看起来仍然有效。但是,如果我们仔细分析Transformer的Pre-Norm结构:
$$y = x + \text{Sublayer}(\text{LayerNorm}(x))$$子层接收的是归一化后的输入,其均值接近于零。在这种情况下,残差连接提供了主要的"偏移"能力——原始输入$x$直接被加到输出中,起到了类似偏置的作用。
flowchart TD
subgraph Pre-Norm Transformer块
A[输入 x] --> B[LayerNorm]
B --> C[线性层 W]
C --> D[输出 W·norm(x)]
A --> E[残差加法 +]
D --> E
E --> F[最终输出]
end
G[原始输入 x<br/>直接传递] --> E
style A fill:#e3f2fd
style G fill:#fff8e1
style F fill:#c8e6c9
Sebastian Raschka在他的技术文章中指出:“Transformer已经有残差连接,模型已经有归一化层,大部分表达能力来自大型权重矩阵,所以偏置项相对于块的其他部分贡献较小。”
PaLM论文:关键的实验证据
理论分析固然重要,但最终推动变革的是实验数据。Google在2022年发表的PaLM论文提供了决定性的证据。
PaLM的架构选择
PaLM是一个5400亿参数的大型语言模型,其架构设计代表了大模型领域的最新共识。论文中明确指出:
“No biases were used in any of the dense kernels or layer norms. We found this to result in increased training stability for large models.”
(在任何稠密核或层归一化中都没有使用偏置项。我们发现这增加了大模型的训练稳定性。)
为什么移除偏置增加训练稳定性
PaLM论文没有详细解释为什么移除偏置会增加训练稳定性,但后续研究提供了一些线索:
-
减少参数之间的耦合:偏置项的存在可能使优化问题变得更加复杂,特别是在大模型中。
-
简化梯度流:没有偏置项,每一层的输出直接由权重矩阵和归一化层决定,梯度流更加"干净"。
-
避免异常激活:某些研究表明,偏置项在大模型中可能导致激活值出现异常大的离群值,影响训练稳定性。
一项2024年的研究进一步分析道:“当使用高学习率时,线性层输出的L2范数会随着每个训练步骤增长,模型最终发散。移除偏置项有助于缓解这个问题。”
graph TD
A[移除偏置项] --> B[减少参数耦合]
A --> C[简化梯度流]
A --> D[避免异常激活]
B --> E[优化更简单]
C --> F[训练更稳定]
D --> G[梯度更健康]
E --> H[整体效果:<br/>训练稳定性提升]
F --> H
G --> H
style A fill:#4caf50,color:#fff
style H fill:#2196f3,color:#fff
模型架构对比:谁保留了偏置?
让我们看看主流模型在偏置项使用上的差异。
| 模型 | 年份 | 偏置项使用情况 | 归一化类型 |
|---|---|---|---|
| 原始Transformer | 2017 | Q/K/V投影有偏置,FFN有偏置 | Post-LayerNorm |
| BERT | 2018 | 全部使用偏置 | Post-LayerNorm |
| GPT-2 | 2019 | 全部使用偏置 | Pre-LayerNorm |
| GPT-3 | 2020 | 全部使用偏置 | Pre-LayerNorm |
| PaLM | 2022 | 无偏置 | Pre-LayerNorm |
| LLaMA | 2023 | 无偏置 | Pre-RMSNorm |
| LLaMA 2/3 | 2023-24 | 无偏置 | Pre-RMSNorm |
| Mistral | 2023 | 无偏置 | Pre-RMSNorm |
| Qwen | 2023 | 无偏置 | Pre-RMSNorm |
可以看到,2022年是一个明显的分水岭。PaLM开创了"无偏置"设计,随后LLaMA系列将这一设计发扬光大,成为开源大模型的事实标准。
LLaMA的"配方"
LLaMA论文总结了现代大模型的核心设计原则:
- 使用RMSNorm代替LayerNorm
- 使用旋转位置编码(RoPE)
- 使用SwiGLU激活函数,隐藏层维度扩展为$8/3$倍
- 不使用任何偏置项
这个设计组合被称为"LLaMA配方",被后续几乎所有开源大模型采纳。
flowchart LR
subgraph LLaMA配方
A[RMSNorm<br/>简化归一化] --> E[现代大模型]
B[RoPE<br/>旋转位置编码] --> E
C[SwiGLU<br/>门控激活] --> E
D[无偏置项<br/>极简设计] --> E
end
style E fill:#673ab7,color:#fff
RMSNorm:更进一步的去偏置化
LLaMA使用的RMSNorm是LayerNorm的简化版本,它在设计上就更"反对"偏置项。
RMSNorm的公式
$$\text{RMSNorm}(x) = \gamma \cdot \frac{x}{\sqrt{\frac{1}{d}\sum_{i=1}^{d}x_i^2 + \epsilon}}$$与LayerNorm不同,RMSNorm不计算均值,也不减去均值。它只进行缩放,使向量的RMS(均方根)为1。
RMSNorm与偏置项的关系
RMSNorm本身只有一个可学习参数$\gamma$(没有$\beta$),这意味着它不提供额外的"偏移"能力。这与LayerNorm形成对比——LayerNorm的$\beta$参数实际上承担了偏置的功能。
flowchart TD
subgraph LayerNorm
A1[输入 x] --> B1[计算均值]
B1 --> C1[减去均值]
C1 --> D1[除以标准差]
D1 --> E1[乘以 γ]
E1 --> F1[加上 β]
F1 --> G1[输出]
end
subgraph RMSNorm
A2[输入 x] --> B2[计算RMS]
B2 --> C2[除以RMS]
C2 --> D2[乘以 γ]
D2 --> E2[输出]
end
style G1 fill:#ffcdd2
style E2 fill:#c8e6c9
然而,正是因为RMSNorm更简单、更"纯粹",它与无偏置设计更加契合。两者结合,整个Transformer块没有任何"额外"的偏移参数,完全依赖残差连接和权重矩阵来表达信息。
BitFit:偏置项的"第二春"
就在大模型纷纷移除偏置项的时候,2021年发表的一篇论文却为偏置项"翻案"——BitFit。
BitFit的核心发现
BitFit(BIas-Term FIne-Tuning)是一种参数高效的微调方法,它冻结模型的所有参数,只微调偏置项。论文的核心发现令人惊讶:
只微调偏置项(占模型总参数的0.08%),在GLUE基准测试上可以达到与全参数微调相当的效果。
具体数据如下:
| 方法 | 可训练参数比例 | GLUE平均分 |
|---|---|---|
| 全参数微调 | 100% | 83.9 |
| BitFit | 0.08% | 82.3 |
| 随机选择0.08%参数 | 0.08% | 72.5 |
更令人惊讶的是,研究者发现如果只微调query向量的偏置和第二MLP层的偏置(仅占0.04%参数),效果仍然接近全参数微调。
如何理解这个"矛盾"
一方面,大模型在预训练时移除了偏置项;另一方面,偏置项在微调时却表现出异常的重要性。这看似矛盾,实则揭示了偏置项的独特角色:
-
预训练 vs 微调:在预训练阶段,模型需要从海量数据中学习通用表示,此时偏置项的贡献相对较小。但在微调阶段,模型需要快速适应特定任务,偏置项的高效调整能力变得重要。
-
表达能力 vs 适应性:权重矩阵提供主要的表达能力,而偏置项则提供了"精细调节"的能力。这就像音响系统——功放(权重)决定基本音量,而均衡器(偏置)提供细微调节。
-
参数效率:偏置项的数量远少于权重参数,但它们对输出有直接影响。这使得偏置项成为一种"高杠杆"参数——少量调整就能产生显著效果。
flowchart LR
A[预训练模型] --> B{微调策略}
B --> C[全参数微调<br/>100%参数]
B --> D[BitFit<br/>0.08%参数]
B --> E[随机参数微调<br/>0.08%参数]
C --> F[GLUE: 83.9]
D --> G[GLUE: 82.3]
E --> H[GLUE: 72.5]
style F fill:#4caf50,color:#fff
style G fill:#8bc34a,color:#fff
style H fill:#f44336,color:#fff
参数效率:移除偏置的实际收益
移除偏置项究竟能节省多少参数?让我们做一些具体计算。
偏置项的参数占比
对于一个隐藏维度为$d$的线性层,权重参数为$d_{in} \times d_{out}$,偏置参数为$d_{out}$。如果输入输出维度相同,偏置项占参数的比例约为:
$$\frac{d}{d^2 + d} \approx \frac{1}{d}$$对于$d = 4096$(LLaMA-7B的隐藏维度),偏置项占比约为0.024%,看起来微不足道。
但是,Transformer中有大量的线性层:
- 注意力层的Q、K、V投影(3个)
- 注意力层的输出投影(1个)
- FFN的两个线性层(2个,如果使用SwiGLU则是3个)
每层有6-7个线性层,对于32层的模型,偏置项的总数是可观的。
实际计算
以LLaMA-7B为例,假设隐藏维度$d = 4096$,32层,使用SwiGLU(FFN有3个线性层,隐藏维度为$11008$):
每层的偏置参数:
- Q、K、V投影:$3 \times 4096 = 12288$(如果使用GQA,这个数字会更小)
- 注意力输出:$4096$
- FFN三个线性层:如果使用无偏置设计,这里为0
如果保留偏置项,32层的总偏置参数约为:
$$32 \times (12288 + 4096) \approx 524,288$$这看起来仍然不大,但有几个重要考量:
-
内存访问效率:减少参数意味着减少内存访问,这对于GPU训练和推理都有实际意义。
-
实现简洁性:移除偏置项简化了代码实现,特别是在自定义算子优化时。
-
优化器状态:训练时,Adam优化器会为每个参数维护两个状态(一阶矩和二阶矩)。移除偏置项意味着优化器状态也相应减少。
pie title 无偏置设计的收益分布
"训练稳定性" : 40
"实现简洁性" : 25
"内存效率" : 20
"参数减少" : 15
实现细节:PyTorch中的偏置参数
让我们看看在PyTorch中如何实现无偏置设计。
标准线性层
import torch.nn as nn
# 有偏置的线性层
linear_with_bias = nn.Linear(4096, 4096, bias=True)
print(f"参数数量: {sum(p.numel() for p in linear_with_bias.parameters())}")
# 输出: 参数数量: 16781312 (4096*4096 + 4096)
# 无偏置的线性层
linear_no_bias = nn.Linear(4096, 4096, bias=False)
print(f"参数数量: {sum(p.numel() for p in linear_no_bias.parameters())}")
# 输出: 参数数量: 16777216 (4096*4096)
LLaMA风格的MLP层
class LlamaMLP(nn.Module):
def __init__(self, hidden_dim, intermediate_dim):
super().__init__()
# SwiGLU需要三个线性层,全部无偏置
self.gate_proj = nn.Linear(hidden_dim, intermediate_dim, bias=False)
self.up_proj = nn.Linear(hidden_dim, intermediate_dim, bias=False)
self.down_proj = nn.Linear(intermediate_dim, hidden_dim, bias=False)
def forward(self, x):
# SwiGLU: gate * up
return self.down_proj(
nn.functional.silu(self.gate_proj(x)) * self.up_proj(x)
)
注意力层
class LlamaAttention(nn.Module):
def __init__(self, hidden_dim, num_heads):
super().__init__()
self.num_heads = num_heads
self.head_dim = hidden_dim // num_heads
# Q、K、V投影,无偏置
self.q_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
self.k_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
self.v_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
# 输出投影,无偏置
self.o_proj = nn.Linear(hidden_dim, hidden_dim, bias=False)
深入分析:为什么原始Transformer使用了偏置?
一个自然的问题是:如果偏置项在大模型中是多余的,为什么原始的Transformer和早期的BERT/GPT都使用了它?
历史惯性的影响
2017年的Transformer论文并没有对偏置项进行消融实验。当时的做法是沿用已有惯例——CNN和RNN都使用偏置项,所以Transformer也使用偏置项。
这种"历史惯性"在深度学习研究中非常普遍。很多设计选择最初是基于直觉或习惯,后来才发现可以简化或改进。
模型规模的影响
早期的Transformer模型相对较小:
- 原始Transformer: 约6500万参数(base版本)
- BERT-base: 1.1亿参数
- GPT-2 small: 1.17亿参数
在这些规模下,偏置项的影响可能不明显,或者被其他因素掩盖。
当模型规模扩大到数百亿甚至数千亿参数时,一些在小模型中不显著的问题会变得突出。PaLM的发现——移除偏置增加训练稳定性——可能只有在5400亿参数的规模下才清晰可见。
Pre-Norm vs Post-Norm的影响
原始Transformer使用Post-Norm结构,而现代大模型普遍使用Pre-Norm:
flowchart LR
subgraph Post-Norm
A1[Input] --> B1[Sublayer]
B1 --> C1["+"]
A1 --> C1
C1 --> D1[LayerNorm]
D1 --> E1[Output]
end
subgraph Pre-Norm
A2[Input] --> B2[LayerNorm]
B2 --> C2[Sublayer]
C2 --> D2["+"]
A2 --> D2
D2 --> E2[Output]
end
在Post-Norm结构中,子层的输出直接作为最终输出的一部分,偏置项的效果得以保留。而在Pre-Norm结构中,子层接收的是归一化后的输入,偏置项的效果更容易被抵消。
什么时候仍然需要偏置项?
尽管现代大模型普遍移除了偏置项,但在某些场景下,偏置项仍然有价值。
小模型和特定任务
对于参数量较小的模型,偏置项可能提供有意义的表达能力提升。研究表明,在小到中等规模的数据集上,保留偏置项可能有助于提高模型性能。
非Transformer架构
对于不使用层归一化的架构(如某些CNN变体),或者使用BatchNorm而非LayerNorm的场景,偏置项仍然是标准配置。
微调阶段
BitFit的研究表明,即使预训练时移除了偏置项,在微调阶段添加可训练的偏置项(或类似机制)可能是一种高效的适应策略。
特定层
某些研究建议在特定位置保留偏置项。例如,有研究者发现,在注意力输出投影层保留偏置可能有助于稳定训练。
flowchart TD
A{是否需要偏置项?} --> B{使用LayerNorm?}
B -->|是| C{Pre-Norm结构?}
B -->|否| D[保留偏置项]
C -->|是| E[移除偏置项]
C -->|否| F{大模型?}
F -->|是| E
F -->|否| G[可选保留]
style E fill:#4caf50,color:#fff
style D fill:#2196f3,color:#fff
style G fill:#ff9800,color:#fff
技术总结:现代大模型的"极简主义"
偏置项的消亡是现代大模型"极简主义"设计哲学的一个缩影。除了移除偏置项,我们还看到了其他类似的简化:
| 组件 | 早期设计 | 现代设计 | 简化原因 |
|---|---|---|---|
| 归一化 | LayerNorm | RMSNorm | 更简单,计算更快 |
| 位置编码 | 学习式绝对位置 | RoPE | 更好的外推能力 |
| 激活函数 | ReLU/GELU | SwiGLU | 门控机制更有效 |
| 偏置项 | 全部使用 | 全部移除 | 训练稳定性,参数效率 |
这些简化的共同特点是:去除"看似有用"但实际贡献有限的组件,保留真正核心的机制。
这种设计哲学反映了一个深刻的认识:深度学习模型的"过度参数化"可能不是必须的。很多参数和机制的存在只是历史惯性,而非实际需要。当我们有足够的计算资源和数据时,简化的模型反而可能表现更好。
mindmap
root((现代大模型设计))
归一化
LayerNorm → RMSNorm
去除均值计算
更少的参数
位置编码
学习式 → RoPE
更好的外推
相对位置感知
激活函数
ReLU/GELU → SwiGLU
门控机制
更好的梯度流
偏置项
有偏置 → 无偏置
训练稳定性
参数效率
参考文献
- Vaswani et al. (2017). Attention Is All You Need. NeurIPS.
- Devlin et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers. NAACL.
- Brown et al. (2020). Language Models are Few-Shot Learners. NeurIPS.
- Chowdhery et al. (2022). PaLM: Scaling Language Modeling with Pathways. arXiv:2204.02311.
- Touvron et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971.
- Ben Zaken et al. (2022). BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Models. ACL.
- Zhang & Sennrich (2019). Root Mean Square Layer Normalization. NeurIPS.
- Shazeer (2020). GLU Variants Improve Transformer. arXiv:2002.05202.
- Ba et al. (2016). Layer Normalization. arXiv:1607.06450.
- Raschka. Why do some LLMs remove bias terms from linear layers? https://sebastianraschka.com/faq/docs/bias-terms-modern-llms.html