Self-Attention 自注意力机制(二)——实例过程说明

news2024/9/24 7:23:37

一、自注意力机制核心过程

自注意力机制(Self-Attention Mechanism),也称为内部注意力机制,是一种在序列模型中用于捕捉序列内部不同位置之间依赖关系的技术。这种机制允许模型在处理序列时,对序列中的每个元素分配不同的权重,这些权重反映了元素之间的相互关系。自注意力机制的关键在于它不需要像循环神经网络(RNN)那样逐步处理序列,因此可以并行化计算,并且可以捕捉长距离依赖。

  • 自注意力机制的核心原理可以概括为以下几个步骤:
  1. 表示(Representation):对序列中的每个元素(例如单词、时间点等)进行表示,通常通过嵌入(Embedding)层将元素转换为固定维度的向量。

  2. 查询(Query)、键(Key)、值(Value):将每个元素的表示向量分解为三个向量:查询(Q)、键(K)、值(V)。这些向量可以是同一个表示的不同线性变换,也可以通过不同的网络层来学习。

  3. 注意力分数(Attention Scores):计算每个元素的查询向量与序列中所有键向量之间的相似度得分。这通常通过点积(Dot Product)来实现,然后通常会应用一个缩放因子(例如除以键向量的维度的平方根),以避免梯度消失或爆炸问题。

  4. 权重分配(Weighting):使用softmax函数对注意力分数进行归一化处理,得到每个元素对于序列中其他元素的权重。归一化确保了所有权重的和为1。

  5. 加权求和(Weighted Sum):将归一化的注意力权重与对应的值向量相乘,然后对所有元素的加权值向量求和,得到最终的输出向量。

  6. 输出(Output):得到的加权求和向量可以作为序列中每个元素的输出表示,它包含了序列内部的全局信息。

自注意力机制的一个关键优势是其能够捕捉序列中任意两个元素之间的依赖关系,无论它们在序列中的距离有多远。这种能力使得自注意力机制在处理长序列和复杂依赖关系时特别有效,例如在自然语言处理(NLP)中的翻译、文本摘要、问答系统等任务中。

在深度学习框架中,自注意力机制可以通过多头注意力(Multi-Head Attention)进一步扩展,其中模型并行地执行多个自注意力层,每个层学习到序列的不同表示子空间,最终将这些表示合并,以捕获更丰富的信息。这种机制在Transformer模型中得到了广泛应用。

  • 数学上,嵌入层过程可以表示为: Embedding(𝑤)=𝐸×OneHot(𝑤) 其中:

  • 𝐸 是嵌入权重矩阵。
  • 𝑤是词汇表中的单词或标记。
  • OneHot(𝑤) 是单词 𝑤 的独热编码向量。
  • Embedding(𝑤) 是单词 𝑤的嵌入向量。

详细过程通过下述例子说明。如机器翻译,有一个英文句子 "I love natural language " 需要翻译成另一种语言。在使用自注意力机制的模型中,首先会将每个单词转换为一个向量形式,这些向量是通过嵌入层得到的。

二、表示或嵌入过程:

嵌入层(Embedding Layer)是一种在深度学习和机器学习中常用的技术,特别是在处理自然语言处理(NLP)任务时。嵌入层的主要作用是将离散的输入数据(如单词、字符或其他类型的标记)转换为连续的向量表示。这些向量捕捉了输入数据的语义和语法特征。

嵌入层的数学表达通常如下: Embedding(w)=E×w 其中,𝑤 是离散的输入单词或标记,𝐸是嵌入权重矩阵,Embedding(𝑤)是单词 𝑤的连续向量表示。在实际应用中,嵌入层通常作为模型的第一层,为后续的神经网络层(如卷积层、循环层或Transformer层)提供输入。

嵌入层将离散的单词或标记转换为实数向量的过程通常涉及以下几个步骤:

  • 词汇表构建:首先,需要构建一个词汇表,其中包含所有在训练数据中出现的唯一的单词或标记。每个单词或标记在词汇表中被分配一个唯一的索引。

如:"I love natural language "只包含4个单词:["I", "love", "natural", "language"]。我们想要将这些单词嵌入到一个2维的空间中(即嵌入维度为2)。词汇表索引分配可能是这样的:

I      -> 索引 0
love   -> 索引 1
natural-> 索引 2
language-> 索引 3

  • 权重矩阵初始化:嵌入层由一个权重矩阵定义,其行数等于词汇表的大小,列数是嵌入的维度。权重矩阵最初是随机初始化的。

如:初始化一个4x2的权重矩阵 𝐸,随机分配小的实数值:

E =\begin{bmatrix} 0.2& 0.5&-0.1 &0.3 \\ 0.1 & 0.3& 0.4 & 0.7 \end{bmatrix}

  • 独热编码:输入的单词或标记首先被转换为独热编码向量。这意味着对于词汇表中的每个单词,都有一个长度等于词汇表大小的向量,其中只有一个位置是1(表示该单词),其余位置都是0。

如对于输入的单词 "love",我们创建一个独热编码向量:

OneHot("love") =\begin{bmatrix} 0\\ 1\\ 0\\ 0 \end{bmatrix}

  • 矩阵乘法:然后,独热编码向量与嵌入权重矩阵进行矩阵乘法运算。这一步将每个单词的独热编码向量映射到一个实数向量,即嵌入向量。

将独热编码向量与权重矩阵相乘,以得到 "love" 的嵌入向量:

    Embedding("love") = E \times OneHot("love") =\begin{bmatrix} 0.2& 0.5&-0.1 &0.3 \\ 0.1 & 0.3& 0.4 & 0.7 \end{bmatrix}\times\begin{bmatrix} 0\\1 \\ 0\\ 0\end{bmatrix}=\begin{bmatrix} 0.5\\ 0.3\end{bmatrix}

  • 输出嵌入向量:结果是每个单词或标记的嵌入向量,这些向量是连续的实数,并且包含了单词的语义信息。

结果 Embedding("𝑙𝑜𝑣𝑒")就是单词 "love" 的嵌入向量\begin{bmatrix} 0.5\\ 0.3\end{bmatrix}

这个嵌入向量,现在可以作为神经网络的输入,用于各种下游任务,如文本分类、情感分析或机器翻译等。

  • 位置编码

此外,有时还进行位置编码(这个可根据情况选择)。因为Transformer模型不包含递归或卷积结构,因此无法捕捉序列中单词的顺序信息。为了解决这个问题,通常会给嵌入向量加上位置编码,以提供单词在序列中的位置信息。位置编码的维度与嵌入向量的维度相同,确保可以直接相加。位置编码通常采用正弦和余弦函数的线性组合来实现,可以表示为: 

  • PE(pos,2i)=sin(pos/10000^{2i/dmodel})
  • PE(pos,2i+1)=cos(pos/10000^{2i/dmodel})

其中,𝑝𝑜𝑠 是单词的位置,𝑖是维度索引,𝑑𝑚𝑜𝑑𝑒𝑙是模型的维度。

如对于单词 "love",他的索引为1,即pos=1;维度索引i=0或1,维度dmodel=2

PE(1,0)=sin(1/10000^{2*0/2})=sin(1)

PE(1,1)=cos(1/10000^{2*0/2})=cos(1)

位置编码向量 𝑃𝐸(1)=[sin⁡(1),cos⁡(1)]

然后,每个单词的嵌入向量会加上对应位置的编码向量。这意味着每个位置将有一个唯一的位置编码向量,与该位置的单词嵌入向量相加。

即单词 "love" 的嵌入向量就变成了:E= Embedding("love") + PE(1)

这样,每个单词的嵌入向量不仅包含了自身的语义信息,还包含了其在句子中的位置信息,使得模型能够更好地理解单词之间的顺序关系。

三、查询(Query)、键(Key)、值(Value)

 (1)权重矩阵的初始化

对于自注意力机制中的每个组件(Q、K、V),模型会使用不同的线性变换。这些变换由模型的参数决定,通常是可学习的权重矩阵。给定一个嵌入向量 𝐸,这些变换可以表示为:

  • 查询(Q): Q=W_{Q}*E
  • 键(K): K=W_{k}*E
  • 值(V):V=W_{V}*E

其中,W_{Q}​,W_{K}W_{V}​ 是模型需要学习的权重矩阵,分别对应于查询、键和值的生成。

如:初始化生成 Q、K、V 的权重矩阵 W_{Q}​,W_{K}W_{V}​ ​。这些矩阵是随机初始化的。

如:对单词“love”的生成的Q、K、V的权重矩阵随机生成为:

W_Q =\begin{bmatrix} 0.1&0.3\\ 0.2&0.4\end{bmatrix} ,W_K =\begin{bmatrix} 0.4&0.6\\ 0.5&0.8\end{bmatrix} , W_V = \begin{bmatrix} 0.7&0.9\\ 0.8&1.0\end{bmatrix}

在多头注意力(Multi-Head Attention)中,通常会将嵌入向量的维dmodel​ 分割成多个头,每个头处理一部分维度。例如,如果 dmodel​=512 并且我们使用 8 个头,那么每个头将处理 512/8=64 维的数据。将每个嵌入向量 𝐸 根据头数分割成多个部分,以便每个头可以独立地处理数据。例如,如果 𝐸是一个长度为 512 的向量,我们会将其分割成 8 个长度为 64 的向量。

(2)生成Q、K、V(Generating Q, K, V):

  • 对于序列中的每个单词,使用对应的权重矩阵 𝑊𝑄​,𝑊𝐾​,和 𝑊𝑉来生成Q、K、V。
  • 每个头将独立地使用自己的权重矩阵来生成Q、K、V。

如:对单词“love”的计算如下:

Q("love") = W_Q * E("love") =\begin{bmatrix} 0.1&0.3\\ 0.2&0.4\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.14\\ 0.22\end{bmatrix}K("love") = W_K * E("love") =\begin{bmatrix} 0.4&0.6\\ 0.5&0.8\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.38\\ 0.49\end{bmatrix}

V("love") = W_V * E("love") =\begin{bmatrix} 0.7&0.9\\ 0.8&1.0\end{bmatrix} * \begin{bmatrix} 0.5\\ 0.3\end{bmatrix} =\begin{bmatrix} 0.62\\ 0.7\end{bmatrix}

# 以此类推,为 "l", "natural", "language" 计算 Q、K、V。

四、计算注意力得分

自注意力机制中的一个关键步骤是计算查询(Query)和键(Key)之间的相关性或相似性,以确定注意力得分或权值系数。以下是几种常见的方法:

1)点积注意力(Dot-Product Attention):

  • 点积注意力是最常见的注意力计算方式。给定查询 𝑄 和键 𝐾,计算它们的点积来衡量它们的相似性: Attention(Q,K)=Q\cdot K^{T}
  • 这种方法简单且计算效率高,但在计算点积之前通常会对键的维度进行缩放,以避免较大的数值影响softmax函数的稳定性: Attention(Q,K)=\frac{Q\cdot K^{T}}{\sqrt{d_{k}}},其中 d_{k}是键 𝐾 的维度。
  • 注意:点乘简而言之就是矩阵各对应元素相乘。要求两个矩阵的维度相容,即第一个矩阵的列数等于第二个矩阵的行数。所以将K转置,计算规则为:A\cdot B=\begin{bmatrix} a\\ b \end{bmatrix}\cdot [c \ \ d]=ac+bd

2)缩放点积注意力(Scaled Dot-Product Attention):

  • 缩放点积注意力是Transformer模型中使用的,它结合了点积和缩放操作: Attention(Q,K)=\frac{Q\cdot K^{T}}{\sqrt{d_{k}}},其中 d_{k}是键 𝐾 的维度。
  • 缩放因子\sqrt{d_{k}}确保了softmax函数在计算过程中的稳定性。

3)余弦相似度(Cosine Similarity):

  • 余弦相似度度量了两个向量在方向上的相似性,而不是大小。计算公式为: Attention(Q,K)=\frac{QK^{T}}{\parallel Q\parallel \parallel K\parallel }
  • 余弦相似度通常用于衡量两个向量的方向是否相似,但对长度不敏感。

4)多层感知器(MLP):

  • 可以使用一个小型的神经网络(通常是一个或多个全连接层)来学习查询和键之间的复杂关系:Attention(Q,K)=MLP(Q,K)
  • 这种方法可以捕捉非线性关系,但计算成本更高,且不如点积注意力直观。

5)加性注意力(Additive Attention):

  • 加性注意力通过一个线性层和激活函数来计算查询和键之间的相似性: Attention(Q,K)=Vtanh(W_{Q}Q+W_{K}K)
  • 其中 W_{Q}和 W_{K}​ 是可学习的权重矩阵,V是另一个可学习的权重向量。

如对单词 "love" 采用缩放点积法计算查询向量 𝑄("𝐼")和键向量 𝐾("𝑙𝑜𝑣𝑒")的相似度得分,假设已求出Q("I")=\begin{bmatrix} 0.12\\ 0.20 \end{bmatrix}:即

Similarity("I","love")=\frac{Q("I") K("love")^{T}}{\sqrt{d_{k}}}=\begin{bmatrix} 0.12\\ 0.20 \end{bmatrix}[0.14,0.22]/\sqrt{2}=(0.12\times 0.14+0.20\times 0.22)/\sqrt{2}\approx 0.043

即:I和love的相似度得分约为0.043

五、权重分配:应用Softmax函数

计算得到的注意力得分随后会通过一个softmax函数进行归一化,以生成权重系数,这些权重系数表示在生成输出时对值(Value)向量进行加权的强度。归一化后的权重系数之和为1,确保了模型在所有可能的输入上都有一个有效的概率分布。

Weights = softmax(Attention(Q,K))

  • softmax函数含义

Softmax函数是一种在机器学习和深度学习中常用的激活函数,特别是在处理概率分布时。它将一个向量或一组数值转换成概率分布,使得所有输出值的和为1。在自注意力机制中,Softmax函数用于对相似度得分进行归一化,从而得到每个元素的注意力权重。

Softmax函数定义为:Softmax(s_{i})=e^{s_{i}}/\sum_{j}e^{s_{j}} 其中,s_{i} 是第 𝑖个元素的相似度得分,而 𝑗 遍历所有元素。

使用softmax函数对所有单词(在这个例子中是 "I" 和 "love")的相似度得分进行归一化,得到单词 "I" 对 "love" 的注意力权重 𝑤:

w("I","love")=softmax(Similarity("I","love")) =\frac{\exp(\text{Similarity}("I", "love"))}{\sum_{j}\exp(\text{Similarity}("I", w_j))}

这里 𝑤𝑗​ 表示序列中的第 𝑗个单词。

如假设I love natural language 中其他单词与“I”和“love”的相似度得分分别为:“s_{I - natural} = 0.033),“s_{I - language} = 0.022),“s_{love - natural} = 0.053),“s_{love - language} = 0.043)。其中s_{I - natural}表示I和natural的相关度,则:Softmax("love")=e^{0.043}/(e^{0.043}+e^{0.033}+e^{0.022}+e^{0.043}+)\approx 0.252

因此,单词“I”对“love”的注意力权重约为0.252。

六、计算最终的注意力输出

这些权重系数随后用于对值(Value)向量进行加权求和,得到最终的输出向量。这个过程允许模型动态地聚焦于输入序列中与当前处理元素最相关的部分。

最后,使用归一化的注意力权重 𝑤 来加权单词 "love" 的值向量 V("love"),得到单词 "I" 的最终注意力输出:

Output("I")=\sum_{j}w("I",w_{j})V(W_{j})

这个输出将结合序列中所有单词的信息,根据它们与 "I" 的相关性进行加权。

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

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

相关文章

基于 Web 的家校联系系统的设计与实现

目录 基于 Web 的家校联系系统的设计与实现 一、绪论 (一)研究背景 (二) 研究目的 (三) 研究意义 二、需求分析 (一) 功能需求 (二) 性能需求 &#…

【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C中的类的定义方式,并提出了一些注意事项,最后描述了类的大小的计算方法。 一、什么是面向对象? 1.面向对象的概念 …

解决一下git clone失败的问题

1).不开梯子,我们用https克隆 git clone https://github.com 报错: Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法: 开梯子,然后# 注意修改成自己的IP和端口号 gi…

自适应巡航控制中的Stop Go功能详解

自适应巡航控制中的跟车行驶功能详解 文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例6. 总结与展望 1. 背景介绍 自适应巡航控制(Adaptive Cruise Control, ACC)系统中的Stop & Go功能是提升驾驶舒适性和安全性的重要子…

Qt Splash样式的登录窗

Qt Splash样式的登录窗实现 目录 0 结果 1. 设计界面 2.鼠标拖动界面 3. 密码MD5加密 4. 保用户名和密码到注册表 0 结果 1. 设计界面 继承自QDialog,图片使用QLabel加载,windowFlag样式为 Qt::SplashScreen TLoginForm::TLoginForm(QWidget *pa…

PPOCR训练后acc为0解决方法

首先你需要先配置PPOCR源码和环境,可以按照如下流程 PPOCR训练和C#部署英文字符训练_ppocrlabel可以终端运行吗-CSDN博客 训练时如下 如下是rec训练模型 acc为0 det也是如此 如下没有 名为best的模型文件 解决办法就是 将如下的train和eval部分的batch_siz…

挂耳式蓝牙耳机什么牌子好?这五款综合表现遥遥领先

为什么这几年开放式耳机受到了越来越多消费者的喜爱?我想是因为它全方位的弥补了入耳式耳机堵塞耳朵、不够安全健康的缺陷,真正做到了安全性与舒适性兼得。那么刚入坑开放式耳机的小白该如何挑选一款品质较高的开放式耳机呢?挂耳式蓝牙耳机什…

第59期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

Python酷库之旅-第三方库Pandas(027)

目录 ​一、用法精讲 68、pandas.infer_freq函数 68-1、语法 68-2、参数 68-3、功能 68-4、返回值 68-5、说明 68-6、用法 68-6-1、数据准备 68-6-2、代码示例 68-6-3、结果输出 69、pandas.interval_range函数 69-1、语法 69-2、参数 69-3、功能 69-4、返回值…

JVM--HostSpot算法细节实现

1.根节点枚举 定义: 我们以可达性分析算法中从GC Roots 集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表&a…

硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140437290 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

NDK R25b 交叉编译FFMpeg4,项目集成,附库下载地址

1.准备工作 文件下载: NDK R25b下载地址:Android NDK历史版本下载网址 - 君*邪 - 博客园 (cnblogs.com) FFmpeg4.4.4 下载地址:https://ffmpeg.org/releases/ffmpeg-4.4.4.tar.xz 环境配置: 本次编译环境是在PC虚拟机中使用U…

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 (1&#x…

Oracle线上执行SQL特别慢的原因分析

一、背景: 线上反馈一张表select * from table where idxxx语句执行特别慢,超过60s超时不能处理,第一直觉是索引失效了,开始执行创建索引语句create index index_name on table() online。但是执行了超过20分钟索引还没有创建成功…

NestJs框架getRepository方法废弃解决办法,顺便介绍一下typeORM框架

报错&#xff1a; Connection "default" was not found. ... ...因为 typeorm 版本不对&#xff0c;这是旧版的 api, 可以考虑降版本到 <0.3.0 解决 介绍一下 typeORM 我们如果直接使用 Node.js 操作 mysql 提供的接口&#xff0c; 那么编写的代码就比较底层&a…

彩电上自带的推箱子游戏是什么编程语言开发的?

2000年左右的厦新彩电上&#xff0c;自带了推箱子、华容道游戏。界面如下&#xff1a; 在线版推箱子游戏&#xff0c;网址&#xff1a;https://www.tuixiangzi.cn/ BASIC&#xff0c;全称是Beginners All-purpose Symbolic Instruction Code&#xff0c;含义是初学者通用符号…

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: cmdragon excerpt: 摘要&#xff1a;“Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验”介绍如何使用useHead函数…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【查询密钥别名集(ArkTS)】

查询密钥别名集(ArkTS) HUKS提供了接口供应用查询密钥别名集。 开发步骤 初始化密钥属性集。用于查询指定密钥别名集TAG&#xff0c;TAG仅支持HUKS_TAG_AUTH_STORAGE_LEVEL。调用接口[listAliases]&#xff0c;查密钥别名集。 HarmonyOS与OpenHarmony鸿蒙文档籽料&#xff1…

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…

【Linux 配置静态IP】Ubuntu20.04

最近学习网络编程&#xff0c;为了方便学习需要Ubuntu配置静态IP&#xff0c;网上看了好多贴子跟着试了下可以实现&#xff0c;但重启虚拟机后有时就无法连接&#xff0c;总之各种各样问题&#xff1b;相关的配置方法也比较凌乱&#xff0c;有用netplan 或者 ifupdown ,笔者简单…