Skip to content

Transformer核心

不错,正是Transformer架构开创了LLM时代。

但我们已经非常清楚了,真正的第一性原理是自注意力机制这个计算范式被产业采纳。Transformer架构更多是一种落地实现,粗略了解即可。

一、第一性原理

新人去理解Transformer概念一定是懵逼的。

  • 残差连接 → 让模型推理可以堆到100+层
  • 层归一化 → 训练稳定性
  • FFN → 提供非线性变换和记忆容量
  • 位置编码 → 补偿自注意力丢失的位置信息

堆叠

首先需要建立一个基本认知,Transformer本质上是一个堆叠的 编码器/解码器层,整个架构就是不断堆叠这些“计算积木”,最后来面向计算任务,接合适的输入输出。

在理解 Transformer 或 LLM 架构时,比起单独去研究每个功能概念,更核心的问题是:为什么需要堆叠这些层。从第一性原理来讲,这里的“堆叠”是为了 提升模型容量、表达能力和训练稳定性,每个机制都是为了支撑这个目标而设计的。

这个项目的**计算**生命周期管理比上个项目的**计算**资源调度更复杂

对于这样一个只有17个token的用户输入,假如只有一层,即便是全连接,O(n²) = O(17²) = 289个关系,在面向深度推理时必然是能力不足的,这是由原始信息容量决定的。而Transformer的N层叠堆,可以实现递进推理、局部捕捉、多视角观察,最终表现为用户所能感知的泛化、深度推理能力。

计算

在堆叠增强能力的基础上,才是各种计算策略,来确保训练推理过程的效率、计算量、稳定性,以及对自注意力机制天然缺失位置的补偿性增强包装。

二、核心功能

以下概念粗略了解第一性原理即可,因为即便是DeepSeek,也只是Transformer的应用者,没有研究到这一层。

残差连接

这里理解一个核心的原理概念,训练是借助的数学目标是最小化“损失函数”。训练过程就是不断计算梯度,调整参数,让损失越来越小。而损失函数的数学本质就是计算各层的梯度,这个所谓的梯度就是所有中间层的连乘。很显然,无论是0.9 × 0.9 × 0.9 × ... (100次) ≈ 0.00003,还是1.1 × 1.1 × 1.1 × ... (100次) ≈ 13780,都是不可接受的。

  • 动机:当模型堆得很深时,梯度会在反向传播中逐渐衰减或爆炸,导致训练难以收敛。

  • 做法:每个子层(如 Self-Attention、FFN)都不是孤立的,而是输入直接绕一条“捷径”加到输出上:

    y=Layer(x)+x
  • 效果

    • 保留了原始输入特征 → 防止信息丢失。
    • 训练时更像在学习“残差修正”,优化更容易。
    • 使 Transformer 可以堆到 100+ 层而不会轻易崩溃(和 ResNet 思路类似)。

梯度是什么意思?

  • 数学定义:梯度就是函数在某一点处,对每个自变量的偏导数组成的向量。 比如函数 f(x,y),在点 (x0,y0) 的梯度是:

    f(x0,y0)=(fx,fy)
  • 直观理解:梯度告诉你“函数往哪个方向变化最快”。

    • 想象你在一座山上,梯度就是坡最陡的方向。如果你想往山谷里走,就沿着梯度的反方向走。

层归一化

  • 问题背景:不同层、不同位置的输入分布差异大,可能造成训练不稳定。

  • 做法:对每个样本的每一层进行归一化(不是像 BatchNorm 那样对整个 batch,而是对单个样本内部的维度):

    LN(x)=xμσγ+β
  • 效果

    • 缓解梯度消失/爆炸。
    • 使学习率可以设得更大,收敛更快。
    • 与残差连接配合,使深层 Transformer 训练稳定。

归一化是什么概念?

  • 数学定义:把数据缩放或变换到某种“标准化”的范围或分布。

  • 常见目的

    1. 让数值落在一个合理的范围(比如 0–1 或 -1–1),避免某些值太大主导训练。
    2. 让不同特征的尺度一致,便于比较和计算。
  • 具体归一化算法不去关心

  • 直观理解:如果梯度是“方向”,归一化就是“尺子”。梯度告诉你怎么走,归一化保证你走的步子不会忽大忽小。

前馈网络

  • 结构:每个位置单独经过一个两层的 MLP:

    FFN(x)=ReLU(xW1+b1)W2+b2

    通常隐藏层维度比输入维度大,比如 dmodel=512,中间层 dff=2048

  • 作用

    • 非线性变换:补充自注意力是线性操作的不足。
    • 记忆容量:通过更高维度空间增强表示能力。
    • 位置独立处理:每个 token 都独立经过同一个 FFN,相当于对所有位置做一次共享的“特征变换”。

位置编码

Transformer需要位置信息参与运算。

传统的位置编码是通过简单(1,2,3...)标量索引来处理的,但是对于LLM这样的计算工具来说,硬编码是丑陋的,关键无法参与到统一的核心运算。无法与高维向量做点积运算。解决方案是将位置编码标量为与词向量同维度的向量,通过相加的方式融入每个token的表示中,使得Self-Attention在计算相似度时能同时感知"语义"和"位置"。

对CML的启发

目前CML的显式语义结构标记,只能在上下文外围支持,如果能设计结构感知的编码,让模型不仅知道"第几个token",还直接知道"在语义树的哪个位置",那么才可能带来内核层的革命性。

  • 问题背景:自注意力机制只关心 token 两两之间的相关性,但没有“先后顺序”的概念。

  • 做法:给每个位置加上一个固定或可学习的向量。原始 Transformer 用的是 正余弦函数编码

    PE(pos,2i)=sin(pos100002i/dmodel),PE(pos,2i+1)=cos(pos100002i/dmodel)
  • 效果

    • 让模型能够区分“第 1 个词”和“第 10 个词”。
    • 支持不同长度的输入(因为是函数式编码,而不是固定表)。
    • 现代变体有 可学习位置嵌入、相对位置编码(如 Transformer-XL、T5、RoPE),效果更好。