一个反直觉的设计选择

如果你在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论文没有详细解释为什么移除偏置会增加训练稳定性,但后续研究提供了一些线索:

  1. 减少参数之间的耦合:偏置项的存在可能使优化问题变得更加复杂,特别是在大模型中。

  2. 简化梯度流:没有偏置项,每一层的输出直接由权重矩阵和归一化层决定,梯度流更加"干净"。

  3. 避免异常激活:某些研究表明,偏置项在大模型中可能导致激活值出现异常大的离群值,影响训练稳定性。

一项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论文总结了现代大模型的核心设计原则:

  1. 使用RMSNorm代替LayerNorm
  2. 使用旋转位置编码(RoPE)
  3. 使用SwiGLU激活函数,隐藏层维度扩展为$8/3$倍
  4. 不使用任何偏置项

这个设计组合被称为"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%参数),效果仍然接近全参数微调。

如何理解这个"矛盾"

一方面,大模型在预训练时移除了偏置项;另一方面,偏置项在微调时却表现出异常的重要性。这看似矛盾,实则揭示了偏置项的独特角色:

  1. 预训练 vs 微调:在预训练阶段,模型需要从海量数据中学习通用表示,此时偏置项的贡献相对较小。但在微调阶段,模型需要快速适应特定任务,偏置项的高效调整能力变得重要。

  2. 表达能力 vs 适应性:权重矩阵提供主要的表达能力,而偏置项则提供了"精细调节"的能力。这就像音响系统——功放(权重)决定基本音量,而均衡器(偏置)提供细微调节。

  3. 参数效率:偏置项的数量远少于权重参数,但它们对输出有直接影响。这使得偏置项成为一种"高杠杆"参数——少量调整就能产生显著效果。

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$$

这看起来仍然不大,但有几个重要考量:

  1. 内存访问效率:减少参数意味着减少内存访问,这对于GPU训练和推理都有实际意义。

  2. 实现简洁性:移除偏置项简化了代码实现,特别是在自定义算子优化时。

  3. 优化器状态:训练时,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
      门控机制
      更好的梯度流
    偏置项
      有偏置 → 无偏置
      训练稳定性
      参数效率

参考文献

  1. Vaswani et al. (2017). Attention Is All You Need. NeurIPS.
  2. Devlin et al. (2018). BERT: Pre-training of Deep Bidirectional Transformers. NAACL.
  3. Brown et al. (2020). Language Models are Few-Shot Learners. NeurIPS.
  4. Chowdhery et al. (2022). PaLM: Scaling Language Modeling with Pathways. arXiv:2204.02311.
  5. Touvron et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971.
  6. Ben Zaken et al. (2022). BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Models. ACL.
  7. Zhang & Sennrich (2019). Root Mean Square Layer Normalization. NeurIPS.
  8. Shazeer (2020). GLU Variants Improve Transformer. arXiv:2002.05202.
  9. Ba et al. (2016). Layer Normalization. arXiv:1607.06450.
  10. Raschka. Why do some LLMs remove bias terms from linear layers? https://sebastianraschka.com/faq/docs/bias-terms-modern-llms.html