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

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

大家好,我是小森( ﹡ˆ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,一经查实,立即删除!

相关文章

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;使得卷积…

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 能…

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个字节的时间

【Linux】进程信号 --- 信号处理

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…

睿考网:没有初级能直接考中级经济师吗?

经济师考试分为初级、中级、高级三个类别&#xff0c;属于职业资格证书&#xff0c;考试是由统一组织、统一大纲、统一命题的方式。 没有初级可以直接考中级经济师吗? 可以直接报考&#xff0c;如果考生符合中级经济师报考要求&#xff0c;直接报名参加就可以&#xff0c;具…

通过iframe嵌套的不同域名的页面之间处理cookie存储失败的问题——js技能提升

最近同事在写mvc的后台管理系统&#xff0c;通过iframe实现不同域名的页面的嵌套。 但是有个问题&#xff0c;就是从父页面打开iframe的子页面时&#xff0c;需要登录子页面&#xff0c;此时需要将子页面登录后的token存储到子页面的cookie中&#xff0c;方便子页面的其他接口…

SpringBoot+Session+redis实现分布式登录

SpringBootSessionRedis实现分布式登录功能实现 文章目录 目录 文章目录 前言 一、引库 二、修改配置文件 三、使用 四、解决乱码问题 1.引库 2.配置redis序列化 3.配置Session-Redis序列化 前言 这里简单介绍一下&#xff0c;如果你想多台机器部署你的项目的话&#xff0c;在…

Maven的常用命令(面试篇之Maven)

我在写项目时,使用Maven的插件的命令来进行打包等,却发现报错误了,虽然解决了, 但借此机会来总结一下Maven的常用命令: 这些插件都有着自己的命令,虽然,我们可以简化的使用一些idea中的方便的按键: 但 , 一个程序员的功力深浅就在这些细节末尾处: 在Maven中&#xff0c;插件是…

【MySQL进阶之路 | 高级篇】范式概述与第一范式

1. 范式简介 在关系型数据库中&#xff0c;关于数据表的设计的基本原则&#xff0c;规则就称为范式。可以理解为&#xff0c;一张数据表的设计结果需要满足的某种设计标准的级别。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 范式的英文名是Normal …

OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结(一)

文章大纲 引言一、状态管理概述二、基本术语三、状态装饰器总览 引言 前面说了ArkTS 是在TypeScript基础上结合ArkUI框架扩展定制的&#xff0c;状态管理中的各种装饰器就是扩展的功能之一&#xff0c;可以让开发者通过声明式UI快速高效实现组件之间的数据同步&#xff0c;至于…

Leetcode之string

目录 前言1. 字符串相加2. 仅仅反转字母3. 字符串中的第一个唯一字符4. 字符串最后一个单词的长度5. 验证回文串6. 反转字符串Ⅱ7. 反转字符串的单词Ⅲ8. 字符串相乘9. 打印日期 前言 本篇整理了一些关于string类题目的练习, 希望能够学以巩固. 博客主页: 酷酷学!!! 点击关注…

转置卷积方法

一、定义 1、卷积神经网络层通常会减少&#xff08;或保持不变&#xff09;采样输入图像的空间维度&#xff08;高和宽&#xff09;&#xff0c;另一种类型的卷积神经网络层&#xff0c;它可以增加上采样中间层特征图的空间维度&#xff0c; 用于逆转下采样导致的空间尺寸减小…