【ML】multi head self-attention(自注意力机制)

news2024/12/24 9:51:37

【ML】multi head 自注意力机制self-attention

      • 0. Transformer
      • 1. multi head self-attention
      • 2. positional encoding
      • 3. transform 可以应用的其他领域
          • 3.1 语音识别 变体 truncated self-attention
          • 3.2 self-attention for image
          • 3.3 self-attention v.s. CNN差异
          • 3.4 self-attention v.s. RNN
          • 3.5 GNN

0. Transformer

自注意力机制,也称为内部注意力机制,是 Transformer 模型的核心组成部分。它允许模型在处理序列数据时,计算序列中每个元素相对于其他所有元素的注意力权重。以下是自注意力机制的计算过程和公式推导:

  1. 输入表示
    假设我们有一个序列,其中每个元素(例如单词或特征点)由一个 d 维向量表示。记第 i 个元素的状态向量为 ( x_i )。

  2. 分解为查询(Q)、键(K)、值(V)
    对于序列中的每个元素,我们通过不同的线性变换将其分解为查询向量 ( q_i )、键向量 ( k_i ) 和值向量 ( v_i )。即:
    [ q_i = W^Q x_i, \quad k_i = W^K x_i, \quad v_i = W^V x_i ]
    其中 ( W^Q, W^K, W^V ) 是可学习的权重矩阵。

  3. 计算注意力得分
    对于序列中的每个元素 ( x_i ),我们计算其与序列中所有其他元素的注意力得分 ( a_{ij} ),通常使用点积操作:
    [ a_{ij} = \frac{q_i^T k_j}{\sqrt{d_k}} ]
    其中 ( d_k ) 是键向量的维度,除以 ( \sqrt{d_k} ) 是为了稳定梯度。

  4. 应用 softmax 函数
    使用 softmax 函数对注意力得分进行归一化,得到归一化的注意力权重:
    [ \alpha_{ij} = \text{softmax}(a_{ij}) = \frac{\exp(a_{ij})}{\sum_{l=1}^{n} \exp(a_{il})} ]
    其中 n 是序列的长度。

  5. 加权值向量
    使用归一化的注意力权重对值向量 ( v_j ) 进行加权求和,得到最终的输出向量 ( o_i ):
    [ o_i = \sum_{j=1}^{n} \alpha_{ij} v_j ]

  6. 多头注意力
    Transformer 模型通常使用多头注意力机制,其中每个头学习不同的表示子空间。上述过程被独立地应用到多个头(h 个),然后将结果拼接起来,并通过一个线性层进行投影,以得到最终的输出:
    [ \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, …, \text{head}_h) W^O ]
    其中每个头的计算为:
    [ \text{head}_h = \text{Attention}(Q W_h^Q, K W_h^K, V W_h^V) ]
    ( W_h^Q, W_h^K, W_h^V ) 和 ( W^O ) 是可学习的权重矩阵。

  7. 位置编码
    由于 Transformer 模型本身不具备捕捉序列顺序的能力,通常会将位置编码添加到输入向量中,以便模型能够利用序列中元素的位置信息。

自注意力机制允许模型在序列的每个位置集中注意力于不同的部分,这使得它非常适合处理长距离依赖问题。在 LightGlue 模型中,自注意力机制被用来更新局部特征点的表示,以便于在图像匹配任务中找到更好的特征对应关系。

1. multi head self-attention

只需要把不同的 q i , 1 q^{i,1} qi,1 q i , 2 q^{i,2} qi,2 q i , 3 q^{i,3} qi,3 q i , 4 q^{i,4} qi,4 分别当做四个 self-attention 计算即可,具体计算步骤参考 blog:【ML】自注意力机制selfattention
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2. positional encoding

不管是 self-attention 还是 multi head self-attention都是位置无关的算法(举例:根据self-attention,a1 和 a4 或者 a1 与 a2 的举例相关性是一样的,并没有将位置信息编码到 O的的输出中,不反应位置相干的信息,因此为位置无关),这里通过 positional encoding 加入位置信息

在这里插入图片描述
positional encoding 实现方式,上面是其中的一种实现方式,通过认为复制实现
在这里插入图片描述

3. transform 可以应用的其他领域

3.1 语音识别 变体 truncated self-attention

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2 self-attention for image

在这里插入图片描述
在这里插入图片描述

3.3 self-attention v.s. CNN差异
  1. 数据依赖性

    • 自注意力:不依赖于数据的固定大小的局部感受野,可以捕捉序列中任意两个元素之间的关系,无论它们在序列中的位置如何。
    • CNN:依赖于固定大小的卷积核来捕捉局部空间特征,适合处理具有强烈局部相关性的数据,如图像。
  2. 参数共享

    • 自注意力:在计算注意力权重时,参数(如查询、键、值的投影矩阵)在整个序列上共享。
    • CNN:卷积核的参数在整个输入数据上共享,但在不同的卷积层上有不同的参数集。
  3. 时间/空间复杂度

    • 自注意力:计算复杂度与序列长度的平方成正比((O(n^2))),其中 (n) 是序列长度,因为需要计算序列中每个元素对其他所有元素的注意力。
    • CNN:计算复杂度通常与卷积核的数量和大小成正比,以及输入数据的维度((O(k^2 \cdot h \cdot w))),其中 (k) 是卷积核的大小,(h) 和 (w) 是输入数据的高度和宽度。
  4. 并行化能力

    • 自注意力:可以很容易地并行化,因为序列中任意两个元素的注意力计算是独立的。
    • CNN:虽然卷积操作可以并行化,但在处理序列数据时,可能需要考虑时间维度上的依赖性。
  5. 长距离依赖

    • 自注意力:能够直接捕捉长距离依赖,因为它可以计算序列中任意两点之间的关系。
    • CNN:在捕捉长距离依赖方面可能受限,尤其是在没有使用额外结构(如残差连接)的情况下。
  6. 可解释性

    • 自注意力:通过注意力权重提供了一定程度的可解释性,可以直观地看到模型关注输入的哪些部分。
    • CNN:通常较难解释,因为特征检测是通过多层卷积和非线性激活函数抽象得到的。
  7. 应用领域

    • 自注意力:广泛应用于自然语言处理(NLP)、序列标注、机器翻译等序列建模任务。
    • CNN:在图像和视频识别、图像分割、物体检测等计算机视觉任务中非常流行。
  8. 变体和扩展

    • 自注意力:有多头注意力等变体,可以并行地学习输入数据的不同表示。
    • CNN:有多种扩展,如残差网络(ResNet)、卷积LSTM等,用于改善性能和解决特定问题。
  9. 内存使用

    • 自注意力:可能需要更多的内存,特别是对于长序列,因为它需要存储完整的注意力矩阵。
    • CNN:内存使用相对较低,尤其是当使用稀疏连接和深度可分离卷积等技术时。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.4 self-attention v.s. RNN

自注意力(Self-Attention)机制和递归神经网络(RNN)是两种不同的序列处理方法,它们在处理数据时有以下主要差异:

  1. 时间复杂度

    • 自注意力:计算复杂度与序列长度的平方成正比,即 (O(n^2 \cdot d)),其中 (n) 是序列长度,(d) 是特征维度。这是因为自注意力机制需要计算序列中每个元素对其他所有元素的注意力得分。
    • RNN:计算复杂度与序列长度线性相关,即 (O(n \cdot d))。RNN通过递归地处理序列中的每个元素,每次只处理一个元素及其在序列中之前的元素。
  2. 并行化能力

    • 自注意力:由于自注意力机制独立于序列中元素之间的相对位置,它可以很容易地并行化处理整个序列,这使得它在现代硬件上更高效。
    • RNN:由于其递归性质,RNN 在处理序列时需要按顺序逐步进行,这限制了其并行化的能力,尤其是在长序列上。
  3. 长距离依赖

    • 自注意力:能够捕捉长距离依赖关系,因为它直接计算序列中任意两个元素之间的关系,不受它们之间距离的限制。
    • RNN:在长序列上可能会遇到梯度消失或梯度爆炸的问题,这使得它难以捕捉长距离依赖。
  4. 内存使用

    • 自注意力:需要存储整个序列的注意力矩阵,这可能导致较高的内存消耗,尤其是在长序列上。
    • RNN:通常只需要存储前一时刻的隐藏状态,因此内存使用相对较低。
  5. 模型参数

    • 自注意力:参数数量与序列长度无关,只与特征维度有关。
    • RNN:参数数量同样与序列长度无关,但与隐藏层的维度有关。
  6. 灵活性和可解释性

    • 自注意力:通过注意力权重提供了一定程度的可解释性,可以直观地看到模型关注序列中哪些部分。
    • RNN:其内部状态更新机制通常较难解释。
  7. 变体和扩展

    • 自注意力:有多种变体,如多头注意力(Multi-Head Attention),可以并行地学习序列的不同表示。
    • RNN:有多种扩展,如长短期记忆网络(LSTM)和门控循环单元(GRU),这些模型通过引入门控机制来解决梯度消失问题。
  8. 应用领域

    • 自注意力:广泛应用于自然语言处理(NLP)、图像处理和其他序列建模任务,特别是在 Transformer 模型中。
    • RNN:在序列到序列(Seq2Seq)模型、语言模型和时间序列预测等领域有广泛应用。

在这里插入图片描述
在这里插入图片描述

3.5 GNN

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSP 2022 提高级第一轮 - CSP/S 2022初试题 程序阅读第三题解析

一、代码查看 1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 <&l…

IO流学习总结

IO流体系 字节流 字节流&#xff1a; 字节输出流:FileOutputStream 程序---写--->文件 字节输入流:FileInputStream 程序<---读---文件 字节输出流(FileOutputStream) Testpublic void testIO01() throws IOException {/*new FileOutputStream文件不存在创建文件父…

最新CSS3纵向菜单的实现

纵向菜单 通过下面例子&#xff0c;你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击&#xff0c;真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…

C与Python Socket性能比较

在比较 C 和 Python 的 Socket 性能时&#xff0c;主要考虑以下几个方面&#xff1a; 运行时性能&#xff1a; C 是编译型语言&#xff0c;生成的机器代码运行速度更快&#xff0c;通常能够提供更低的延迟和更高的吞吐量。Python 是解释型语言&#xff0c;运行时有一定的开销&…

分布式时序数据库TimeLyre 9.2发布:原生多模态、高性能计算、极速时序回放分析

在当今数据驱动的世界中&#xff0c;多模态数据已经成为企业的重要资产。随着数据规模和多样性的不断增加&#xff0c;企业不仅需要高效存储和处理这些数据&#xff0c;更需要从中提取有价值的洞察。工业领域在处理海量设备时序数据的同时&#xff0c;还需要联动分析警报信息、…

K8S资源之NameSpace

作用 隔离资源(默认不隔离网络) 查看所有的NS kubectl get ns创建NS kubectl create ns hello删除NS kubectl delete ns hello

GitHub无法识别Markdown的目录

可以直接下载编译好的二进制文件。 二进制文件 下载下来之后&#xff0c;发现没有后缀名无法识别&#xff0c;实际上这是个exe文件&#xff0c;所以只需要暴力地在后面加上.exe就可以开始愉快使用了。 首先将README.md文档复制到gh-md-toc.exe的根目录下。 接着按住shift键…

Java面试题——第三篇(JVM)

1. 什么情况下会发生栈内存溢出 栈是线程私有的&#xff0c;他的生命周期和线程相同&#xff0c;每个方法在执行的时候都会创建一个栈帧&#xff0c;用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程&#xff0c;就对应着一个栈帧…

室内浮毛空气净化器除臭吗?好用的室内浮毛空气净化器推荐

家里养了5只猫&#xff0c;满天飞的猫毛发&#xff0c;随风飘到各个角落&#xff0c;可以说苦不堪言。养了毛孩子之后&#xff0c;家里异味&#xff0c;鼻炎过敏&#xff0c;宠物掉毛真的是太闹心了&#xff01;水杯里&#xff0c;床上都是小猫咪跑酷睡觉留下的毛毛&#xff0c…

公网域名流量禁用详解

公网域名流量禁用是一个涉及网络安全和流量管理的复杂操作&#xff0c;它通常需要根据具体的网络环境和业务需求来实施。以下是一些可能的步骤和考虑因素&#xff1a; 一、明确禁用目标 首先&#xff0c;需要明确禁用公网域名流量的具体目标。这可能包括&#xff1a; 阻止未…

Vue Flow: 高效构建可视化工作流的利器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

DeEcoStudio快捷键设置

例如 打 bgc 快捷键 直接出 .backgroundColor( ) 第一步&#xff1a;点击文件——>设置 第二步&#xff1a;找到编辑器——>实时模板 第三步&#xff1a;点击加号——>点击实时模板 第四步&#xff1a;设置快捷键 第五步&#xff1a;点击变更——>点击全选…

jangow靶机教程

项⽬地址 https://www.vulnhub.com/entry/jangow-101754/ 用vmware需要修改部分配置&#xff0c;才能通过C段扫描成功 1.在系统启动时(⻓按shift键)直到显示以下界⾯ 选择第⼆个&#xff0c;按回⻋ 继续选择第⼆个 2.按e进⼊编辑&#xff0c;进⼊以下界⾯ 删除"recove…

Linux学习笔记:Linux基础知识汇总(个人复习版)

常用命令&#xff1a; 1、ls -a&#xff1a;显示所有文件&#xff08;包括隐藏文件&#xff09;&#xff0c;简洁版 -l&#xff1a;显示所有文件&#xff0c;详细版 -R&#xff1a;显示所有文件以及子目录下文件&#xff0c;简洁版 可以搭配使用。 2、netstat -i&#x…

gitlab-runner /var/run/docker.sock connect permission denied

usermod -aG docker gitlab-runner sudo service docker restart参考&#xff1a;https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3492

LeetCode接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…

深入SpringBoot:SpringCache的集成与使用

目录 一、SpringCache集成声明式与编程式1. 引入依赖2. SpringCache配置3. key的设置4. 使用 二、SpringCache使用1. 基于声明式注释的缓存1.1 Cacheable注解1.2 Cacheable注解属性1.2.1 CacheManager和CacheResolver1.2.2 cacheName1.2.3 key和KeyGenerator1.2.4 同步缓存 2. …

Linux 内核源码分析---处理 VFS 对象及标准函数

处理VFS对象 注册文件系统&#xff1a;在文件系统注册到内核时&#xff0c;文件系统是编译为模块&#xff0c;或者持久编译到内核中。 fs/super.c 中的register_filesystem用来向内核注册文件系统。我们可以通过/proc/filesystems查看系统所有的文件系统类型。 一个文件系统不…

Idea绿色下载安装教程-最新,2024版本通用-附下载链接

插件链接&#xff1a; 脚本 Idea下载安装完成后 进入激活码输入页面&#xff0c;然后关闭IDEA 按照下面流程进行激活 1. 按照以下步骤&#xff0c;亲测可用&#xff0c;记得一定要先关闭idea 2. 选择对应软件 3.选择bin、目录对应选项 5.激活 6.成功