news 2026/5/26 8:28:38

注意力机制的演化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
注意力机制的演化

一、注意力机制的起源:为什么需要它?

问题背景:Seq2Seq的瓶颈2014年之前,序列到序列任务(如机器翻译)用的是编码器-解码器架构:

输入: "我 爱 北京" ↓ [Encoder RNN] ↓ 固定长度向量 c(上下文向量) ↓ [Decoder RNN] ↓ 输出: "I love Beijing"

致命问题:无论输入多长,都要压缩成一个固定长度的支撑。这就像让你用百年整本《红楼梦》——信息必然大量损失。

解决思路:动态关注

人类翻译时不会先把整词“压缩记忆”,而是边看边译,翻译词每个时候都会真相看来源句子的相关部分。 注意力机制就是模拟这个过程:让模型在生成每个输出的时候,动态决定应该关注输入的哪些部分。

二、第一代:加性注意力(Bahdanau Attention,2014)

核心思想
生成每个输出词时,将其与所有输入词的“相关性分数”进行计算,然后加权求和。

输入序列: h1, h2, h3, h4 (encoder隐藏状态) 当前decoder状态: s_t 对于每个输入位置i: score_i = 打分函数(s_t, h_i) ← 计算相关性 attention权重 = softmax(scores) ← 归一化 context = Σ(attention_i × h_i) ← 加权求和 输出 = 基于(s_t, context)生成

可视化理解

翻译 “I love Beijing” 时的注意力分布:

生成 "I" 时: 我[0.8] 爱[0.1] 北京[0.1] ← 主要看"我" 生成 "love" 时: 我[0.1] 爱[0.8] 北京[0.1] ← 主要看"爱" 生成 "Beijing" 时: 我[0.05] 爱[0.05] 北京[0.9] ← 主要看"北京"

三、第二代:点积注意力 (Luong Attention, 2015)

改进:更简单的打分函数

Bahdanau用的加性打分需要额外参数,Luong提出直接用积分:

def luong_attention(query, keys, values): # 点积打分: score = q · k scores = torch.bmm(query.unsqueeze(1), keys.transpose(1, 2)) # [B, 1, L] scores = scores.squeeze(1) # [B, L] attention_weights = F.softmax(scores, dim=-1) context = torch.bmm(attention_weights.unsqueeze(1), values) return context

四、革命性突破:Self-Attention (Transformer, 2017)

核心创新

之前的注意力是Encoder→Decoder的跨序列注意力。

Transformer提出:序列内部也可以互相注意——这就是自注意力。

传统RNN: 每个词只能看到前面的词(顺序处理) "我" → "爱" → "北京" Self-Attention: 每个词可以直接看到所有词(并行处理) "我" ←→ "爱" ←→ "北京"

Query-Key-Value 框架

这是理解现代注意力的关键:

Query (Q): 我想查询什么信息? Key (K): 每个位置提供什么索引? Value (V): 每个位置包含什么内容? 注意力 = softmax(Q × K^T) × V

缩放点积注意力

Pythondef scaled_dot_product_attention(Q, K, V, mask=None): Q: [B, L_q, D] 查询 K: [B, L_k, D] 键 V: [B, L_k, D] 值 d_k = K.size(-1) # 1. 计算注意力分数 scores = torch.matmul(Q, K.transpose(-2, -1)) # [B, L_q, L_k] # 2. 缩放(防止点积值过大导致softmax梯度消失) scores = scores / math.sqrt(d_k) # 3. 可选:应用mask(用于因果注意力等) if mask is not None: scores = scores.masked_fill(mask == 0, -1e9) # 4. Softmax归一化 attention_weights = F.softmax(scores, dim=-1) # [B, L_q, L_k] # 5. 加权求和 output = torch.matmul(attention_weights, V) # [B, L_q, D] return output, attention_weights

为什么要缩放?

当维度d很大时,点积q⋅k的支撑力很大,导致softmax输出接近one-hot(某个值接近1,其他值接近0),中间几乎为0。

五、Multi-Head Attention:多角度看问题

动机
单一注意力只能学习一种相关性模式。但语言中的关系是多种多样的:关系语法、语义关系、指关系代…

多头注意力让模型同时学习多种注意力模式。

多头的作用可视化

原始输入: "The cat sat on the mat because it was tired" Head 1 (语法关系): "cat" ← 强关注 → "sat" (主谓) "sat" ← 强关注 → "mat" (动宾) Head 2 (指代关系): "it" ← 强关注 → "cat" (代词指代) Head 3 (位置关系): 每个词关注相邻词 Head 4 (语义关系): "cat" ← 关注 → "tired" (猫累了)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 6:20:22

【time-rs】Duration 结构体详解

这是一个 Rust 时间库中的 Duration 结构体实现,提供高精度的时间跨度表示。 1. 主要特性 纳秒级精度:由整秒和纳秒部分组成支持负值:与标准库的 std::time::Duration 不同,支持负时间间隔安全边界检查:使用 RangedI32…

作者头像 李华
网站建设 2026/5/25 11:47:59

10398_基于SSM的教学评价管理系统

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料;带你从零开始部署运行本套系统。2、项目介绍教学评价系统是以Java平台作为开发环境,采用MySQL数据库作为后台,使用Eclipse作为开发工具进行设计。本系统主要实现了教学评价模块、…

作者头像 李华
网站建设 2026/5/26 4:17:43

Go语言变量

Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明,明确内存边界。Go作为静态语言,通过变量声明实现这一机制: 变量绑定特定内存区域,类型信息确定操作边界声明形式为:var 变量名 类型 值未显式初始化时自动…

作者头像 李华
网站建设 2026/5/26 4:37:41

【高可用系统架构】

系统高可用实现手段 冗余与无单点设计 部署关键节点时避免单点故障,例如负载均衡采用双节点Keepalived方案(如Nginx/HAProxy/LVS),通过虚拟IP实现故障自动切换。网络通信配置多线路(如移动电信双线)&#x…

作者头像 李华
网站建设 2026/5/26 5:14:18

高频软件测试基础面试题

在软件测试的面试过程中,面试官会问些基础的软件测试知识,下面为大家整理了一些高频软件测试面试必备的基础题,拿走不谢~ 一、什么是软件测试 为了发现程序中的错误而执行程序的过程。 二、软件测试的原则 1、完全测试程序是不可能的 2、…

作者头像 李华
网站建设 2026/5/26 5:14:19

如何准确判断json文件并且拿到我想要的信息

写在前面,自从发现拿到json解析后的文件中有我们想要的信息后,我稍微有点迷上这种方法,但是拿到内容后要怎么拿到想要的信息呢,字典列表相互嵌套,我头都晕了方法:首先就是把json解析后的文本保存成.json的形…

作者头像 李华