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

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

自注意力机制(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://xiahunao.cn/news/3246108.html

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

相关文章

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同,分别是input_size,hidden_size和num_layer foward函数也与RNN类似,只不过返回值除了out外,ht变为(ht,ct) 代码见下图: 2. nn.LSTMCell 初…

SAP ABAP性能优化

1.前言 ABAP作为SAP的专用的开发语言,衡量其性能的指标主要有以下两个方面: 响应时间:对于某项特定的业务请求,系统在收到请求后需要多久返回结果 吞吐量:在给定的时间能,系统能够处理的数据量 2. ABAP语…

React工程化笔记

脚手架可以帮助我们快速的搭建一个项目结构,在我们之前学习 webpack 的过程中,每次都需要配置 webpack.config.js 文件,用于配置我们项目的相关 loader 、plugin,这些操作比较复杂,但是它的重复性很高,而且…

SQL注入问题

一、什么是sql注入 public class TestSql {public static void main(String[] args) {Scanner inScanner new Scanner(System.in);System.out.println("请输入用户名");String username inScanner.nextLine();System.out.println("请输入密码");String …

安卓笔记1-Retrofit2请求自定义接口

1、整体功能概述 安卓项目中使用Retrofit2实现和自定义接口的网络交互,通过Postman模拟服务端,创建自定义接口。 作用 前后端开发进度对不齐时,客户端可利用本功能模拟测试数据。备忘。 缺点 retrofit模拟接口需要配置响应数据类&#xff…

2024网络准入控制系统排行|好用的网络准入系统有哪些?

随着数字化转型的深化及网络安全威胁的日益复杂,网络准入控制系统(NAC)已成为企业安全架构中不可或缺的一部分。NAC系统通过对接入网络的设备进行身份验证、安全检测和策略实施,确保仅允许符合安全标准的设备连接至网络&#xff0…

QT上位机绘制一个表格显示MYSQL数据库(六)

一. QT制作MYSQL表格 database.cpp #include "database.h" #include "ui_database.h"#include <QMessageBox> #include <QDebug> #include <QSqlError>database::database(QWidget *parent) :QWidget(parent),ui(new Ui::database) {u…

【ollama】ollama运行GLM4-9B和CodeGeeX4-ALL-9B

一、下载GGUF模型 glm-4-9b-chat-GGUFcodegeex4-all-9b-GGUF 使用modelscope下载 先安装 pip install modelscope 命令1 modelscope download --modelLLM-Research/glm-4-9b-chat-GGUF --local_dir . glm-4-9b-chat.Q5_K.gguf命令2 modelscope download --modelLLM-Researc…

条件匹配工具之ACL概述

基本概念 ACL&#xff0c;即Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;每个ACL但是是由单条或多条Rule&#xff08;规则&#xff09;组成的一个集合 技术背景&#xff1a; 1.用户需求&#xff1a; 用户对网络服务体验的要求越来越高&#xff0c…

学习测试9-接口测试 3-jmeter

jmeter启动 测试计划 1 创建线程组 2 创建http请求 数据类型 from表单数据可以通过剪切板直接粘贴 JSON数据需要从括号开始复制 3 查看结果树 4 http cookie管理器&#xff0c;可以记住登录状态 内部不用设置 5 断言 系统返回的信息进行判断 系统返回“新增会议信息成功” …

python--实验13 异常处理

目录 知识点 异常概述 异常类 异常处理 捕获简单异常 原理 示例 异常处理except 原理及代码格式 try工作原理 标记程序上下文&#xff0c;异常发生时跳转 代码示例 终止行为finally 抛出异常raise 原理 代码格式 示例 自定义异常 原理 示例 断言assert 判…

爱因斯坦:常识就是人到十八岁为止所累积的各种偏见!——早读(逆天打工人爬取热门微信文章解读)

时间过得好快&#xff0c;2023下半年要为了自己的年终终结立下的flag奋斗了&#xff01; 引言Python 代码第一篇 洞见 所有关系的痛苦&#xff0c;都来自“鸡同鸭讲”第二篇结尾 引言 最近应该写的时间会比较晚 因为要看会盘 然后确定一下今天是否有参与的机会 从星期一到现在…

数据预处理在建模中的重要性与常见方法(一):数据清洗篇

一、引言 数据预处理的重要性 数据预处理是数据科学和机器学习中至关重要的一步。高质量的数据预处理可以有效去除噪声、修复缺失值、处理异常值&#xff0c;确保后续分析和模型构建的准确性和可靠性。未经过良好预处理的数据可能导致模型性能下降和错误结论。 数据预处理的…

vue自制表格

一、有时候element-ui的表格不满足需求&#xff0c;需要自定义表格&#xff0c;例如图下 二、上代码 <table class"tablenew table1" cellpadding"0" cellspacing"0"><tr><td>身份证号码</td><td>111111111</…

每日一题,力扣leetcode Hot100之49. 字母异位词分组

该题用哈希表解答&#xff0c;具有统一特征的作为哈希表的键名&#xff0c;然后满足要求的作为值 解法一&#xff1a; 我们将每个字符串进行排序&#xff0c;如果排序后的结果相同&#xff0c;则可以认为是字母异位词&#xff0c;我们将排序后的结果作为哈希表的key&#xff…

java通过jwt生成Token

定义 JWT&#xff08;JSON Web Token&#xff09;简而言之&#xff0c;JWT是一个加密的字符串&#xff0c;JWT传输的信息经过了数字签名&#xff0c;因此传输的信息可以被验证和信任。一般被用来在身份提供者和服务提供者间传递被认证用户的身份信息&#xff0c;以便于从资源服…

[MySQL][内置函数][日期函数][字符串函数][数学函数]详细讲解

目录 1.日期函数1.基础语法2.示例13.示例2 2.字符串函数1.基础语法2.示例 3.数学函数1.基础语法2.示例 4.其他函数 1.日期函数 1.基础语法 日期时间在MYSQL中是区分开的 日期&#xff1a;年月日时间&#xff1a;时分秒 获得年月日select current_date();----------------| cur…

新版网页无插件H.265播放器EasyPlayer.js如何测试demo视频?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff1b;支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#xff0…

【爬虫】滑块缺口识别

滑块示例 分为背景图 和 滑块图 主要目的 识别背景图滑块缺口 下载识别库 pip install opencvcode import numpy as np import cv2def identify_gap(bg, tp):bg1 np.asarray(bytearray(bg), dtypenp.uint8)tp1 np.asarray(bytearray(tp), dtypenp.uint8)# 灰度bg_img cv2…

磁盘分区教程图文

磁盘分区是计算机存储管理中的一项重要操作&#xff0c;它不仅能帮助我们更好地组织和管理数据&#xff0c;还能提高系统的性能和安全性。无论是新手还是有经验的用户&#xff0c;了解和掌握磁盘分区的基本知识都是十分必要的。本篇科普文章旨在为初学者提供一个简单易懂且全面…