Transformer与自注意力机制:一台"全员检索"机器的说明书

Transformer与自注意力机制:一台"全员检索"机器的说明书

一句话剧透全文:注意力机制不是"像"一次检索,它本身就是一次检索------只是发生在模型内部、发生在词与词之间。想通这一点,Transformer 的每一个零件都会变得顺理成章。

0. 引子:从"它"指代谁说起

先看一句话:

那只猫追老鼠,因为它饿了。

"它"指的是谁?你大概连半秒都没用------是猫,不是老鼠。因为饿了才去追的,是猫。

这个判断对你毫不费力,但对计算机来说是一道天堑:"它"这个字本身不携带任何信息,它的含义完全取决于上文里的哪个词。机器怎么知道该把"猫"的含义注入到"它"身上?

这个能力,就是注意力(Attention)。2017 年 Google 的一篇论文用了一个嚣张的标题------《Attention Is All You Need》(注意力就是你所需要的一切)------宣布:只要这一个机制,就能替代之前所有的文本处理方案。此后 GPT、BERT、Claude、通义千问......你听说过的所有大模型,全部建在这块地基上。

这篇文章要零数学门槛地讲透两件事:注意力到底是什么 ,以及 Transformer 怎么把这个机制组装成一台完整的机器。全程只用类比和图。

1. 先看病:一场传话游戏

要理解注意力为什么伟大,得先看它治好了什么病。

在 2017 年之前,处理文本的主流方案是循环神经网络(RNN):读一个词、消化一个词、把"消化后的摘要"传给下一个位置,接着处理下一个词------像一场传话游戏。

这场游戏有三个致命伤:

病症 机制 直观感受
长程信息丢失 "它"想接上三十个词之前的"猫",信息必须经过三十次传话 传着传着就变味了,甚至传丢了
无法并行 第 100 个词必须等前 99 个词处理完 像排队买奶茶,前面的人不走你就干等
越长越慢 处理时间随句长线性叠加 一千字的文档要等"一条队"排完

有人试图硬修:把整句话压缩进一个固定大小的"摘要容器",要用时从容器里取。但一万字塞进一个杯子,怎么压都是有损的------这就是著名的信息瓶颈。

注意力的解法干脆利落:废除传话链 。处理任何一个词时,允许它直接回头看整句话的所有词,自己判断需要什么、去取什么。距离不再是问题------"它"一步跨回三十个词之前,直接和"猫"对上话。而且所有词可以同时各自取材,排队变成了全员并行的开窗办理。

一句话总结这场手术:从"逐级传话"改成"按需取用"。

2. 直觉:聚会上的耳朵

"注意力"这个名字来自认知科学,它的直觉你每天晚上都在体验。

想象你在一场嘈杂的聚会上听一个人讲话:

  • 说话的那个人,你投入 90% 的听音量;
  • 邻座的闲聊,压到 5%;
  • 背景音乐,只剩 2%。

你的大脑在给每个声源动态分配权重。关键在"动态"二字------换一个人开口,权重分配立刻重排。

把这份直觉搬到句子上:处理"它"这个词时,模型给句中每个词打一个"此刻我该听你多少"的分数------三十个词之前的"猫"拿到 0.7 的高分,旁边的"因为"只拿 0.05。然后按分数把所有词的信息加权混合,得出"它"的新表示。这个新表示里"猫"的成分占七成------"它"不再是空洞的代词,而是"那只猫"的化身。

注意力 = 一组随当前任务实时变化的权重。 这就是它的全部直觉。剩下的问题只有一个:这组权重是怎么算出来的?

3. 机制:每个词发起的一次内部检索

答案会让你会心一笑:用检索的方式算出来的。你在搜索引擎或图书馆查资料的那套流程,就是注意力的运转方式。

3.1 三个角色

每个词进入注意力层前,会被改造成三种身份(英文术语叫 Query / Key / Value,下文统一用中文角色名):

角色 图书馆里的对应 职责
查询 你的检索词 当前这个词想知道:"我该从别处取什么信息?"
标签 每本书书脊上的索引标签 句中每个词亮出的自我介绍:"我是关于什么的,可供匹配"
内容 书的正文 句中每个词真正携带的信息,等着被按分量取走

用视频网站类比更亲切:你在搜索框输入"transformer 教程"(查询),网站里每个视频都挂着标签(标签)------"AI、机器学习"的匹配度高,"美食、做饭"的匹配度为零------最终按匹配度加权返回视频内容(内容)。搜索框是查询,视频标签是被匹配项,视频本身是被取回的内容。

3.2 一个关键设定:自己检索自己

注意一个精妙之处:句子里每个词既是提问者,也是被检索的书。

"猫"在被"它"取走内容的同时,自己也在发起查询------它也许想确认"追"这个动词跟自己的关系。一场注意力计算下来,句中所有词两两之间都完成了一次"互相打听"。这就是"自注意力"(Self-Attention)里"自"的含义:自己检索自己,句内词互查,不假外求。

3.3 五步流程

处理"它"这个词时,完整跑一遍:

  1. 发出查询:"它"亮出自己的查询向量(我想找:我指代的对象是谁);
  2. 逐一打分 :拿这个查询和句中每个词的标签算相似度------与"猫"的标签相似度极高,与"老鼠"的低("算相似度"就是两个向量做点积:方向越一致、得分越高,和你用余弦相似度比对两段文本是同一族数学);
  3. 缩放:把分数除以一个固定的小系数(防止数值失衡,第 4 节细讲);
  4. 归一化:把一排分数压成总和为 1 的百分比------高分者拿大头,但不至于通吃;
  5. 加权混合 :按百分比把所有词的内容加权平均------"猫"的内容占七成。

产出:"它"的新表示,一个融合了全句信息的新身份。整句话里每个词都各自走一遍这套流程,谁也不落下。

3.4 补一堂点积课:两张打分表的"意见一致度"

五步流程里最陌生的词藏在第 2 步------"算相似度"用的是什么运算?答案:点积。它值得单独补一堂三分钟的小课。

运算本身极简 :两个向量对应位置相乘,再全部加起来:

\[1, 0\] \\cdot \[2, 1\] = 1 \\times 2 + 0 \\times 1 = 2

真正的问题是:这么朴素的一道乘加算式,凭什么能衡量"相似"?

用一个生活场景想它。你和一位同事给三家餐厅打分:

川菜馆 火锅店 日料店
你的评分 2 1 0
同事的评分 2 1 0

想知道两人口味有多一致,怎么办?逐家把两人的分数相乘,再加总:

2 \\times 2 + 1 \\times 1 + 0 \\times 0 = 5

这就是点积。它的妙处全在"逐项相乘"上:某一家只有你们俩都打了高分,乘积才大------你打 2、同事打 0,乘积归零,彻底抵消;俩人都打 2,乘积直接顶格。逐项相乘再求和,等于在问:"我们俩的高分区重合吗?"总分越高,口味越一致。

把"餐厅"换成"语义维度",就是注意力的打分:查询向量与标签向量逐位相乘再求和------两张意见表的重合度。点积大,意味着两个词在这个语义空间里"看重的东西高度重合",也就是语义相近。

再送两条几何直觉,知道即可:两个向量方向完全一致 时点积最大;互相垂直 时点积恰为零(意见完全不搭界);方向相反 则为负数(意见相左)。另外,你若接触过 RAG 检索里的余弦相似度------点积除以两个向量的长度就是它。两者是近亲:注意力用点积(配合缩放),向量检索常用余弦,同源不同衣。

3.5 实况走查:"它"的一次完整检索

现在把点积装回五步流程,用"那只猫追老鼠,因为它饿了"给整条流水线放一段实况。

真实的查询、标签向量有几百上千个维度,且每个维度没有人类可读的名字。这里做一个教学专用的二维度玩具版------假装每个词只有两个维度:

  • 维度一:是不是一个实体名词("猫""老鼠"这类有实义的"东西")
  • 维度二:是不是一个功能词("因为"这类只起语法作用、本身没内容的词)

由此设定(数字是编的,但语义方向自洽):

词 向量 语义解读
它的查询 1, 0 "我想找实体名词,功能词与我无关"
猫的标签 2, 1 强实体、弱功能
老鼠的标签 1, 1 也是实体,强度弱一档
因为的标签 0, 1 纯功能词

第 2 步 · 逐一打分(点积现场):

打分对象 点积计算 得分
猫 1×2 + 0×1 2
老鼠 1×1 + 0×1 1
因为 1×0 + 0×1 0

"它"的查询全力寻找实体名词:"猫"拿到最高分;"老鼠"也是实体但弱一档;"因为"是纯功能词,与查询恰好垂直------零分。

第 3 步 · 缩放(本例可跳过):真实向量几百上千维,点积会膨胀得很大,所以要除以根号维度防止"赢家通吃"。玩具版只有两维、分数本来就温和,这步按理可省------保留它是为了提醒:真实模型里它一直在岗。

第 4 步 · 归一化(softmax 上场):把 (2, 1, 0) 压成百分比。softmax 的算法是把每个分数变成 e 的幂再摊分(e² ≈ 7.4,e¹ ≈ 2.7,e⁰ = 1):

词 原始分 归一化权重
猫 2 约 67%
老鼠 1 约 24%
因为 0 约 9%

注意一个漂亮的细节:原始分 2 : 1 : 0 的悬殊差距,归一化后变成约 67 : 24 : 9------差距被温柔地压缩了。这正是"高分者拿大头,但不至于通吃"的数学实现:哪怕"因为"得了零分,softmax 也只让它掉到 9%,而不是归零。注意力因此是"软"的------软检索不开除任何候选,只给它们排座次。

第 5 步 · 加权混合:"它"的新表示 = 67% × 猫的内容 + 24% × 老鼠的内容 + 9% × 因为的内容。三分之二的猫------那个空心的代词,此刻正式成为"那只猫"的化身。

第 7 节那张注意力矩阵热力图里"它把七成注意力给了猫",画的正是这样一次计算的结果------区别只是真实模型用几百维向量、几十层流水线,而且没人给维度起过名字。

4. 手算走查:三个词的完整账本

五步流程已经在 3.5 看过一段"它"的实况,这一节换一个句子、把六步账本完整走一遍:"我 / 爱 / 人工智能"。假设每个词已经变成了向量,现在计算"爱"这个词的新表示。

4.1 逐步走账

第一步,发出查询。"爱"亮出查询向量:作为一个动词,我想知道------我的主语是谁?我的宾语是谁?

第二步,逐一打分。"爱"的查询与三个词的标签分别算相似度(相似度怎么算出来的?就是 3.4 那堂点积课------查询与标签逐位相乘再求和;这里直接给出结果):

被打分的词 原始分
我 3 分
爱 5 分
人工智能 8 分

"人工智能"拿了最高分------在这个句子里,"爱"最关心的确实是自己的宾语。

第三步,缩放 。分数除以"根号下向量维度"。为什么?打分用的是点积,向量维度一大,分数天然膨胀------一大排巨大的数值直接进入下一步的归一化,会让最高分逼近 100%、其余全部归零,变成一家独大。除以根号维度是把分数的波动幅度拉回温和区间,让权重分布"有区分、但不独裁"。一个字:防赢家通吃。

第四步,归一化。softmax 登场------像评委打分变成百分比:原始分 (3, 5, 8) 变成权重:

被看的词 权重
我 20%
爱 30%
人工智能 50%

三个百分比加起来恒等于 100%。这一排百分比,就叫注意力权重。

第五步,加权混合。新表示 = 20% × 我的内容 + 30% × 爱的内容 + 50% × 人工智能的内容。

第六步,输出。"爱"的新表示生成完毕------它已经不再是一个孤零零的动词向量,而是一个"知道自己主语是我、宾语是人工智能"的语境化向量。

全文唯一的"公式"就这一行,它概括了上面所有步骤:

\\text{新表示} = \\sum_i w_i \\cdot \\text{内容}_i, \\quad w_i = \\text{归一化}\\big(\\text{相似度}(\\text{查询}, \\text{标签}_i)\\big)

4.2 走完一个词,只是走完一句话的三分之一

别忘了:"我"和"人工智能"也要各自走一遍这五步。三词短句走三遍,千字长文走一千遍------每一遍的查询都不同,所以每一行权重分布都不同。这就是"动态"的物理形态:没有哪两组词之间的权重是复制的。

5. 多头注意力:多个专家同时开会

到这里有一个新问题:一次打分只学得出一种关系,可语言里的关系远不止一种。

"它"需要找指代对象(指代关系),"漂亮"需要找它修饰的名词(语法关系),"服务器"需要找语义搭档"宕机"(语义关联),"追"需要知道紧跟自己的是"老鼠"(相邻结构)------这些是不同维度的"相关"。单打一种相似度,顾此失彼。

解法朴素得漂亮:并行开多组独立的注意力通道,每组一套自己的查询/标签/内容变换,各自学各自的关系,最后把各通道的输出拼接融合。类比一个审稿团队同时开会:

  • 语法专家盯主谓搭配;
  • 指代专家盯代词指向;
  • 语义专家盯词义关联;
  • 位置专家盯相邻结构。

各审各的,意见汇总成最终评审。三个工程事实值得知道:

  1. 实际模型常有八到几十个头;
  2. 每个头的维度更小(比如 512 维切成 8 个 64 维的头),总计算量和一个"大单头"相当------多头是白捡的多视角;
  3. 哪个头学什么关系,没有任何人工指定------纯靠训练自然分工。研究者事后把头的行为可视化出来才发现:有的头专门干"指代消解",有的头专门盯"相邻位置"。分工是涌现的,不是设计的。

6. 位置编码:给散珠子发座位号

注意力有一个天生的盲区,必须在组装机器前补上。

它打分靠的是"标签与查询的匹配度",而两袋词的匹配关系是一样的,无论怎么排列。也就是说,在纯注意力眼里:

"狗咬了人" 和 "人咬了狗" ------ 是同一句话。

对,注意力天生不识词序,句中的词对它来说就是一袋散珠子。而词序对语言的重要性不言而喻(上一句就是证明)。

解法:给每个词的向量额外加一份"座位号"信息再送进注意力------第一个词带 1 号座位的印记,第二个词带 2 号的。原始论文用正弦/余弦函数生成座位号(好处:值域温和、任意长度都能生成、相邻座位的关系有规律可循);现代模型多用"旋转角度"方案(座位越远、向量间的旋转差越大,注意力据此天然感知远近)。

无论哪种方案,本质都一样:注意力自己不看词序,我们给它配一副眼镜。

7. 因果遮罩:不许偷看答案

现在把前面所有零件装到"生成文本"这个任务上,会立刻发现一个作弊漏洞。

模型的工作是"预测下一个词"。如果注意力可以看到未来的词------预测"爱"的时候直接看到了"人工智能"已经写在后面------那还预测什么?答案就摆在卷面上。

解法叫因果遮罩 :处理第 5 个词时,强制把第 6 个词及之后所有位置的注意力分数压成零。只许回头看,不许偷看未来。

这张图里的方格表值得学会怎么看,它是理解注意力最直观的一扇窗:

  • 行 = 发问的词,列 = 被看的词,格子颜色深浅 = 注意力权重;
  • 右上半部分整片涂灰打叉------那就是遮罩区:每个词只能看到自己左边的词(含自己),未来的格子全部封死;
  • 每一行的权重总和恒为一------深浅就是这个行主把百分之多少的注意力分给了谁。

看最后一行"它":深色格子集中在"猫"那一列------"它"把七成注意力给了"猫",代词消歧的现场。这不是画出来的示意,真实训练出来的注意力矩阵就是这样:把模型内部某一层的权重导出来,你就能亲眼看到每个词在听谁说话。

遮罩还有一个你每天都 在承受的副产品:既然每个词都只能"回头看",模型生成文本就只能一次吐一个词,吐完把整句重读一遍,再吐下一个(自回归)。你等一段长回答时那一下一下蹦出来的节奏,以及回答越长等得越久的脾气,根源都在这道遮罩上------这是另一篇故事的主角,这里只埋一个钩子。

8. Transformer 全家福:把零件组装成机器

零件齐了,总装开始。Transformer 就是一台把上述零件按固定顺序组装、再重复堆叠几十次的流水线。

一段文本从进到出,依次过这些工位:

工位 职责 一句话点评
分词器 把文本切成词元碎片:常见词整块认,生僻词拆碎认 文字进机器前的碎纸机
词嵌入 每个词元变成高维向量 语义几何空间的入口
位置编码 给每个向量标注座位号 给不识词序的注意力配眼镜
多头注意力 每个词回头检索全句 路由器:搬运、组合、调配词间信息
前馈网络 每个词独立过一遍"放大再缩小"的两层网络 知识库:事实性知识的主要存放地
残差连接 每层旁边架高速公路,信息可跳层直达 保命零件一:防几十层堆叠训崩
层归一化 每层出口装稳压器,数值分布拉回稳定区间 保命零件二:防数值失控

其中"注意力 + 前馈"是一组工序,交替堆叠几十次------第一道工序混好的信息,交给第二道深加工;加工完再进下一组的注意力,重新检索、重新混合。粗读一遍、精读一遍、再精读一遍......每一层都在前一层的基础上把理解推向更深。

分工的精髓值得单独强调:注意力管"信息怎么流",前馈管"知识存哪里"。一个当路由器,一个当仓库------大模型里参数量约三分之二在前馈层,注意力层负责让正确的知识在正确的时刻流到正确的位置。

编码器与解码器:两个工种

原始论文的 Transformer 是为翻译设计的,分两个工种:

  • 编码器 :读入原文,专职理解------每个词可以看到左右所有词(双向视野);
  • 解码器 :逐词生成译文,专职输出------戴因果遮罩(单向视野),另有一道"翻译注意力"专门去读编码器理解好的原文。

GPT 的取舍:只要解码器

后来的剧情有了转折:对于"续写文本"这个任务(写文章、对话、写代码),根本不需要两个工种------把输入和输出看成同一个序列就够了。你输入"今天天气",模型接着续写"真好啊"------生成"真"的时候能看"今天天气",但看不到还没写的"好啊"。

这就是 Decoder-Only(纯解码器)架构,GPT 全系、Claude、LLaMA、通义千问......今天几乎所有对话大模型都是这个路线。它们丢掉了编码器和翻译注意力,只留"戴遮罩的自注意力 + 前馈"这对组合,堆上几十层,然后把整套机器扔进互联网级的语料里做亿万次"预测下一个词"的填空训练------训练出来的成品,就是你每天对话的那个它。

一句话收拢本节:Transformer 是图纸,GPT 是照着图纸盖出来的大楼。

9. 尾声:同一把尺子的三个尺度

最后一步升华,回到开头那句话:注意力不是"像"检索,它就是检索。而且它和你可能已经熟悉的另一个东西共享同一个数学内核。

注意力 检索增强生成(RAG) 预训练
尺度 词级,句内 文档级,整个知识库 互联网级,整个训练语料
检索方式 软检索:所有词全保留,按权重分量混合 硬检索:算完相似度只取前几名,其余丢弃 不检索------训练出检索参数本身
发起者 模型内部,每层每词自动发生 应用层代码,按需触发一次 训练循环,一次性发生
角色 用尺子的人 用尺子整理书房的人 造尺子的人

"软"与"硬"是这两兄弟唯一的性格差异:RAG 像相亲市场------千人选三,落选者出局;注意力像调鸡尾酒------所有原料都入杯,只是配比悬殊。前者做"要不要"的二值决策,后者做"要多少"的连续决策。同一个"相似度打分 + 加权取回"的内核,在词级叫注意力,在文档级叫 RAG,而预训练用海量填空题把这个内核的参数烙进权重------尺子是同一把,造尺子的、用尺子读句的、用尺子查库的,是一家人。

代价也要交代一句:注意力要求句中每个词和所有词两两配对打分,计算量随句长平方增长------句子长十倍,打分次数涨百倍。这是"长上下文又贵又慢"的物理根源,也是工程界所有优化(分块计算、缓存复用)努力对抗的对象。

10. 预判疑惑四连

Q1:为什么叫"自"注意力? "自"指检索对象是自己人:句内词互查,不假外求。与之相对的"交叉注意力"(如翻译场景中解码器去查编码器的原文)检索的就不是自己------那才需要"交叉"二字标明内外有别。

Q2:为什么要除以根号维度,而不是别的数? 目标是把点积的波动幅度拉回归一化函数喜欢的"温和区间"。向量维度越大点积天然越大,除以根号维度恰好把方差稳定住------系数跟着维度走,是"对症下药"而非任意常数。

Q3:Transformer 和 GPT、BERT 是什么关系? 图纸与大楼。Transformer 是 2017 年的架构图纸;GPT 是照图纸的"解码器"部分盖的生成系大楼,BERT 是照"编码器"部分盖的理解系大楼(擅长分类、语义检索,不擅长写文章)。

Q4:注意力权重能被亲眼看见吗? 能。每一层、每一个头的完整权重矩阵都可以导出并可视化成第 7 节那样的热力图表------"它把七成注意力给了猫"不是修辞,是可以打印出来贴墙上的数字。这也是研究模型内部行为(可解释性)的经典素材。


结语

把整台机器再压缩成三句话:

  1. 注意力是一场内部检索:每个词发出查询、给所有词的标签打分、按权重把所有词的内容混合成自己的新表示------查询、标签、内容三角色,打分、缩放、归一化、混合四步走。
  2. Transformer 是这台检索机的总装线:分词与嵌入是入口,位置编码补词序,多头开多路视角,因果遮罩管住不看未来,前馈层当知识库,残差与归一化保命,整组堆叠几十次------GPT 只是它"纯解码器"路线的一种盖法。
  3. 它与 RAG、预训练共享同一个数学内核:相似度打分、加权取回------词级软检索、文档级硬检索、造尺子的预训练,一把尺子三个尺度。

下次你再听到"注意力机制"四个字,希望脑子里浮现的不是玄学,而是一间开满检索窗口的图书馆:每个词都在柜台前亮出检索词,每个书架都亮着标签,亿万次匹配在几十层流水线里同时发生------而你随口问出的每一个问题,都在被这样处理着。

相关推荐
时空节拍AI数字人1 小时前
AI 数字人技术架构拆解:从形象克隆到实时驱动的 5 层链路
人工智能·microsoft·3d·架构·语音识别
小花皮猪1 小时前
从 Prompt 到结构化 JSON:如何利用 Bright Data 快速搭建 YouTube 监测工作流?
人工智能·爬虫·agent·数据采集
曹牧1 小时前
AI CLI(命令行界面)
人工智能
DisonTangor1 小时前
DeepSeek-V4.1-Flash-1017:更快、更省、更强的推理与智能体新标杆
人工智能·开源·aigc·deepseek
虾..1 小时前
计算机图形学:光线追踪
人工智能
星辰云-1 小时前
# 基于Spring Boot的德州特产扒鸡商城系统(毕设|源码|论文|演示视频)
spring boot·后端·课程设计
武子康1 小时前
同为7/8,错误样本却不同:Agent Grader 分歧复算
人工智能·后端·agent
茉莉玫瑰花茶1 小时前
GO [ 内存与变量逃逸分析 ]
开发语言·后端·golang