大模型时代人人都在说这玩意底层是个Transformer,但Transformer到底长啥样。这篇就从底层结构拆开,讲清它是怎么把文字变成可计算的思维的。

打开今日头条查看图片详情

1 输入嵌入与位置

首先,模型得先把离散的词元变成能算的向量。Transformer对每个词元做两件事:

  • 词嵌入:给每个词元一个可学习的向量,用来承载语义,比如猫和狗的向量应该比猫和电脑更接近。
  • 位置编码:Transformer本身不认识顺序,所以必须额外加一个这是第几号词的位置向量,让它知道谁在前谁在后。

具体做法是:输入序列里的每个词元先查词向量表拿到语义向量,再根据它在句子里的位置拿到一个同维度的位置向量,二者相加得到最终输入

打开今日头条查看图片详情

下图展示了从离散词元到输入嵌入序列的加工流水线。

打开今日头条查看图片详情

2 多头自注意力

有了带位置感的向量句子,下一步就是让每个词元去环顾四周,看自己应该关注谁。这就是自注意力的核心思想:

  • 每个位置会生成三组向量:查询Q、键K、值V,可以理解为:查询:我现在想找谁键:别人身上的标签信息值:别人真正要提供的内容
  • 当前词用自己的查询去和所有位置的键做相似度计算,算出一组权重,然后对所有位置的值做加权平均,就得到我基于上下文重新理解后的自己。

打开今日头条查看图片详情

多头注意力则是:不满足于只看一种关系,而是并行开很多个关注通道:

  • 每个头都有自己的一套Q K V投影,它可能更偏向于关注语法结构、实体指代、情绪走向等不同模式。
  • 所有头的输出拼接起来,再映射回原维度,就形成了更丰富的上下文表示。

3 前馈网络

自注意力解决的是谁和谁交互的问题,但它本质还是线性变换加权平均,要想表达更复杂的非线性模式,还得靠前馈网络层(FFN)来再加工一次。

一文读懂大模型的Transformer

Transformer里的FFN对每个位置单独做两层全连接变换:

  1. 第一层把维度从H升到更大的H′,类似升维扩展特征空间;
  2. 经过一个非线性激活(原始Transformer用ReLU,后来的大模型更常用GELU);
  3. 再用第二层线性变换把维度从H′拉回H。 #### 自注意力负责信息交换,FFN负责局部变形,二者叠加起来,就兼具了全局依赖非线性表达能力

打开今日头条查看图片详情

4 编码器

把输入嵌入喂进来后,编码器的任务就是:在完全可见的前提下,把整句每个位置都语境化。

编码器通常由L层标准模块叠起来,每一层的结构都是:

  1. 多头自注意力:让当前层所有位置互相交流信息;
  2. 残差连接加层归一化:把这一层的输出和原输入相加,再做LayerNorm,既保留原特征,又稳定梯度;
  3. 前馈网络:对每个位置做一次非线性变换;
  4. 再来一轮残差连接加LayerNorm。

关键特征:

  • 编码器的自注意力是双向的:每个位置都能同时看前看后,这对理解整个句子的结构和语义非常重要,比如机器翻译、文本分类。
  • 堆叠多层后,高层的表示会越来越抽象,从局部搭配逐渐变成句子级含义。
  • 最后编码器输出的是一个序列,每个位置都是带上下文的表示向量,后面解码器会拿这个当外部知识。

打开今日头条查看图片详情

5 解码器

解码器负责张嘴说话,在看到编码器输出和已生成前缀的情况下,预测下一个词。它跟编码器有点像,但多了两件非常关键的设计:

  1. 掩码自注意力:解码器在预测当前位置时,不能偷看后面的词,于是用一个上三角遮罩把未来位置全部屏蔽,让每个位置只能看见自己和之前的词。这保证了自回归生成的因果性。
  2. 交叉注意力:在掩码自注意力之后,当前步的表示会再去对编码器输出做一次注意力,这一步让解码器能盯着输入再说话,相当于翻译时一边回忆自己刚刚说了什么,一边看原文再继续说。 #### 最后一层输出会经过一个线性映射到词表维度,再接softmax变成下一个词的概率分布。训练时可以一次性预测整句的所有位置;推理时则是经典的自回归解码:生成一个词、把它拼到后面,再生成下一个词。

打开今日头条查看图片详情

6 大模型单塔

原始Transformer是一个完整的编码器加解码器结构,非常适合机器翻译这种有输入有输出的任务。但现在的大语言模型,比如GPT家族,常见的是只保留解码器部分

  • 用解码器堆叠很多层,输入是已经生成的前缀,训练时让它预测下一个词;
  • 编码器的那一半被折叠进解码器对长上下文的自注意力之中。

Transformer就是一台堆矩阵乘加注意力的通用序列处理机器

大语言模型则是在这台机器上,把参数规模、数据规模、训练预算全部拉满之后的产物。

打开今日头条查看图片详情