面试速记:
1.自注意力原理
词元生成 Q/K/V,全局计算注意力权重并加权融合;词与词直接关联,杜绝信息损耗;多头注意力强化特征,位置编码补充语序,以此捕捉长距离依赖。
2.与 RNN 区别
传递:RNN 串行,自注意力全局直连
长依赖:RNN 效果差,自注意力效果好
运算:RNN 不可并行、速度慢,自注意力可并行、速度快
语序:RNN 自带顺序感知,自注意力需位置编码
理解:
一、什么是「长距离依赖」?
一句话解释: 一句话 / 一段文本里,前后离得很远的词语,存在关联,模型需要识别这种关系。
举 2 个直观例子:
- 例句:小明昨天去公园玩,他玩得特别开心。 这里「他」指代前面很远的「小明」,两个词隔了一长串内容,模型要读懂指代关系,这就是长距离依赖。
- 例句:虽然外面下大雨,但是我们还是决定出门。 「虽然」和「但是」相隔一段文字,二者是逻辑绑定关系,模型要捕捉这种远距离逻辑。
简单说:长距离依赖 = 找句子里 "隔得很远的关联词 / 指代关系"。
现在问题来了:RNN 做这件事很吃力,自注意力却很轻松,下面分开讲。
二、第一部分:RNN(Recurrent Neural Network 循环神经网络) 为什么不擅长捕捉长距离依赖?
1. 用比喻理解其工作方式
把一整段文字 想象成一串排队传话的人 ,每个字 = 一个人。 RNN 的规则: 消息只能从左往右,一个人传给下一个人,不能跳着传,也不能反向传。
举例子: 队伍:小明 → 昨天 → 去 → 公园 → 玩 → , → 他 任务:让最后一个人(他)知道,前面的主语是「小明」
流程: 小明 把信息传给 昨天 → 昨天传给 去 → 去传给 公园 ...... 一路传到最后的「他」
2. 核心问题:信息层层损耗
传话游戏你肯定玩过: 一句话传 5 个人,意思基本不变;传 20 个人,大概率变味、丢失细节。
RNN 就是这个道理: 词语相隔越远,信息传递的链条就越长,每传递一步都会丢失一部分信息。 当两个词距离非常远时,传到最后几乎 "面目全非",模型自然识别不出二者的关联。
总结 RNN 痛点:串行传话、链路太长、信息不断丢失 → 抓不住长距离依赖。
补充:RNN 额外特点
- 必须按顺序逐个处理,前面的字不处理完,就没法处理下一个,没法同时干活;
- 它天生就知道文字的先后顺序,不需要额外做 "顺序标记"。
三、第二部分:自注意力(Transformer)如何捕捉长距离依赖?
同样用「排队的人」举例,规则彻底改变。
1. 自注意力的工作规则
不再是「挨个传话」,变成全员互相沟通 。 队伍里每一个人,都可以直接看向队伍里所有人,不管对方站在最前面、最后面,还是中间。
还是这个例子: 队伍:小明 → 昨天 → 去 → 公园 → 玩 → , → 他
最后一个人「他」,不用等别人传话 ,可以直接转头看向最开头的「小明」,二者直接建立联系。
2. 核心优势
- 无中间环节,信息零损耗 远距离的两个词直接交互,不需要经过中间一大串文字传递,信息不会丢失。 哪怕两个词相隔上百个字,也能精准识别关联,这就是它擅长长距离依赖的根本原因。
- 所有人可以同时 "互相观察、计算关系" 整段文字可以一次性全部处理,不用排队逐个干活,处理速度远快于 RNN。
3. 一个小短板(对应前面知识点)
自注意力本身分不清文字顺序。 比如「狗咬人」和「人咬狗」,单纯看词语组合,它分辨不出区别。 所以必须额外加「位置编码」,给每个字标上序号(第 1 个字、第 2 个字......),补上顺序信息。
四、底层原理
自注意力为每个词元生成查询(Q)、键(K)、值(V) 三组向量。通过计算当前词元的 Q 与整个序列所有词元 K 的相似度,得到注意力权重;再用权重对所有词元的 V 做加权求和。
这意味着任意两个词元可以直接建立关联,信息不需要逐位串行传递,从根本解决了长序列下信息衰减的问题。
Q(查询)、K(键)、V(值) 三组功能向量,分工明确:
-
Q 查询:当前词的"主动诉求",代表自己想找谁、想关注什么语义信息。
-
K 键:当前词的"对外名片",对外展示自身语义特征,供所有词的Q匹配比对。
-
V 值:当前词的"真实内容",存储自身完整语义信息,是最终传递、融合的核心数据。
我们以句尾的「他」为核心,一步步看它如何通过自注意力机制,远距离关联到句首的「小明」。
步骤1:所有词元生成专属 Q、K、V 向量
句子中6个词元,各自生成独立的三组向量,互不干扰:
-
小明:Q1、K1、V1Q_1、K_1、V_1Q1、K1、V1
-
昨天:Q2、K2、V2Q_2、K_2、V_2Q2、K2、V2
-
去:Q3、K3、V3Q_3、K_3、V_3Q3、K3、V3
-
公园:Q4、K4、V4Q_4、K_4、V_4Q4、K4、V4
-
玩:Q5、K5、V5Q_5、K_5、V_5Q5、K5、V5
-
他:Q6、K6、V6Q_6、K_6、V_6Q6、K6、V6
本次核心关注:「他」的查询向量 Q6Q_6Q6
Q6Q_6Q6 含义:"他"作为代词,主动想要寻找句子中和自己关联最强的指代主体。
步骤2:全局相似度计算(全句匹配打分)
用「他」的查询向量 Q6Q_6Q6,遍历匹配全句所有词元的K键向量,逐一计算语义相似度,不受词语位置远近限制:
-
Q6Q_6Q6 匹配 K1K_1K1(小明):分数很高,代词与主语语义强绑定
-
Q6Q_6Q6 匹配 K2K_2K2(昨天):分数很低,无语义关联
-
Q6Q_6Q6 匹配 K3K_3K3(去):分数很低,无语义关联
-
Q6Q_6Q6 匹配 K4K_4K4(公园):分数很低,无语义关联
-
Q6Q_6Q6 匹配 K5K_5K5(玩):分数偏低,仅有弱场景关联
-
Q6Q_6Q6 匹配 K6K_6K6(他自己):分数中等,自身基础关联
与RNN核心区别 :RNN中「他」只能接收前一个词"玩"的残缺信息,无法接触全文;自注意力可实现全局一对一直接打分,远距离词语无访问壁垒。
步骤3:生成注意力权重
将上一步所有相似度分数做归一化处理,转化为注意力权重。权重代表当前词对其他词的关注度,数值越大、语义关联越强,所有权重总和固定为1。
本例句权重分布示意:
-
小明:权重 ≈ 0.7(核心关联,最高优先级)
-
玩:权重 ≈ 0.10(弱场景关联)
-
昨天、去、公园、他自身:权重各 ≈ 0.05(几乎无关联)
步骤4:加权求和,融合全局语义信息
以注意力权重为系数,对全句所有词元的 V值(真实语义信息) 做加权求和,最终更新「他」的语义特征。
通俗计算逻辑:
最终特征 = 权重₁×小明信息 + 权重₂×昨天信息 + 权重₃×去的信息 + 权重₄×公园信息 + 权重₅×玩的信息 + 权重₆×他自身信息
对应具体运算:
-
0.7 × V1V_1V1(小明信息)→ 主导最终语义
-
0.10 × V5V_5V5(玩的信息)→ 辅助场景信息
-
0.05 × V2、V3、V4、V6V_2、V_3、V_4、V_6V2、V3、V4、V6 → 微弱补充信息
运算完成后,「他」的新特征重点融合了远距离"小明"的核心语义,模型成功识别二者的指代关系。
该逻辑适用于全文所有词元,不止是"他",句子中每一个词都会执行「生成QKV→全局匹配相似度→计算权重→加权融合V值」的操作,实现全句词语两两语义交互。
五、RNN vs 自注意力 全方位对比
结合上面两个比喻,整理成好记的对比,一共 4 个核心区别:
表格
| 对比点 | RNN(老式模型) | 自注意力(Transformer / 大模型) |
|---|---|---|
| 工作方式 | 串行挨个传话,只能从前到后传 | 全员直接互相交流,任意两人可连线 |
| 长距离关联 | 很差。距离越远,信息丢得越多,认不出远距离关系 | 很强。远距离词语直接对接,信息不丢失 |
| 处理速度 | 慢。必须等前一个处理完,才能处理下一个 | 快。整段文字可以同时运算 |
| 顺序感知 | 天生知道先后顺序,不用额外设置 | 本身分不清顺序,必须加位置标记 |