Keel:深度可扩展Transformer与Highway连接

1. 背景与动机

现代大语言模型(LLM)的进展主要依赖三条扩展路线:模型宽度上下文长度参数规模。然而,这三条路线都面临收益递减的问题:

扩展路线问题
宽度扩展快速饱和,计算复杂度
上下文扩展成本急剧增加,外推能力有限
深度扩展理论上表达力最优,但训练不稳定

深度扩展之所以困难,是因为传统的Post-LayerNorm架构在训练深层网络时会出现梯度消失问题。2019年”On Layer Normalization in the Pre-TayerNorm Transformer”指出Post-LN在训练初期不稳定,这导致了Pre-LayerNorm(Pre-LN)成为现代LLM的标准配置——将LayerNorm移到残差分支内部,使主分支成为恒等映射。

但Pre-LN牺牲了Post-LN的表达力。Keel论文(arXiv:2601.19895)重新审视Post-LN,发现其不稳定性的根本原因是ResNet风格的残差路径,并提出用Highway连接替代。

2. Pre-LN vs Post-LN 问题分析

2.1 Pre-LayerNorm架构

// Pre-LayerNorm (现代LLM标准)
class PreLNTransformerLayer {
    Tensor norm1(Tensor x) { return LayerNorm(x); }
    
    Tensor forward(Tensor x) {
        Tensor x_norm = norm1(x);
        Tensor attn_out = Attention(x_norm);
        x = x + attn_out;  // 残差分支
        
        x_norm = norm2(x);
        Tensor ffn_out = FFN(x_norm);
        x = x + ffn_out;   // 残差分支
        return x;
    }
}

Pre-LN的特点:

  • 主分支始终是恒等映射
  • 梯度可以无衰减地流向底层
  • 训练稳定,但表达能力受限

2.2 Post-LayerNorm架构

// Post-LayerNorm (早期BERT等使用)
class PostLNTransformerLayer {
    Tensor forward(Tensor x) {
        Tensor attn_out = Attention(x);
        x = LayerNorm(x + attn_out);  // 归一化在加法之后
        
        Tensor ffn_out = FFN(x);
        x = LayerNorm(x + ffn_out);
        return x;
    }
}

Post-LN的特点:

  • 归一化层作用于 的和
  • 训练初期,残差分支输出尺度与主分支相近
  • LayerNorm的缩放效应导致底层梯度极小

2.3 梯度消失的数学分析

考虑第 层的输出

反向传播时,损失 的梯度为:

其中 是雅可比矩阵。

在训练初期, 的输出方差与输入相近,导致 的期望约为 是常数)。此时:

为负且接近 时,梯度会被衰减。LayerNorm的统计效应进一步放大了这个问题。

3. Keel架构设计

3.1 Highway连接机制

Highway网络的核心思想来自Hochreiter的早期工作:

其中:

  • 是变换门(Transformation Gate)
  • 是门控信号
  • 是携带门(Carry Gate)

3.2 Keel的Highway残差设计

Keel将标准的加性残差替换为Highway连接:

// Keel Transformer层
class KeelTransformerLayer {
    Tensor highway_gate(Tensor x) {
        return sigmoid(W_gate * x + b_gate);  // [0,1] 范围的门控
    }
    
    Tensor forward(Tensor x) {
        // 计算变换
        Tensor h = Attention(x);
        h = x + h;  // 基础变换
        
        // Highway门控
        Tensor t = highway_gate(x);  // [0,1]
        
        // 门控组合
        Tensor y = t * h + (1 - t) * x;
        
        // 第二个块
        h = FFN(y);
        h = y + h;
        
        t = highway_gate(y);
        y = t * h + (1 - t) * y;
        
        return y;
    }
}

3.3 梯度流分析

使用Highway连接后,前向传播变为:

反向传播梯度为:

关键观察:

  • 即使 (变换主导),梯度仍可通过 流动
  • 即使 (携带主导),梯度可通过 直接传递
  • Highway网络天然支持 自适应深度:网络自己决定每层应该变换多少、携带多少

4. 与标准Pre-LN的对比

特性Pre-LNPost-LNKeel
训练稳定性✓ 稳定✗ 不稳定✓ 稳定
表达能力中等
梯度流恒等保证依赖初始化自适应门控
深度可扩展受限不可能支持1000+层
收敛速度中等快(初期)快且稳定

4.1 深度缩放实验

Keel论文的实验显示:

深度     | Pre-LN Perplexity | Keel Perplexity
--------|-------------------|-----------------
64层    | 10.23            | 10.15
128层   | 9.87             | 9.71
256层   | 9.65             | 9.32
512层   | 9.52             | 8.89
1024层  | 不收敛           | 8.54

Keel在64-1024层的所有深度上都优于Pre-LN,且能够稳定训练超过1000层的模型。

4.2 任务性能对比

在Math & Code任务上,Keel比Pre-LN提升 16.5%

任务类型Pre-LNKeel提升
Math基准+18.2%
Code基准+15.8%
常识推理基准+14.3%
阅读理解基准+12.7%

5. 门控信号的动态行为

训练过程中,Keel的门控值呈现有趣的模式:

# 门控值分析
def analyze_gate_values(model, dataloader):
    """分析训练过程中门控值的分布变化"""
    gate_values = {f'layer_{i}': [] for i in range(model.depth)}
    
    for batch in dataloader:
        for layer in range(model.depth):
            t = model.layers[layer].gate_value  # Highway门控
            gate_values[f'layer_{layer}'].append(t.mean().item())
    
    # 绘制门控值随层数变化的曲线
    # 观察到:浅层T值较高(需要变换),深层T值较低(携带信息)
    return gate_values

典型观察:

  • 浅层(第1-32层):,强变换
  • 中层(第33-128层):,平衡
  • 深层(第129+层):,信息携带

这表明Keel自动学会了自适应深度压缩:浅层进行主要变换,深层逐步压缩和精炼信息。

6. 与其他深度扩展技术的对比

6.1 残差累积 vs Highway

标准ResNet:     x_{l+1} = x_l + f(x_l)
Keel Highway:   x_{l+1} = T(x_l) * f(x_l) + (1-T(x_l)) * x_l

6.2 与LSTM门控的关系

LSTM的遗忘门和输入门与Highway连接有相似的形式:

但LSTM门控作用于细胞状态,而Keel门控作用于隐藏状态。

7. 实现细节

7.1 门控初始化

为确保训练初期保持稳定,建议:

# Keel实现
class KeelLayer(nn.Module):
    def __init__(self, d_model, init_bias=2.0):
        super().__init__()
        self.gate = nn.Linear(d_model, 1)
        
        # 偏置初始化:使门控初期偏向携带
        nn.init.constant_(self.gate.bias, init_bias)  # sigmoid(2.0) ≈ 0.88
    
    def forward(self, x):
        h = self.attention(x)
        h = x + h
        
        t = self.gate(x).sigmoid()
        return t * h + (1 - t) * x

7.2 训练配置

Keel训练配置:
  学习率: 3e-4 (与标准Pre-LN相同)
  优化器: AdamW
  权重衰减: 0.1
  批大小: 4096
  梯度裁剪: 1.0
  训练步数: 100K+

8. 未来方向

  1. 无限深度架构:Keel打开了无限深度训练的可能性
  2. 动态计算:可根据输入复杂度自适应选择深度
  3. 与其他架构结合:如与Mamba、SSM结合
  4. 理论分析:更深入的梯度流和表达能力分析

9. 参考文献