自注意力机制详解

视频链接:李宏毅 self-attention讲解上
参考文章:RNN详解
     Attention详解
     彻底搞懂Attention机制
     知乎Transformer详解

传统的编码器解码器架构

在这里插入图片描述
一般最简单的编码器-解码器架构都是基于RNN模型的,编码器将输入的序列转换为语义编码C,语义编码C中包含了整个输入序列的信息。
解码器也是采用RNN模型,计算每一时刻的输出 y t y_t yt时,除了上一时刻的输出 y t − 1 y_{t-1} yt1和上一时刻隐藏层的值 h t − 1 h_{t-1} ht1还需要语义编码C。
h t = f ( h t − 1 , y t − 1 , C ) h_t = f(h_{t-1},y_{t-1},C) ht=f(ht1,yt1,C) y t = f ( h t , y t − 1 , C ) y_t = f(h_t,y_{t-1},C) yt=f(ht,yt1,C) h t h_t ht表示当前t时刻的隐藏层的数值, y t − 1 y_{t-1} yt1为上一时刻预测的输出,每个时刻语义编码C都是相同的。

这种编码方法,无法体现对一个句子序列中不同语素的关注程度。在自然语言中,一个句子中的不同部分是有不同含义和重要性的。比如:I hate this movie。如果是做情感分析的应用场景,训练的时候明显应该对hate这个词语做更多的关注。如果采用上述的方法则达不到这种效果。

注意力机制

人类在感知环境的时候(比如看一张图片或者一个句子),大脑让我们能够分清哪部分是重要的,哪部分是次要的,从而聚焦更重要的方面以获得对应的信息。我们在设计神经网络模型的时候,希望模型也具有这样的能力。这就引入了注意力机制。

在计算机算力资源有限的情况下,注意力机制可以将注意力集中在有用的信息上,从而减少了在噪声中花费的时间。
在这里插入图片描述
上图是引入了Attention机制的编码器-解码器架构。此时编码器的输出不再是只有有一个单一的语义编码C。而是具有多个C1,C2,C3这样的编码。在预测Y1的时候,使用C1作为语义编码,在预测Y2的时候,使用C2作为语义编码,这样就模拟了人类的注意力机制。其中 C i C_i Ci就是对序列中的不同语素,赋予不同的权重吗,最后进行加权平均得到的结果,我们称为中间语义表示。Attention机制的关键是将固定的中间语义表示C换成了根据当前输出单词而变换的中间语义表示 C i C_i Ci

中间语义表示

下面我们来介绍一下中间语义表示是如何进行计算的。

注意力机制描述了(序列)元素的加权平均值,其权重是根据输入的query和元素的键值进行动态计算的。具体地,在注意力机制中,有4个概念需要明确。

  • Query:Query(查询)是一个特征向量,描述我们在序列中寻找什么,即我们可能想要注意什么。
  • Keys:每个输入元素有一个键,它也是一个特征向量。该特征向量粗略地描述了该元素“提供”什么,或者它何时可能很重要。键的设计应该使得我们可以根据Query来识别我们想要关注的元素。
  • Values:每个输入元素,我们还有一个值向量。这个向量就是我们想要平均的向量。
  • Score function:评分函数,为了对想要关注的元素进行评分,我们需要指定一个评分函数f。该函数将查询和键作为输入,并输出查询-键对的得分(注意力权重)。它通常通过简单的相似性度量来实现,例如点积。

在这里插入图片描述

a i = exp ⁡ ( f a t t n ( k e y i , q u e r y ) Σ j exp ⁡ ( f a t t n k e y j , q u e r y ) ) out = ∑ i a i ⋅ v a l u e i \begin{aligned}a_i&=\frac{\exp(f_{attn}(key_i,query)}{\Sigma_j\exp(f_{attn}key_j,query))} \\\text{out}&=\sum_ia_i\cdot value_i\end{aligned} aiout=Σjexp(fattnkeyj,query))exp(fattn(keyi,query)=iaivaluei
注意力机制的目的是解码器在进行解码的时候,对输入数据有着不同权重的参考
如图所示,来自于Decoder模块中的查询首先和每个encoder中的键进行点集,得到一个评分函数,该评分函数通过softmax函数得到评分权重,将评分权重和encoder中的值进行相乘得到最终的输出,这个输出也就是我们所说的中间语义表示。

公式化结果

  • 首先利用RNN模型获得序列的隐层状态 h 1 , h 2 , . . . , h n h_1,h_2,...,h_n h1,h2,...,hn
  • 如果当前Decoder阶段已经到达 S i − 1 S_{i-1} Si1需要进行下一个 S i S_i Si的预测了,现在计算每一个输入位置 h j h_j hj对当前位置的影响 e i , j = a ( s i − 1 , h j ) e_{i,j}=a(s_{i-1},h_j) ei,j=a(si1,hj)
  • 对评分函数进行归一化处理,得到评分权重分布 α i j = exp ⁡ ( e i j ) ∑ k = 1 T x exp ⁡ ( e i k ) \alpha_{ij}=\frac{\exp\left(e_{ij}\right)}{\sum_{k=1}^{T_x}\exp\left(e_{ik}\right)} αij=k=1Txexp(eik)exp(eij)
  • 利用评分权重加权求和,得到相应的中间语义表示 c i = ∑ j = 1 T x α i j h j c_i=\sum_{j=1}^{T_x}\alpha_{ij}h_j ci=j=1Txαijhj
  • 计算Decoder中第i个隐藏层的输出 s i = f ( s t − 1 , y t − 1 , C ) s_i =f(s_{t-1},y_{t-1},C) si=f(st1,yt1,C)

编码器中的隐层状态又可以看作是Attention机制的keys和values

Attention模型优缺点

优点

  • 速度快(据说可以在Decoder阶段实现并行化,但是目前没弄懂,t时刻的隐状态需要t-1时刻的隐状态,这样如何并行呢)
  • 效果好:注意力机制能够获取到局部的重要信息,能够抓住重点

缺点

  • Encoder 部分仍然依赖于RNN结构,对于中长距离之间两个词之间的关系没有办法很好的获取

自注意力模块

自注意力机制和传统的注意力机制不同,传统的注意力机制是根据源端和目标端的隐变量计算注意力的,结果是源端的每个词和目标端的每个词之间的依赖关系。

自注意力机制,首先分别在源端和目标端进行自身的注意力,捕捉到其自身的词与词之间的依赖关系,之后将源端得到的自注意力加到目标端中的attention机制中,称为Cross-Attention,以捕获源端和目标端词与词之间的依赖关系。

在这里插入图片描述

按照Transformer论文计算自注意力机制的流程

  • 将输入单词转换为嵌入向量 a i a^i ai
  • 根据嵌入向量与权重参数 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv 相乘得到𝑞,𝑘,𝑣三个向量
  • 为每个向量计算一个分数: a i , j = q i ⋅ k j a_{i,j}=q_i\cdot k_j ai,j=qikj
  • 归一化处理 a i , j ′ = s o f t m a x ( q i ⋅ k j d ) a_{i,j}^\prime=softmax(\frac{q_i\cdot k_j}{\sqrt d}) ai,j=softmax(d qikj)
  • v a l u e value value进行点乘,得到加权的每个输入向量的评分 v v v
  • 相加后得到最终的输出结果𝑧=∑𝑣

self-attention 通过 Q ∗ K Q*K QK得到词与词之间的相关性矩阵,然后根据此相关性与V进行加权求和,这样最终输出的向量主要就是与之相似的词的向量构成的,与之不相似的向量对其的贡献度可以忽略不计。(数值很小,几乎可以忽略不计
最终计算出来的向量就会变成,如果两个词很相似,那么向量的相似度也很近,就起到了语义层面的意义,这样词与词之间就因语义的不同而自动区分开来了。

多头自注意力机制

由于每个向量可能会有不同的相关性,可以利用 q q q去寻找不同的相关性。得到不同相关性的输出。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

突破校园网限速:使用 iKuai 多拨分流负载均衡(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 1. 简介 由于博主连的内网是限速的,但是不同设备之间的网速却始终差不多,有一天看着…

CSS3新增的语法(三)【2D,3D,过渡,动画】

CSS3新增的语法(三)【2D,3D,过渡,动画】 10.2D变换10.1. 2D位移10.2. 2D缩放10.3. 2D旋转10.4. 2D扭曲(了解)10.5. 多重变换10.6. 变换原点 11. 3D变换11.1. 开启3D空间11.2. 设置景深11.3. 透视点位置11.4. 3D 位移11…

R语言中的常用数据结构

目录 R对象的基本类型 R对象的属性 R的数据结构 向量 矩阵 数组 列表 因子 缺失值NA 数据框 R的数据结构总结 R语言可以进行探索性数据分析,统计推断,回归分析,机器学习,数据产品开发 R对象的基本类型 R语言对象有五…

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…

js类型转换

类型转换只有这四种&#xff0c;例如如果要对象转数字&#xff0c;那么就需要先把对象转成原始类型&#xff0c;再从原始类型转到数字。 空数组转原始类型是一个空字符串。空对象转原始类型是[object Object]。 let a {} console.log(a);// NaN //等价于 a->原始 然后原始…

线控悬架系统分析

线控悬架系统分析 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1 线控悬架系统系统发展现状 • 车辆驾乘过程中&#xff0c;操控性和舒适性是两个重要的评价指标&#xff0c;两者很难兼顾&#xff1b; • 线控悬架就是根据路况实际情况自动调节悬架的高度、刚度、阻尼实…

OpenHarmony实战:小型系统移植概述

驱动主要包含两部分&#xff0c;平台驱动和器件驱动。平台驱动主要包括通常在SOC内的GPIO、I2C、SPI等&#xff1b;器件驱动则主要包含通常在SOC外的器件&#xff0c;如 LCD、TP、WLAN等 图1 OpenHarmony 驱动分类 HDF驱动被设计为可以跨OS使用的驱动程序&#xff0c;HDF驱动框…

【JAVA】基础学习03变量和关键字

文章目录 JAVA变量与运算符1.关键字&#xff08;keyword&#xff09;2.标识符( identifier)2.1命名规则2.2命名规范2.3变量作用和类型2.3.1整型变量2.3.2补充&#xff1a;计算机存储单位2.3.3浮点类型&#xff1a;float、double2.3.4 关于浮点型精度的说明2.3.5 字符类型&#…

Linux:ip和ip协议的初步认识

文章目录 ip协议基本认识ip协议的报头网段划分ip的类型划分 ip协议基本认识 前面对于TCP的内容已经基本结束了&#xff0c;那么这也就意味着在传输层也已经结束了&#xff0c;那么下一步要进入的是的是网络层&#xff0c;网络层中也有很多种协议&#xff0c;这里主要进行解析的…

【yolov5小技巧(1)】---可视化并统计目标检测中的TP、FP、FN

文章目录 &#x1f680;&#x1f680;&#x1f680;前言一、1️⃣相关名词解释二、2️⃣论文中案例三、3️⃣新建相关文件夹四、4️⃣detect.py推理五、5️⃣开始可视化六、6️⃣可视化结果分析 &#x1f440;&#x1f389;&#x1f4dc;系列文章目录 嘻嘻 暂时还没有~~~~ &a…

OpenHarmony实战:小型系统平台驱动移植

在这一步&#xff0c;我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构&#xff1a; device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

线上线下陪玩,APP小程序H5。源码交付,支持二开!

线下陪玩的风险与管理方式 1、陪玩者的身心健康风险 线下陪玩的模式决定了陪玩者需要与不同的需求方见面&#xff0c;并满足他们的陪伴和娱乐需求。这种工作方式可能会给陪玩者带来身心上的压力和负担。因为陪玩者需要面对各种需求方的要求&#xff0c;有时还需要虚拟出一种完…

mac/win使用pyinstaller打包app/exe文件,活着执行脚本,双击运行

&#x1f338; 踩坑记录 python环境最好使用虚拟环境&#xff0c;推荐使用conda管理&#xff0c;并且若本地有python环境&#xff0c;不要使用和 本地环境版本 相同的虚拟环境 这里踩坑较多&#xff0c;已经记不清楚注意点 虚拟环境python版本不要和本地环境一样 mac/win只能…

day03-Docker

1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中&#xff0c;部署时需要依…

Git的简单入门使用

文章目录 拷贝项目的步骤创建项目的步骤提交项目或项目文件的步骤恢复项目文件的步骤 拷贝项目的步骤 找到需要用来存放项目的文件夹&#xff1b;在文件夹页面空白处右键点击&#xff0c;然后再菜单中选择“Open Git Bash here”。在Github上找到需要进行拷贝的项目&#xff0…

算法复习:链表

链表定义 struct ListNode { int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {} }; 链表的遍历&#xff1a;ListNode phead; while(p!null) pp.next; 找到链表的尾结点&#xff1a;phead; while(p.next!null)pp.next; 链表节点的个数&#xff1a; phead…

基于SSM的网络视频播放器

目录 背景 技术简介 系统简介 界面预览 背景 互联网的迅猛发展彻底转变了全球各类组织的管理策略。自20世纪90年代起&#xff0c;中国政府和企业便开始探索利用网络系统进行信息管理。然而&#xff0c;早期的网络覆盖不广泛、用户接受度不高、相关法律法规不完善以及技术开…

备战蓝桥杯---DP刷题2

1.树形DP&#xff1a; 即问那几个点在树的直径上&#xff0c;类似ROAD那题&#xff0c;我们先求一下每一个子树根的子树的最大值与次大值用d1,d2表示&#xff0c;直径就是d1d2的最大值&#xff0c;那么我们如何判断是否在最大路径上&#xff0c;其实就是看一下从某一点出发的所…

YUNBEE云贝-技术分享:PostgreSQL分区表

引言 PostgreSQL作为一款高度可扩展的企业级关系型数据库管理系统&#xff0c;其内置的分区表功能在处理大规模数据场景中扮演着重要角色。本文将深入探讨PostgreSQL分区表的实现逻辑、详细实验过程&#xff0c;并辅以分区表相关的视图查询、分区表维护及优化案例&#xff0c;…

详解网络攻击的发生原因、类型及如何防范

网络攻击是访问计算机系统或者大小&#xff0c;修改或窃取数据的未经授权的企图。网络破坏分子可以使用多种攻击媒介&#xff0c;推出包括网络攻击的恶意软件&#xff0c;网络钓鱼&#xff0c;勒索&#xff0c;以及人在这方面的中间人攻击。固有风险和残余风险使这些攻击中的每…