当前位置: 首页 > news >正文

深度学习:Self-attention 原理解析

Self-attention 原理解析

在自然语言处理(NLP)和计算机视觉(CV)领域,Transformer 架构及其核心的 Self-attention(自注意力机制) 已经成为了绝对的基石。本文将基于详实的科研推导笔记,从输入表示讲起,一步步拆解 Self-attention 的数学原理、矩阵实现以及多头机制。

1. 引入:序列数据的输入表示

在将文本送入神经网络之前,我们需要将其转化为向量集(Vector Set as Input)。通常有两种主流的编码方式:

  • 独热编码(One-hot Encoding):每个词被表示为一个极长的稀疏向量,对应位置为 1,其余为 0。这种方式的致命缺点是,所有的词向量之间都是相互独立的,无法体现词与词之间的语义相似度。
  • 词嵌入(Word Embedding):将词汇映射到一个稠密的低维空间中。在这个空间里,语义相近的词(如 dog, rabbit, cat)会聚集在一起,而具有其他属性的词(如 run, jump)则会在另一簇。

2. 为什么需要 Self-attention?

在序列标注(Sequence Labeling)任务中,理解上下文(context)至关重要。

过去,如果我们使用全连接层(Fully-connected, FC),通常只能通过设置一个固定大小的窗口(window)来考虑相邻的词。但这引出了一个难题:如何优雅地考虑整个序列的信息?(How to consider the whole sequence?)。如果强行用一个覆盖整个序列的超大窗口,会导致模型参数量爆炸。

这就是 Self-attention 登场的契机。它可以接收整个序列的输入,并输出一个融合了全局上下文信息的新序列(with context)。


3. Self-attention 核心机制深度拆解

假设我们有一个输入序列 $a^1, a^2, a^3, a^4$(它们可以是原始输入,也可以是隐藏层的激活值),我们的目标是通过 Self-attention 计算出对应的输出序列 $b^1, b^2, b^3, b^4$。

以计算 $b^1$ 为例,Self-attention 的核心逻辑是:寻找序列中哪些向量与 $a^1$ 是最相关的(find the vector that is relative to a1)

3.1 步骤一:计算注意力分数 (Attention Score)

为了衡量两个向量之间的相关性 $\alpha$,最常用的方法是点积(Dot-product)
$$\alpha = q \cdot k$$

我们需要为每一个输入向量 $a^i$ 乘以不同的权重矩阵,生成两个用于比对的向量:Query ($q$)Key ($k$)

  • $q^1 = W^q a^1$
  • $k^i = W^k a^i$ (例如 $k^2 = W^k a^2, k^3 = W^k a^3$)

将 $q^1$ 与序列中所有的 $k$ 进行点积,就得到了注意力分数(attention score):
$$\alpha_{1,2} = q^1 \cdot k^2$$
$$\alpha_{1,3} = q^1 \cdot k^3$$

3.2 步骤二:Soft-max 归一化

得到所有的 $\alpha_{1,i}$ 后,我们通常会对其进行 Soft-max 操作,将其转化为概率分布 $\alpha'{1,i}$:
$$\alpha'
= \frac{\exp(\alpha_{1,i})}{\sum_{j} \exp(\alpha_{1,j})}$$

3.3 步骤三:信息提取与加权求和

基于归一化后的注意力分数, we 就可以提取信息了(Extract information based on attention scores)。
首先,将输入向量通过权重矩阵转化为 Value ($v$) 向量:
$$v^i = W^v a^i$$

最后,将所有的 $v^i$ 按照对应的注意力分数 $\alpha'{1,i}$ 进行加权求和,即可得到最终的输出 $b^1$:
$$b^1 = \sum
\alpha'_{1,i} v^i$$


4. 矩阵运算视角:极致的并行化

在工程实现中,上述过程都是通过高效的矩阵乘法(In the view of matrix)来完成多条计算的。

  1. 生成 Q, K, V 矩阵:将输入向量拼接成输入矩阵 $I$,分别乘以需要学习的参数矩阵 $W^q, W^k, W^v$(Parameters to be learned):

    • $Q = W^q I$
    • $K = W^k I$
    • $V = W^v I$
  2. 生成注意力矩阵 $A$
    $$A = K^T Q$$

  3. 计算最终输出 $O$:将注意力矩阵经过 Softmax 处理得到 $A'$ 后,乘以 Value 矩阵:
    $$O = V A'$$


5. 进阶机制:多头自注意力 (Multi-head Self-attention)

在实际应用中,单词之间的相关性可能不止一种(Different types of relevance)。因此我们引入了多头自注意力(Multi-head Self-attention)

以 2 个头(2 heads)为例:
原始的 $q^i$ 会进一步被拆分(或投影)为两个不同的子查询向量:

  • $q^{i,1} = W^{q,1} q^i$
  • $q^{i,2} = W^{q,2} q^i$

不同的头独立并行计算,产生各自的输出 $b^{i,1}$ 和 $b^{i,2}$。最后,将这些输出拼接起来,再乘以一个输出权重矩阵 $W^O$ 进行融合。


6. 补全灵魂:位置编码 (Positional Encoding)

细心的读者可能发现了,在刚才的推导中,Self-attention 根本没有利用到序列的位置信息(No position information in self-attention)。打乱输入序列的顺序,得到的输出结果依然是一样的。

为了把位置信息考虑进去(Taking the position into consideration),我们需要引入位置编码(Positional Encoding)
我们为每一个位置分配一个唯一的位置向量(positional vector) $e^i$。在输入 Self-attention 之前,直接将位置向量加到原始特征向量上:
$$e^i + a^i$$

这个位置向量 $e^i$ 既可以是通过公式手工设计的(hand-crafted),也可以是直接从数据中学习到的(learned from data)。


7. 拓展应用:当 Self-attention 遇见语音与图像

  • 语音领域(Speech):由于一段音频往往对应着极长的向量序列(Speech is a very long vector sequence),直接计算全局 Attention 计算量过大。通常会采用截断自注意力(Truncated Self-attention),即只在一个有限的范围内计算注意力(Attention in a range)。
  • 图像领域(Image):近年来,Self-attention 也在挑战 CNN 的霸主地位。二者的核心区别在于:CNN 是由人工设定了固定的感受野大小,而 Self-attention 能够自动根据数据选择最佳的感受野(automatically choose the respective field)。正因为 CNN 具有这种人为先验,在图像识别领域,CNN 相对而言更不容易发生过拟合(CNN is not likely to be overfitting)。

声明:本博客由gemini基于laobie本地obsidian笔记转写,意在将obsidian内置图片转化为了纯文本或表格描述,便于博客上传

http://www.jsqmd.com/news/530060/

相关文章:

  • 终极指南:3步用Python实现WPS Office自动化处理
  • 【AI大模型春招面试题11】什么是模型的“涌现能力”(Emergent Ability)?出现条件是什么?
  • **发散创新:用Solidity构建去中心化数字资产合约实战解析**在区块链技术日益普及的今天,**数字资产**已不再是单纯的
  • 3步掌握GPTZero:开源AI文本检测工具实战指南
  • 2026不锈钢冲压件优质厂家推荐指南 - 资讯焦点
  • 深度学习:Transformer 算法原理
  • L1-025 正整数A+B,python解法
  • Ecat EnableKit 开发者指南
  • Day44location对象
  • 测完这批工具 9个AI论文平台测评对比 专科生毕业论文写作必备神器
  • 中国知名科技公司有哪些 - 资讯焦点
  • [SDCTF 2022]jawt that down!s
  • 国内自主研发强的公司有哪些 - 资讯焦点
  • 学生党闭眼入!2026年好用美白的牙膏品牌推荐榜:从根源瓦解色素沉积 - 资讯焦点
  • 2026年3月北京黄金礼品回收机构最新推荐:黄金回收、礼品回收、奢侈品回收机构选择指南 - 海棠依旧大
  • 【Agentic AI】多智能体协作模式学习笔记
  • 单片机工程实践:从硬件抽象到系统可靠性设计
  • IEXS盈十证券:商品周期未到顶,白银长周期突破打开上行空间 - 资讯焦点
  • Z-Image-Turbo_Sugar脸部Lora保姆级教学:Gradio界面中文汉化与字体修复
  • Python列表与元组完全指南:深入理解与性能优化(第5篇)
  • 嵌入式C/C++核心特性深度解析:const、volatile、static与RAII工程实践
  • 20254106 实验一《Python程序设计》实验报告
  • 国内最值得入职的大厂推荐 - 资讯焦点
  • 量子计算中的量子态、量子纠错的计算资源
  • 如何快速搭建多平台内容采集系统:面向新手的完整教程
  • Comsol技术下的弯曲波导模式研究:有效折射率与损耗的精确计算方法
  • 用Python和Matplotlib画出你的第一张乐器波形图(笛子、二胡、钢琴、号角)
  • STM32G0开发环境搭建避坑指南:CubeMX与MDK5的完美配合(附固件包下载)
  • WinCC与PLCSIM通讯全流程指南:从硬件配置到仿真测试(附常见问题排查)
  • 阻抗控制与导纳控制:基于Matlab Simulink的参数仿真与优化