【深度学习入门篇 ⑪】自注意力机制

【🍊易编橙:一个帮助编程小伙伴少走弯路的终身成长社群🍊】

大家好,我是小森( ﹡ˆoˆ﹡ ) ! 易编橙·终身成长社群创始团队嘉宾,橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。


自注意力背景

NLP领域中, 当前的注意力机制大多数应用于seq2seq架构, 即编码器和解码器模型。

  • encoder-decoder 结构 : Encoder将输入编码成上下文向量,Decoder进行解码;解码过程顺序进行,每次仅解码出一个单词。

RNN存在一些问题:

  1. 输 入 输 出 存 在 序 列 关 系 , b 4 的 输 出 需 要 先 依 赖 于 b 3 , … ,
    一 次 输 出 , 无 法 进 行 并 行 化
  2. 不论输入和输出的语句长度是什么,中间的上下文向量长度都是
    固定的
  3. 仅仅利用上下文向量解码,会有信息瓶颈,长度过长时候信息可
    能会丢失

可以对对seq2seq结构改进,使 用 C N N 来 进 行 并 行 化。

通过堆叠多层CNN,提高感受野,使上层输出可以捕获长程时序关系。

自注意力

语言的含义是极度依赖上下文的

  • 机器人第二法则:机器人必须遵守人类给的命令,除非该命令违背了第一法则

这句话中高亮表示了三个地方,这三处单词指代的是其它单词。除非我们知道这些词
指代的上下文联系起来,否则根本不可能理解或处理这些词语的意思。当模型处理这
句话的时候,它必须知道:

  •  「它」指代机器人
  • 「命令」指代前半句话中人类给机器人下的命令,即「人类给它的命令」
  • 「第一法则」指机器人第一法则的完整内容

自注意力机制(self-Attention):

 3个人工定义的重要概念,查询向量,键向量,值向量

① 查询向量(Query向量):被用来和其它单词的键向量相乘,从而得到其它词相对于当前词的注意力得分。
② 键向量(Key向量):序列中每个单词的标签,是我们搜索相关单词时用来匹配的对象。
③ 值向量(Value向量):单词真正的表征,使用值向量基于注意力得分进行加权求和。

 

查询向量就像一张便利贴,键向量像是档案柜中文件夹上贴的标签。当找到和便利贴上所写相匹
配的文件夹时,文件夹里的东西便是值向量。

自注意力实现

q u e r y , ke y , va l u e 向 量 的 定 义

使用每一个q对每一个k做attention :

将Query和Key分别计算相似性,然后经过softmax得到相似性概率权重,即注意力,再乘以Value,最后相加即可得到包含注意力的输出 。

常见注意力机制代码

import torch
import torch.nn as nn
import torch.nn.functional as Fclass Attn(nn.Module):def __init__(self, query_size, key_size, value_size1, value_size2, output_size):super(Attn, self).__init__()self.query_size = query_sizeself.key_size = key_sizeself.value_size1 = value_size1self.value_size2 = value_size2self.output_size = output_size# 第一步中需要的线性层self.attn = nn.Linear(self.query_size + self.key_size, value_size1)# 第三步中需要的线性层self.attn_combine = nn.Linear(self.query_size + value_size2, output_size)def forward(self, Q, K, V):attn_weights = F.softmax(self.attn(torch.cat((Q[0], K[0]), 1)), dim=1)attn_applied = torch.bmm(attn_weights.unsqueeze(0), V)output = torch.cat((Q[0], attn_applied[0]), 1)# 使用线性层作用在第三步的结果上做一个线性变换并扩展维度output = self.attn_combine(output).unsqueeze(0)return output, attn_weightsquery_size = 32
key_size = 32
value_size1 = 32
value_size2 = 64
output_size = 64
attn = Attn(query_size, key_size, value_size1, value_size2, output_size)
Q = torch.randn(1,1,32)
K = torch.randn(1,1,32)
V = torch.randn(1,32,64)
out = attn(Q, K ,V)
print(out[0])
print(out[1])

输出:

tensor([[[-0.3390,  0.3021, -0.1952, -0.0400,  0.5597, -0.3745, -0.2216,-0.3438, -0.2086, -0.1554, -0.2502,  0.0486,  1.0381, -0.1030,0.7277,  0.0592, -0.9172, -0.3736, -0.2285, -0.0148, -0.3319,0.0620, -0.6006,  0.1346, -0.1530,  0.0336,  0.3269, -0.2511,-0.1209,  0.4153,  0.3519,  0.3344, -0.0496, -0.2759, -0.2080,-0.1669,  0.7263, -0.0893,  0.0298, -0.1326,  0.6898, -0.3864,-0.0884, -0.2329, -0.2338,  0.1920,  0.2625,  0.0396, -0.3101,-0.2299, -0.1226, -0.5915,  0.2620,  0.2462,  0.4123, -0.6733,-0.2091,  0.6727,  0.3754, -0.1620, -0.8333,  0.2066,  0.3082,-0.5225]]], grad_fn=<UnsqueezeBackward0>)
tensor([[0.0187, 0.0492, 0.0259, 0.0293, 0.0151, 0.0104, 0.0127, 0.0122, 0.0546,0.0141, 0.0170, 0.0277, 0.0284, 0.0807, 0.0228, 0.0099, 0.0327, 0.0585,0.0102, 0.0106, 0.0598, 0.0208, 0.0403, 0.0241, 0.0896, 0.0230, 0.0371,0.0316, 0.0091, 0.0242, 0.0553, 0.0447]], grad_fn=<SoftmaxBackward0>)

Self-attention就本质上是一种特殊的attention。Self-attention向对于attention的变化,就是寻找权重值的𝑤𝑖过程不同。

Self-attention和Attention使用方法

  • Attention (AT) 经常被应用在从编码器(encoder)转换到解码器(decoder)。
  • SA可以在一个模型当中被多次的、独立的使用(比如说在Transformer中,使用了18次;在Bert当中使用12次)。
  • SA比较擅长在一个序列当中,寻找不同部分之间的关系,AT却更擅长寻找两个序列之间的关系

Transformer模型

Encoder由N个相同结构的编码模块堆积而成,每一个编码模块由Multi-Head Attention, Add &
Norm, Feed Forward, Add & Norm 组成的。 

编码器结构

第一层的激活函数为 ReLU,第二层不使用激活函数。X是输入,全连接层的输入和输出都是512维,中间隐层维度为2048。 

解码器结构

通过输入矩阵X计算得到Q, K, V 矩阵,然后计算 Q 和 KT 的乘积 QKT。

计算注意力分数,在 Softmax 之前需要使用 Mask矩阵遮挡住每一个单词之后的信息。

  

文本嵌入层:无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示转变为向量表示, 希望在这样的高维空间捕捉词汇间的关系

import torch
import torch.nn as nn
import math
from torch.autograd import Variableclass Embeddings(nn.Module):def __init__(self, d_model, vocab):super(Embeddings, self).__init__()self.lut = nn.Embedding(vocab, d_model)self.d_model = d_modeldef forward(self, x):return self.lut(x) * math.sqrt(self.d_model)

 输出:

embedding = nn.Embedding(10, 3)
input = torch.LongTensor([[1,2,3,4],[6,3,2,9]])
print(embedding(input))#
tensor([[[ 1.8450,  1.9222,  0.1577],[-0.7341,  0.3091,  0.7592],[-0.4300,  0.9030, -0.3533],[ 1.1873,  0.9349, -1.0567]],[[ 0.4812, -0.1072,  0.4980],[-0.4300,  0.9030, -0.3533],[-0.7341,  0.3091,  0.7592],[-2.1227, -0.3621,  0.7383]]], grad_fn=<EmbeddingBackward0>)

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

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

相关文章

C#进阶:深入理解异步编程与并发

在现代软件开发中&#xff0c;异步编程和并发控制是不可或缺的技能。随着应用程序变得越来越复杂&#xff0c;对性能、响应性和可扩展性的要求也越来越高。C#提供了强大的工具来支持异步编程和并发处理&#xff0c;如async和await关键字、Task Parallel Library&#xff08;TPL…

Vue3 SvgIcon组件开发

在前面自定义tree组件继续功能迭代前&#xff0c;我们先开发一个通用的ScgIcon组件&#xff0c;用于后续组件模板中小图标的展示。 引入iconfont 官网&#xff1a;https://www.iconfont.cn/ 选取图标进行下载&#xff0c;只取iconfont.js文件 在prettier中忽略该文件&#x…

【YOLOv5/v7改进系列】引入CoordConv——坐标卷积

一、导言 与标准卷积层相比&#xff0c;CoordConv 的主要区别在于它显式地考虑了位置信息。在标准卷积中&#xff0c;卷积核在输入上滑动时&#xff0c;仅关注局部区域的像素强度&#xff0c;而忽略其绝对位置。CoordConv 通过在输入特征图中添加坐标信息&#xff0c;使得卷积…

【常用知识点-Linux】查询端口情况

Author&#xff1a;赵志乾 Date&#xff1a;2024-07-22 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 简介 ss命令为socket statistics的缩写&#xff0c;是Linux的一个网络管理命令&#xff0c;主要用于获取系统中socket的统计信息&am…

[C/C++入门][for]26、统计满足条件的4位数(循环经典练习)

给定若干个四位数&#xff0c;求出其中满足以下条件的数的个数&#xff1a;个位数上的数字减去千位数上的数字&#xff0c;再减去百位数上的数字&#xff0c;再减去十位数上的数字的结果大于零。 【输入】 输入为两行&#xff0c;第一行为四位数的个数n&#xff0c;第二行为n个…

【SpringBoot】第3章 系统配置之日志配置

SpringBoot自带spring-boot-starter-logging库来实现系统日志功能&#xff0c;spring-boot-starter-logging组件默认使用LogBack日志记录工具。系统运行日志默认输出到控制台&#xff0c;也能输出到文件中。下面通过示例来演示SpringBoot项目配置日志的功能。 修改pom.xml文件…

校园招聘 之 Java HashMap

校园招聘与社会招聘在多个方面存在显著的区别&#xff0c;这些区别主要体现在招聘对象、招聘目的、招聘方式、招聘周期、招聘成本以及入职后的发展等方面。校招也更注重理论知识&#xff0c;俗称八股文&#xff0c;其实有些东西为什么一直拿来问&#xff0c;其实这里面你仔细品…

速盾:cdn技术实现原理是什么?

CDN技术&#xff08;内容分发网络&#xff09;是一种通过将内容部署到离用户更近的服务器上&#xff0c;从而提高网站访问速度和用户体验的技术。它的实现原理主要包括以下几个步骤&#xff1a; 域名解析&#xff1a;用户输入网址&#xff0c;浏览器首先向DNS服务器发送域名解析…

STM32CubeIDE(CAN)

目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号&#xff0c;其中一些型号集成了CAN&#xff08;Controller Are…

Vuex--全局共享数据

目录 一 是什么? 二 怎么用&#xff1f; 三 注意点 一 是什么? 在此之前&#xff0c;我们使用vue的数据全部放在每个组件的data区域里面&#xff0c;这里return里面存的都是这个组件要用到的数据&#xff0c;但是这里面的数据是局部的数据&#xff0c;也就是说这些数据是这…

Chrome v8 pwn 前置

文章目录 参考用到啥再更新啥简介环境搭建depot_tools和ninjaturbolizer 调试turbolizer使用结构数组 ArrayArrayBufferDataViewWASMJSObject结构Hidden Class命名属性-快速属性Fast Properties命名属性-慢速属性Slow Properties 或 字典模式Dictionary Mode编号属性 (Elements…

基于springboot+vue+uniapp的宿舍管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

van-dialog 组件调用报错

报错截图 报错原因 这个警告表明 vue 在渲染页面时遇到了一个未知的自定义组件 <van-dialog>&#xff0c;并且提示可能是由于未正确注册该组件导致的。在 vue 中&#xff0c;当我们使用自定义组件时&#xff0c;需要先在 vue 实例中注册这些组件&#xff0c;以便 vue 能…

交易积累-AR

在股票交易分析中&#xff0c;AR&#xff08;Accumulation/Distribution Rating&#xff0c;积累/分配指标&#xff09;是一个反映股票在一定时期内被积累&#xff08;买入&#xff09;或分配&#xff08;卖出&#xff09;情况的指标。它是由美国著名的股票投资者威廉J奥尼尔&a…

本地搭建ros2环境步骤(x86_64架构)

验证效果&#xff1a;ros2跟redis能够相互通信&#xff0c;但不会接收到其它 orin 的 topic 消息&#xff1b;本地的话直接当作slave机器来用 注&#xff1a;ros2 的全局 param 需要依赖一个单点 redis-server&#xff0c;ros2 的全局 param 数据是保存在这个单点 redis-ser…

Json结构解析比较

文章目录 前言正文一、项目简介二、核心代码1、 JavaBeanParser2、 JsonStructCompare3、 Client 测试结果 前言 本次练习&#xff0c;主要是针对于两个Json的结构差异。 多用于测试场景&#xff0c;比如一个很大的Json报文&#xff0c;需要和现有的Json报文对比&#xff0c;看…

【快速逆向二/无过程/有源码】掌上高考—2024高考志愿填报服务平台

逆向日期&#xff1a;2024.07.21 使用工具&#xff1a;Node.js 加密工具&#xff1a;Crypto-js标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…

modbus中3.5字节时间如何计算

示例&#xff1a;波特率是115200bps &#xff08;比特每秒&#xff09; 1、计算每个比特的时间 2、每字节时间 1个字符8数据位1起始位1停止位&#xff0c;则每传输一个字符需要10位 3、3.5个字节的时间

c 语言 中 是否有 unsigned 安;这种写法?

你提到的结构体定义使用了unsigned这种没有完全限定类型的写法&#xff0c;在C语言中&#xff0c;这种语法通常会被解释为unsigned int。这是因为在C语言中&#xff0c;unsigned是unsigned int的缩写形式。 下面是你的结构体定义以及解释&#xff1a; struct exec {unsigned …