深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤

  • 前言
  • 一、介绍和意义
  • 二、 计算细节
    • 2.1 计算Attention Score
    • 2.2 计算value
    • 2.3 计算关联结果b
    • 2.4 统一计算
  • 三、总结

前言

Transformer是一种非常常见且强大的深度学习网络架构,尤其擅长处理输出为可变长度向量序列的任务,如自然语言处理(NLP)和图(Graph)处理。Transformer采用了self-attention机制,克服了传统循环神经网络(RNN)在处理长序列时存在的梯度消失和并行计算困难的问题。本文将详细介绍self-attention机制的定义和计算细节。

如果觉得该笔记对您有用的话,可以点个小小的赞,或者点赞收藏关注一键三连ヾ(◍’౪`◍) ~ 谢谢!!

一、介绍和意义

Self-attention是一种计算输入序列中每个元素对其他所有元素的重要性权重的方法。它主要用于捕捉序列数据(如文本)中的长期依赖关系和上下文信息。尽管类似的功能可以通过全连接层(fully-connected layer)实现,但当输入长度非常大时,全连接层的参数计算量会爆炸性增加,导致计算负担过大。以下图为例,当输入为4个节点时,全连接层的计算量已经非常巨大(箭头数量),可以想象当输入增多后的计算量。在这里插入图片描述
为了解决以上问题,Self-attention便被提了出来。主要计算步骤如下(注意在本文中,所有的计算公式都是基于上图中四个输入(这四个输入将在一个向量中)的例子,即输入为 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3, a_4 a1a2a3a4)。

二、 计算细节

2.1 计算Attention Score

Self-attention用于捕捉上下文信息,因此引入了注意力分数(Attention Score) α \alpha α。给 α \alpha α加上下标后,就可以代表任意两个节点之间的关联程度了。比如 α 1 , 2 \alpha{_1,_2} α1,2代表了节点a1和a2之间的关联程度。为计算关联程度因子 α \alpha α,我们引入了三个向量Query, Key和Value,分别用首字母q,k,v来表示。这里首先介绍q,k和 α \alpha α的计算公式:
q i = W q ⋅ a i k j = W k ⋅ a j α i , j = q i ⋅ k j q^i = W^q \cdot a^i \\ k^j = W^k \cdot a^j \\ \alpha{_i,_j} = q^i \cdot k^j qi=Wqaikj=Wkajαi,j=qikj
解释:首先对于每个输入 a i a^i ai(如单词的嵌入),通过乘上 W q W^q Wq获得对应的 q i q^i qi,之后对任意输入 a j a^j aj乘上 W k W^k Wk获得 k j k^j kj,将这两个值相乘即可获得输入 a i a^i ai a j a^j aj的关联程度,即注意力分数为 α i , j = q i ⋅ k j \alpha{_i,_j} = q^i \cdot k^j αi,j=qikj。如下图所示。在这里插入图片描述
当然输入 a i a^i ai也可以用自己的q乘k得到自己与自己的关联程度,比如 α 1 , 1 \alpha{_1,_1} α1,1可由 q 1 ⋅ k 1 q^1 \cdot k^1 q1k1计算得到。最后,将得到的结果输入一个softmax层中,使用softmax函数对注意力分数进行归一化,得到每个输入节点对其他输入向量的权重,即获得处理后的attention sore α ′ \alpha^{\prime} α,如下图所示(右上角是softmax计算公式)。
在这里插入图片描述

2.2 计算value

再将向量 W q W_q Wq乘上对应的输入向量a,得到对应的v值,公式为:
v i = W v ⋅ a i v^i = W_v \cdot a^i vi=Wvai这与 Query 和 Key 的计算方式一致。将每个输入向量对应的v值全部计算出来,如下图所示。

在这里插入图片描述

2.3 计算关联结果b

最终我们可以得到Self-attention针对单个输入 a 1 a_1 a1的输出结果 b 1 b^1 b1
b 1 = ∑ i α 1 , i ′ ⋅ v i b^1 = \sum_{i} \alpha_{1,i}^{\prime} \cdot v^i b1=iα1,ivi根据这个公式,我们可以看出,某个上下文向量同a1的关联程度越高,对应的值在b中的占比就越大。
在这里插入图片描述

2.4 统一计算

上述计算都是针对单个输入进行的,在这里我们将将输入看成一个整体,即一整个输入向量,来再次梳理整个计算步骤。

  1. 首先我们可以将所有输入向量统合到一起,形成一个向量为I,这里依旧用图中的4个输入为例,公式为:
    I = [ a 1 a 2 a 3 a 4 ] I = [ a^{1} \ a^{2} \ a^{3} \ a^{4} ] I=[a1 a2 a3 a4]
  2. 其次我们可以计算统一的Q,K和V:
    Q = [ q 1 q 2 q 3 q 4 ] = W q ⋅ [ a 1 a 2 a 3 a 4 ] = W q ⋅ I K = [ k 1 k 2 k 3 k 4 ] = W k ⋅ [ a 1 a 2 a 3 a 4 ] = W k ⋅ I V = [ v 1 v 2 v 3 v 4 ] = W v ⋅ [ a 1 a 2 a 3 a 4 ] = W v ⋅ I Q = [ q^{1} \ q^{2} \ q^{3} \ q^{4}] = W^q \cdot [ a^{1} \ a^{2} \ a^{3} \ a^{4} ] = W^q \cdot I \\ K = [ k^{1} \ k^{2} \ k^{3} \ k^{4} ] = W^k \cdot [ a^{1} \ a^{2} \ a^{3} \ a^{4} ] = W^k \cdot I\\ V = [ v^{1} \ v^{2} \ v^{3} \ v^{4} ] = W^v \cdot [ a^{1} \ a^{2} \ a^{3} \ a^{4} ] = W^v \cdot I Q=[q1 q2 q3 q4]=Wq[a1 a2 a3 a4]=WqIK=[k1 k2 k3 k4]=Wk[a1 a2 a3 a4]=WkIV=[v1 v2 v3 v4]=Wv[a1 a2 a3 a4]=WvI
  3. 此时,我们可以把输入节点a1的关联分数 α \alpha α 写成如下公式:
    [ α 1 , 1 α 1 , 2 α 1 , 3 α 1 , 4 ] = q 1 ⋅ [ k 1 k 2 k 3 k 4 ] [\alpha_{1,1} \ \alpha_{1,2} \ \alpha_{1,3} \ \alpha_{1,4} \ ] = q^1 \cdot [k^{1} \ k^{2} \ k^{3} \ k^{4}] [α1,1 α1,2 α1,3 α1,4 ]=q1[k1 k2 k3 k4]同理,剩下三个输入向量的关联分数公式为:
    [ α 2 , 1 α 2 , 2 α 2 , 3 α 2 , 4 ] = q 2 ⋅ [ k 1 k 2 k 3 k 4 ] [ α 3 , 1 α 3 , 2 α 3 , 3 α 3 , 4 ] = q 3 ⋅ [ k 1 k 2 k 3 k 4 ] [ α 4 , 1 α 4 , 2 α 4 , 3 α 4 , 4 ] = q 4 ⋅ [ k 1 k 2 k 3 k 4 ] [\alpha_{2,1} \ \alpha_{2,2} \ \alpha_{2,3} \ \alpha_{2,4} \ ] = q^2 \cdot [k^{1} \ k^{2} \ k^{3} \ k^{4}]\\ [\alpha_{3,1} \ \alpha_{3,2} \ \alpha_{3,3} \ \alpha_{3,4} \ ] = q^3 \cdot [k^{1} \ k^{2} \ k^{3} \ k^{4}]\\ [\alpha_{4,1} \ \alpha_{4,2} \ \alpha_{4,3} \ \alpha_{4,4} \ ] = q^4 \cdot [k^{1} \ k^{2} \ k^{3} \ k^{4}] [α2,1 α2,2 α2,3 α2,4 ]=q2[k1 k2 k3 k4][α3,1 α3,2 α3,3 α3,4 ]=q3[k1 k2 k3 k4][α4,1 α4,2 α4,3 α4,4 ]=q4[k1 k2 k3 k4]我们可以发现,当我们把所有输入向量的关联分数放进一个向量A中时,我们会得到:
    A = [ α 1 , 1 α 1 , 2 α 1 , 3 α 1 , 4 α 2 , 1 α 2 , 2 α 2 , 3 α 2 , 4 α 3 , 1 α 3 , 2 α 3 , 3 α 3 , 4 α 4 , 1 α 4 , 2 α 4 , 3 α 4 , 4 ] = [ q 1 q 2 q 3 q 4 ] ⋅ [ k 1 k 2 k 3 k 4 ] = Q T ⋅ K A = \begin{bmatrix} \alpha_{1,1} & \alpha_{1,2} & \alpha_{1,3} & \alpha_{1,4} \\ \alpha_{2,1} & \alpha_{2,2} & \alpha_{2,3} & \alpha_{2,4} \\ \alpha_{3,1} & \alpha_{3,2} & \alpha_{3,3} & \alpha_{3,4} \\ \alpha_{4,1} & \alpha_{4,2} & \alpha_{4,3} & \alpha_{4,4} \\ \end{bmatrix} = \begin{bmatrix} q^1 \\ q^2 \\ q^3 \\ q^4 \\ \end{bmatrix} \cdot \begin{bmatrix} k^1 & k^2 & k^3 & k^4 \end{bmatrix} =Q^T \cdot K A= α1,1α2,1α3,1α4,1α1,2α2,2α3,2α4,2α1,3α2,3α3,3α4,3α1,4α2,4α3,4α4,4 = q1q2q3q4 [k1k2k3k4]=QTK
    最后,通过softmax得到最终的注意力矩阵(Attention Matrix) A ′ A^\prime A值:
    A ′ = [ α 1 , 1 ′ α 1 , 2 ′ α 1 , 3 ′ α 1 , 4 ′ α 2 , 1 ′ α 2 , 2 ′ α 2 , 3 ′ α 2 , 4 ′ α 3 , 1 ′ α 3 , 2 ′ α 3 , 3 ′ α 3 , 4 ′ α 4 , 1 ′ α 4 , 2 ′ α 4 , 3 ′ α 4 , 4 ′ ] = s o f t m a x ( A ) A^\prime = \begin{bmatrix} \alpha_{1,1}^\prime & \alpha_{1,2}^\prime & \alpha_{1,3}^\prime & \alpha_{1,4}^\prime \\ \alpha_{2,1}^\prime & \alpha_{2,2}^\prime & \alpha_{2,3}^\prime & \alpha_{2,4}^\prime \\ \alpha_{3,1}^\prime & \alpha_{3,2}^\prime & \alpha_{3,3}^\prime & \alpha_{3,4} ^\prime\\ \alpha_{4,1}^\prime & \alpha_{4,2}^\prime & \alpha_{4,3}^\prime & \alpha_{4,4}^\prime \\ \end{bmatrix} =softmax( A ) A= α1,1α2,1α3,1α4,1α1,2α2,2α3,2α4,2α1,3α2,3α3,3α4,3α1,4α2,4α3,4α4,4 =softmax(A)
  4. 此时我们已经得到了整体的关联分数向量 A ′ A^\prime A和整体的Value向量,就可以通过相乘得到对应每输入个位置的加权和,就是整体的输出结果向量O:
    O = [ b 1 b 2 b 3 b 4 ] = [ v 1 v 2 v 3 v 4 ] ⋅ A ′ = V ⋅ A ′ O = [b^1\ b^2\ b^3\ b^4] = [v^1\ v^2\ v^3\ v^4] \cdot A^\prime =V \cdot A^\prime O=[b1 b2 b3 b4]=[v1 v2 v3 v4]A=VA

三、总结

以上就是 self-attention 层的计算步骤。尽管看上去复杂,但实际上在这些计算中只有 W q W^q Wq W k W^k Wk W v W^v Wv是需要在网络中学习的参数,输入 I 在输入层就会传递给网络,剩下的都是基于这些参数的计算。
self-attention 机制的核心在于能够并行计算,极大地提升了训练和推理效率,特别适合 GPU 加速。这是 self-attention 相比 RNN 的一个重要优势。通过 self-attention 机制,Transformer 可以在处理长序列时有效地捕捉到序列中的长期依赖关系和上下文信息,解决了传统 RNN 的一些主要问题。在下一篇文章中,我们将深入探讨 Transformer 的整体架构。

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

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

相关文章

低空经济重要意义

1. 推动经济高质量发展:低空经济作为新质生产力的代表,产业链条长、成长性好、市场空间大、绿色环保,有助于培育竞争新优势、打造增长新引擎、增强发展新动能。 2. 促进产业结构优化升级:低空经济的发展有助于推动相关产业的快速…

网络原理———TCP/IP—网络层IP协议

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 网络层IP协议4位版本号4位首部长度8位服务类型16位总长度16位标识 3位标志 13位片偏移8位生存时间8位协议16位首部校验和32位源IP地址 和 32位目的IP地址方案1:动态分配IP地址方案2:NAT机…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

C语言(内存函数)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项

文章目录 第十四章 创建Web客户端 - XML 命名空间的 SOAP 向导选项XML 命名空间的 SOAP 向导选项添加 NAMESPACE 类参数对文档样式 Web 方法使用未包装的消息格式不创建数组属性为可为 null 的元素生成 XMLNIL 属性参数为可为 nillable 元素生成 XMLNILNOOBJECT 属性参数将 XML…

基于Open3D的点云处理20- 基于Visualizer类自定义可视化

1. 自定义可视化 官网测试用例 Open3D/examples/python/visualization/customized_visualization.py 自定义可视化工具窗口-Visualizer 类 Visualizer 可视化基础操作def custom_draw_geometry(pcd):# The following code achieves the same effect as:# o3d.visualization.d…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大,容错率低,…

Minio的图片下载

一 为什么要写下载? 正常使用Minio的时候,其实是不用单独再写下载功能的,因为使用Minio上传的时候,可以再返回结果里带上地址,可直接点击地址进行下载,可如果现在既要预览又要下载,就需要单独写一个下载功能. 1 代码如下 Minio使用的初始化 private void init() {minioClien…

【思考】服务的吞吐量与请求耗时的关系

吞吐量即服务1s内可以处理的最大请求数,即最大可以支撑的QPS;请求耗时就更好理解了,即处理一次请求所需要耗费的时间。 明显这两个指标都是用来衡量服务的性能的,但两者之间的关系是什么呢?他们之间是否存在一些相互的…

spdlog日志库源码:输出通道sink

概述 在 spdlog 日志库中,sinks 并不是一个单独的类,而是一系列类的集合,这些类以基类-派生类的形式组织,每一个 sink 派生类代表了一种输出日志消息的方式。输出目标可以是普通文件、标准输出 (stdout)、标准错误输出 (stderr)、…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

Pytest框架中的Setup和Teardown功能

在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数(Hook…

详解 Scala 的模式匹配

一、基本语法 Scala 中的模式匹配类似于 Java 中的 switch 语法,但是功能更强大 /**[var a / def func() ] var_name match {case value1 > statement1case value2 > statement2case value3 > statement3case _ > defaultOP} */ object TestMatchCase…

Python——cv2 判断图像读取内容是否为空

import cv2 pic_path"xxx.jpg" imagecv2.imread(pic_path) if None image:print("图片为空") else:print("图片不为空")

ubuntu上zsh与bash切换

在Ubuntu上切换zsh和bash,你可以使用命令行。 切换到zsh: chsh -s $(which zsh)切换回bash: chsh -s $(which bash)注意:chsh命令可能需要你输入你的用户密码。 如果你想立即启动新shell,而不用重启,可以运行: ex…

java中的线程安全的容器

ReentrantLock 和 Condition 都是基于 AbstractQueuedSynchronizer (AQS) 实现的。 以下是 ReentrantLock 与 AQS 的关系: ReentrantLock 状态管理:ReentrantLock 通过 AQS 的 state 变量来表示锁的状态。状态为 0 表示锁未被持有,状态为 1…

【python】YOLO目标检测txt标签转xml,支持与原xml标签融合

需求: 利用现有yolo模型权重实现自动标注功能,即使用yolov5源码中的detect.py对待标注图像执行推理任务,并使用--save-txt保存标签文件,然后使用本文python代码直接将detect.py生成的txt标签转为xml标签,最后再使用la…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识,BOM,作业手顺(工艺路线),作业区(工作中心),MRP,MPS等概念,现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM,派生BO…

5门编程语言哪个好一点:深入剖析与选择指南

5门编程语言哪个好一点:深入剖析与选择指南 在编程的广阔领域中,各种语言如繁星般璀璨,各有其独特之处。对于初学者或寻求转型的开发者来说,如何选择一门合适的编程语言往往令人头疼。本文将针对五门热门编程语言进行详细剖析&am…

STC8增强型单片机进阶开发--独立按键

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 原理图 按键消抖 软件设计 要求 分析 实现单个按钮 实现多个按钮 使用位操作存储状态 总结 前言 本次学习旨在探索按键操作及按键消抖的原理和实现方法。通过学习原理图、按键消抖的三种方法以及软件设计的要…