Transformer架构
Transformer 是 Google 在 2017 年论文《Attention Is All You Need》提出的完全基于注意力机制的序列建模架构,彻底抛弃了 RNN/CNN,是当前大语言模型(GPT、BERT 等)的基础。
为什么需要Transformer架构
在Transformer架构之前, 主流是RNN 循环神经网络(像流水一样一步步往后读,记住前面信息),擅短句预测、简单语音
RNN有两大致命缺陷 :
-
序列化处理瓶颈:像接力赛一样RNN必须是从前往后的顺序来处理,训练极慢,浪费GPU
-
长距离遗忘 : RNN只擅长处理短句子预测, 如果遇到很长的句子,就会忘了前面的东西
Transformer架构就解决了这两点
Transformer的两个核心设计
-
自注意力机制 : 解决长距离依赖
-
完全并行化:解决速度瓶颈
自注意力机制(Self-Attention)
这是 Transformer 最具革命性的地方。它让句子中的每一个词都去跟其他所有词"打个招呼",计算出彼此之间的关联度。
正常的阅读。你读到一句话里的某个词时,眼睛会前后扫视整句话,联系上下文来理解这个词。
模仿人类阅读时的“聚焦和筛选”,也就是明白词的重点在哪里 句子:“那只 苹果 闪烁着金属光泽,最新款要九千多。” 当模型处理 “苹果” 这个词时: 它去环顾四周: 发现了“闪烁”、“金属光泽”、“最新款”、“九千多”。 计算关系: 它发现“金属光泽”和“九千多”跟它的关系最大(权重极高),而“闪烁”权重一般。 重塑含义: 出了这一层后,“苹果”这个词的含义自动从“树上结的水果”变成了“一款价格昂贵的智能手机实体”。
多头注意力机制
一个人看问题容易片面,模型也是, 所以 Transformer 派出了多个"侦探"(也就是"多头",通常有8个或16个),让它们分不同的角度去看这句话。
如果只用一个"头"去看句子,模型很容易顾此失彼。多头机制就像是给模型配了一个"专家顾问团",面对同一个句子,不同的专家站在不同的角度去观察。
多头注意力机制(Multi-Head Attention),就是把自注意力机制,同时复制好几份(也就是好几个“头”),让它们分工合作。 句子:“小明 昨天 在店里 买了一只 苹果。” 当模型处理 “苹果” 这个词时,多个“头”同时开工,各司其职: 1号头(负责找“动作”): 盯着 “买了” ➔ 搞懂这只苹果是被交易的,而不是被吃掉的。 2号头(负责找“代词/数量”): 盯着 “一只” ➔ 搞懂苹果的数量是一个。 3号头(负责找“地点”): 盯着 “店里” ➔ 搞懂这个苹果是在哪里出现的。 所有的‘头’在同一时间、互相独立工作 最后把所有的报告拼接、融合 得到最全面的结论
多头注意力,就是"三个臭皮匠,顶个诸葛亮"。它让模型能够同时捕捉语法、语义、时间、地点等多个维度的信息,看问题更全面。
位置编码 (Position Encoding)
Transformer 让每个词都同时(并行)计算了,最后怎么分期每个词的顺序是什么?
就像 "猫吃老鼠" 和 "老鼠吃猫" 一样分不清,谁在前谁在后
通过位置编码的方式解决 : 给每个词的向量上 加一个 "位置编码"
Transformer 为了并行计算,就抛弃了像RNN那样排队, 他让所有词同时计算,怎么分辨顺序? 解决方法 : 打上时间戳,也就是位置编码 位置编码就是解决 给每个词发 ‘号码牌’ 猫 --> 1 吃 --> 2 老鼠 --> 3 ,
Transformer架构的硬件支持
Transformer架构天生就适合GPU
-
CPU的特点 : 擅长做一件高难度的事情(像一个数学教授帮你做高数)
-
GPU的特点 : 擅长做百万个小计算 (像一万个小学生帮你做算数)
所以Transformer架构这样 硬件推动技术方案,技术方案有能推动硬件发展
前馈神经网络(FFN)
如果说注意力机制 是 Transformer 的"眼睛"(负责四处看、找关系),那么 FFN 就是 Transformer 的"大脑知识库"(负责消化信息、输出结论)。
在 Transformer 的每一个大层里,数据都是先过注意力机制,紧接着就进 FFN。它们俩是雷打不动的"黄金搭档"。
FFN的3个步骤
1. 首先有一个向量(512维的纸团) 2. 第1步 : 升维 (展开纸团) ==> 放大细节,2048维(看清楚纸团里的字) 3. 第2步 : 激活函数(过滤掉无用的数据) 4. 第3步 : 降维(打包成总结)
FFN其实就是大模型的'记忆体'
FFN本质是一个 键值对存储系统
-
第一层(key): 识别模式, 比如'中国的首都' 这样模式
-
第二次(value):取出答案 , 北京
这就是为什么参数量越大,模型记得就越多-->相当于增加FFN的宽度,能记录的也更多
残差连接(Residual)
残差连接通俗来说,就是给数据在模型里拉一条"免死金牌通道",或者叫"直通高速公路"。
在 Transformer 每一个大层(无论是注意力机制还是 FFN)的旁边,都并排修了一条小路。原本的数据不经过任何加工 ,直接沿着这条小路走过去,和经过层层加工后的输出加在一起,然后再送往下一层。
如果数据经过100层计算,会出现2个大问题
-
信息退化 : 信息在层层传递中失真,被改的面目全非了
-
梯度消失 : 模型"学不动"了,网络太深时,后期的修正信号往回传,传着传着就衰减到 0 了,底层的网络根本学不到东西。
残差连接负责拉一条"高速公路",把原始信息不加修改地送往下一层,防止随着网络变深,前面的记忆被"糊"掉。
┌─── [ 直通高速公路 ] ───┐ │ │ 输入数据 X ───┴──> LayerNorm ──> 加工 ──> ➕ ──> 输出新数据
残差连接的作用
-
消息不丢失 : 无论经过多少层,原始数据仍然在
-
梯度高速公路 : 误差信号可以直达底层,不会衰减
一层Transformer的完整流程
数据从底向上流动
下一层 Transformer (Layer N+1) ▲ │ 【 第二次残差相加 ➕ 】 ◄───────┐ ▲ │ │ │ [ FFN 前馈网络 ] │ ▲ │ (第二条直通公路) │ │ [ LayerNorm 归一化 ] │ ▲ │ │ │ 【 第一次残差相加 ➕ 】 ◄───┐ │ ▲ │ │ │ │ │ [ 多头自注意力机制 ] │ │ ▲ │ │ (第一条直通公路) │ │ │ [ LayerNorm 归一化 ] │ │ ▲ │ │ │ │ │ └───────────────────┴───┴── [ 输入向量 X ] (来自上一层 Layer N-1)
当"苹果"这个词向量走完这一层的 8 个步骤后,它发生的变化是:
-
进这一层前: 它知道自己身处什么环境。
-
出这一层后: 它不仅融合了环境,还通过 FFN 激发了模型底层对这个环境的"深度理解"。
然后,这个进化后的向量会作为输入,原封不动地送进下一层 Transformer,重复上面的折腾,直到堆叠的几十层全部走完。层数越深,模型对语义的理解就越抽象、越聪明。