注意力机制详解

简介: 注意力机制是Transformer核心,通过自注意力、交叉注意力等实现序列间动态关联。多头、分组、多查询等变体在效率与性能间权衡,广泛应用于大模型设计,助力高效长序列建模与推理优化。

🎯 概述
注意力机制是Transformer架构的核心,允许模型在处理序列时动态地关注重要信息。
🏗️ 注意力机制类型
1️⃣ 自注意力机制 (Self-Attention, SA)
原理:序列中的每个元素关注序列中的其他所有元素
数学公式:
$\text{Self-Attention}(X) = \text{softmax}\left(\frac{XW_Q(XW_K)^T}{\sqrt{d_k}}\right)XW_V$
代码示例:
import torch
import torch.nn as nn

class SelfAttention(nn.Module):
def init(self, d_model, d_k, d_v):
super().init()
self.w_q = nn.Linear(d_model, d_k)
self.w_k = nn.Linear(d_model, d_k)
self.w_v = nn.Linear(d_model, d_v)
self.scale = torch.sqrt(torch.FloatTensor([d_k]))

def forward(self, x, mask=None):
    Q = self.w_q(x)
    K = self.w_k(x)
    V = self.w_v(x)

    scores = torch.matmul(Q, K.transpose(-2, -1)) / self.scale

    if mask is not None:
        scores = scores.masked_fill(mask == 0, -1e9)

    attention = torch.softmax(scores, dim=-1)
    return torch.matmul(attention, V)

2️⃣ 交叉注意力机制 (Cross-Attention, CA)
原理:一个序列关注另一个序列的信息
应用场景:
● 编码器-解码器架构
● 多模态融合
● 知识蒸馏
3️⃣ 多头注意力机制 (Multi-Head Attention, MHA)
原理:并行运行多个注意力头,捕获不同类型的关系
架构:
class MultiHeadAttention(nn.Module):
def init(self, d_model, n_heads):
super().init()
assert d_model % n_heads == 0

    self.d_model = d_model
    self.n_heads = n_heads
    self.d_k = d_model // n_heads

    self.w_q = nn.Linear(d_model, d_model)
    self.w_k = nn.Linear(d_model, d_model)
    self.w_v = nn.Linear(d_model, d_model)
    self.w_o = nn.Linear(d_model, d_model)

def forward(self, query, key, value, mask=None):
    batch_size = query.size(0)

    # 线性变换并分头
    Q = self.w_q(query).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)
    K = self.w_k(key).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)
    V = self.w_v(value).view(batch_size, -1, self.n_heads, self.d_k).transpose(1, 2)

    # 注意力计算
    scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.FloatTensor([self.d_k]))

    if mask is not None:
        mask = mask.unsqueeze(1).unsqueeze(1)
        scores = scores.masked_fill(mask == 0, -1e9)

    attention = torch.softmax(scores, dim=-1)
    context = torch.matmul(attention, V)

    # 合并多头
    context = context.transpose(1, 2).contiguous().view(
        batch_size, -1, self.d_model
    )

    return self.w_o(context)

4️⃣ 分组注意力机制 (Grouped Query Attention, GQA)
原理:将查询头分组,每组共享键值头,平衡MHA和MQA
优势:
● 减少内存带宽需求
● 保持模型质量
● 推理加速
5️⃣ 多查询注意力机制 (Multi-Query Attention, MQA)
原理:所有查询头共享相同的键值头
特点:
● 显著减少内存带宽
● 推理速度提升
● 可能轻微影响质量
6️⃣ 多头潜在注意力 (Multi-Head Latent Attention, MLA)
原理:通过低秩投影减少键值缓存
DeepSeek创新:
● 低秩键值联合压缩
● 减少推理时KV缓存
● 保持表达能力
📊 注意力机制对比
机制 参数量 内存占用 推理速度 质量
MHA 高 高 慢 高
GQA 中 中 中 高
MQA 低 低 快 中
MLA 低 极低 快 高
🎯 面试重点
高频问题

  1. 自注意力和交叉注意力的区别?
  2. 为什么需要多头注意力?
  3. GQA和MQA的权衡?
  4. 如何计算注意力权重?
  5. 注意力机制的时间和空间复杂度?
    实战分析

    计算注意力复杂度

    def attention_complexity(seq_len, d_model, n_heads):

    计算注意力矩阵: O(n²d)

    存储KV缓存: O(nhd)

    time_complexity = seq_len seq_len d_model
    space_complexity = seq_len n_heads (d_model // n_heads)
    return time_complexity, space_complexity
    📚 深入阅读
    ● Transformer基础结构
    ● 位置编码详解
    ● [主流大模型结构](
相关文章
|
1天前
|
缓存 算法 Java
线程池
线程池是一种复用线程资源的机制,通过预先创建并管理一组线程,避免频繁创建和销毁线程带来的开销。任务提交到线程池后,由空闲线程执行,提升系统性能与响应速度。Java中通过`ExecutorService`、`ThreadPoolExecutor`等类实现,支持固定、缓存、调度等多种线程池类型,有效控制并发数,优化资源利用。
13 5
|
1天前
|
前端开发
1.前端知识回顾
创建HTML文件需将后缀命名为.html,如“01-新浪新闻-标题-排版.html”。输入英文感叹号!后回车,自动生成基础结构,修改标题并保存。在浏览器中打开预览效果,确保页面正常显示,完成初步测试。(239字)
|
1天前
|
索引
HashMap 原理(方法执行流程)
以put方法为例,介绍HashMap的工作原理:先通过key的hashCode计算哈希值,并进行二次哈希提升分布均匀性;若数组未初始化则创建默认容量为16的数组;利用(n-1)&hash计算桶下标,确保高效定位;根据桶位状态分别处理:空位直接插入、链表遍历更新或尾插并判断树化、红黑树则按树逻辑新增;最后检查是否需扩容。
|
20小时前
|
数据建模 物联网
南京观海微电子-----PCB设计怎样降低EMI
开关电源因高频开关动作易产生EMI,影响系统稳定性。本文详解EMI的辐射、传导与感应耦合机制,剖析PCB设计中环路面积、布局布线、寄生参数等关键因素,并提供优化布局、使用电源模块、屏蔽、滤波等实用降噪技术,助力实现电磁兼容性(EMC),确保设备可靠运行。
南京观海微电子-----PCB设计怎样降低EMI
|
19小时前
|
芯片
南京观海微电子----开关调节器的控制逻辑方法
开关稳压器通过远程控制实现节能、时序管理与浪涌电流抑制。本文介绍正负逻辑控制架构,对比隔离与非隔离外部电路,实验证明其在低功耗、顺序启动中的有效应用。
|
20小时前
|
容器
南京观海微电子----AC/DC、DC/DC转换器知识
AC是交流电,方向周期性变化;DC是直流电,方向不变。家用AC需经AC/DC转换器变为设备所需的DC。常见转换方式有变压器式和开关式,后者效率高、体积小。DC/DC转换器则用于调节直流电压,分降压、升压等类型,广泛应用于电子设备中。
南京观海微电子----AC/DC、DC/DC转换器知识
|
19小时前
|
存储 Oracle 关系型数据库
大表在线改造为分区表并释放空间:全流程实战指南
本文介绍大表在线改造为分区表的无锁方案,通过双写迁移、分批同步实现MySQL、Oracle等数据库零停机优化,提升查询性能、释放存储空间,适用于日志表、历史数据表等场景。
|
22小时前
域名转入阿里云优惠活动:每周三开启,域名COM、CN和Net后缀都有活动价格
阿里云域名转入优惠中,.com、.cn、.net批量转入享低价,周三更优惠。单笔转入5个以上低至78元(.com)、32元(.cn)。另有1元首年注册活动及优惠口令可领,详情见官方页面。
|
20小时前
|
移动开发 HTML5
完成新浪新闻-正文-视频
使用HTML5的`<video>`标签为新浪新闻正文添加视频,支持在线资源、相对路径和绝对路径三种引入方式。通过设置src、width、height及controls等属性,可自定义视频播放控件与样式。
|
1天前
|
SQL 索引
索引失效的场景
本文结合项目经验,总结了索引失效的常见场景:违反最左前缀法则、范围查询右侧列失效、索引列进行函数运算、隐式类型转换、未加引号的字符串匹配及%开头的like查询。同时建议使用explain分析执行计划,关注key、type和extra字段,优化SQL性能。