论文阅读笔记:Attention is All You Need

news2024/12/28 8:22:44

论文标题:Attention is All You Need

目录

论文标题:Attention is All You Need

1.摘要

2.前言

3.模型结构

自注意力机制

多头自注意力机制

注意力机制在Transformer中的应用


1.摘要

    过去最优的模型是带有attention连接的encoder-decoder模型,本文提出了一个名为Transformer的神经网络框架,Transformer基于注意力机制,完全不需要循环和卷积。在两个机器翻译任务上的实验表明,这些模型在质量上更高,同时更易于并行化,并且训练的时间更短。

2.前言

    RNN,LSTM,GRU等模型在机器翻译上取得了优异的效果。循环语言模型沿着时间步计算,产生一个序列的隐藏状态ht。将前一个时刻的ht-1和t时刻的输入输入到模型,这种序列的设计天然地阻碍了并行训练。这在较长的序列长度时训练速度变得至关重要,因为内存限制了示例之间的批处理。

    Attention允许对依赖性进行建模,而不考虑它们在输入或输出序列的距离。Self-Attention是一种注意力机制,它将单个序列的不同位置联系起来,以便计算序列的表示

基于循环注意力机制的端到端记忆网络(Encoder-Decoder with Attention),而不是序列对齐的循环,已被证明在简单的语言问答和语言建模任务中表现良好。

3.模型结构

大多数有竞争力的语言模型有encoder-decoder架构,输入为序列,表示为

输入序列

Encoder将序列转换为隐藏状态表示z

Decoder在每个时间步将隐藏状态转换输出序列

    Transformer的Encoder-Decoder模块结构均为堆积的多层Self-Attention模块、全连接模块,和残差模块。其模型结构如图1,左侧为Encoder,右侧为Decoder。

Encoder: 6层网络,并在每层使用残差连接,然后进行层归一化。每层均有两个子层:多头自注意力机制,求点积的全连接层。6层网络中的每一层可以表示为,每层的隐藏层维度dmodel = 512。

Decoder: 使用相同的6层。除了每个编码器层中的两个子层之外,解码器还插入第三个子层,该子层对编码器堆积的输出执行多头注意力。Decoder每层之间用残差连接,之后使用LayerNorm。 除此之外,作者还修改了解码器中的第三个子层自注意力子层,以防止位置关注后续位置。(防止特征泄露,预测t时刻的词不应该看到Enocder中t+1之后的特征),作者使用了mask机制。

https://img-blog.csdnimg.cn/20190704193034842.png

灰色部分为i位置之后的mask

Mask的解释:想让当前decoder layer的每一个位置,能处理上一层decode layer的每一个位置。但为了不发生信息穿越,decoder layer做self-attention时,不应该注意到自己之后的位置(因为自己之后的位置此时并没有输出任何东西)。

具体做法是,直接把蒙版区的attention矩阵的值设为负无穷。表示对该区域的注意力为负无穷! Softmax之后对应区域的权重会趋向于0。

注意,置为负无穷发生在softmax之前。

参考:https://blog.csdn.net/w55100/article/details/94460352

自注意力机制

图2中左图为标度点积注意力,右图为并行的多图注意力。自注意力机制以序列的每个词特征作为输入,将每个词乘以WQ、Wk、Wv三个权重矩阵,这样做的目的是为了增强模型的表达能力。得到Q(查询向量)、K(key匹配向量)、V(Value值向量);在得到每个词的Q\K\V表示后,就可以取计算词与词之间的自注意力机制。

什么是自注意力机制?

计算每个词i与其他词j之间的权重αij,然后用αij乘以对应的值向量Vj, 得到词i的加权表示。文中使用的是矩阵乘法的形式

 

使用1√d 的目的是做归一化,d是的向量维度。在点积之后,qk得到的是一个标量,q与所有k的点积可以形成一个向量,随着d维度的增加,这里有些qk对的点积会非常大,而有些会很小,一个向量中的数据分布是不均匀的。

经过softmax之后,会把qk点积大的维度进一步放大,计算的数值也会变得非常大,数值可能溢出。而qk点积小的缩小,对于qk点小的维度softmax之后会出现梯度消失

因此,使用1√d将q,k向量的点积分布做归一化,将数据的分布差异缩小,抵消softmax梯度消失现象

Softmax函数:一文详解Softmax函数 - 知乎

https://zhuanlan.zhihu.com/p/41571249

SoftMax函数的输出,加上log不影响函数的单调性,为pi添加log运算

  

Pi正确类别对应的输出节点的概率,我们希望pi越大越好(0<pi<1)。通常情况下是使用梯度下降法来迭代求解,因此只需要为log pi加上负号变成损失函数,-log pi越小越好。

    进一步处理得到SoftMax损失函数

    交叉熵损失(由极大似然推导得到)

多头自注意力机制

    作者发现将查询q,键k和值v用不同的线性变化k次到dq,dk,dv是有益的。然后再h组q,k,v上并行地执行自注意力函数,产生dv维度的值向量,将h个dv维度的值向量进行拼接,然后做线性变化,得到最终的值向量。

    多头注意力允许模型注意到不同位置的不同表示的子空间。文中使用8(h=8)个自注意力头,每个注意力头将q,k,v映射到dq\dk\dv=64

注意力机制在Transformer中的应用

  1. Encoder-Decoder Attention中,queries来自上一层decoder的输出,key和value来自Encoder的输出
  2. Encoder中包含了自注意力层,在一个自注意力层中,querie,key,values都来自相同的位置,当前层的每个位置可以attened到上一层的所有位置。

FNN(x) = Max(0,W1Z+B)W2 + b2

参数共享, encoder的input Embeddings和Decoder的input Embedding、以及pre-softmax线性变化这三部分共享参数

这三部分为什么要做参数共享?

(1)三部分参数的形状是一致的

(2)Encoder和Decoder的embedding, 输入的此表相同(机器翻译)

(3)对于pre-softmax层,直接利用embd里训练出来的相似性,可以提高softmax的表现

位置编码

    Transformer不包含循环神经单元和卷积单元,为了利用位置信息,必须添加一些句子中token的相对位置和绝对位置信息。在Encoder和Decoder的input embedding处添加了位置编码信息,位置编码和嵌入的维度相同,都为dmodel, 直接两者相加。

    文中使用了正弦和余弦函数做词的位置编码

为什么通过正弦和余弦函数就可以表示所有词的位置编码?

每个token的位置都是一个维度为dmoel的一维向量做位置编码时用到了特征的信息

    [sin(pos/10000^2i/1), sin(pos/10000^2i/2),…, sin(pos/10000^2i/dmodel)]

那么pos+k位置的向量,

PE_{pos+k} = [sin((pos+k)/a^h(0))...,sin((pos+k)/a^h(i)),...]

Sin(a+b) = sin(a)cos(b)+sin(b)cos(a), 那么pos+k位置的向量,

PE_{pos+k}相当于 u*sin(a)+v*cos(a),其中sin(a) = PE_pos,cos(a)= sqrt(1-PE_pos^2)。

文章使用sin-cos的位置编码的原因

(1)使用自学习position encoding的效果与正弦余弦函数几乎一样

(2)使用正弦曲线可以让模型推断的序列长度大于训练时给定的长度

参考阅读:

https://blog.csdn.net/changreal/article/details/102630873

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

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

相关文章

string的应用和模拟实现(上)

目录 string的应用 insert插入元素 erase删除元素 assign赋值&#xff1a; replace代替函数的一部分 find&#xff1a;从string对象中找元素 c_str:得到c类型的字符串的指针 substr&#xff1a;取部分元素构建成新的string对象 rfind find_first_of:从string查找元素 stri…

JVM【类的加载过程(类的生命周期)详解】

概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范&#xff0c;从 class 文件到加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包括如…

软件测试之python学习

1、pycharm的常用配置 1.1修改主题配置 1、点击菜单file,选择settings选项2、选择editor&#xff0c;点击color scheme配色方案3、在右侧选择对应的主题配置1.2修改背景颜色 1、点击菜单file,选择settings选项2、选择appearance&#xff0c;点击Theme 1.3调整字体大小 1、点…

基于K8S+eureka的java应用快速上下线的WEB平台

刚进公司时&#xff0c;由于历史原因&#xff0c;应用发布通过&#xff1a;发布新版&#xff08;新老并存&#xff09;->下线老版->删除老版的方式&#xff0c;每次通过手工处理&#xff0c;蛋疼&#xff08;不方便且高风险&#xff09;。于是马上写了比较直观的脚本方案…

关于java移位运算的一点讨论

框架乱飞的年代&#xff0c;时常还得往框架源码里看&#xff0c;对内在原理没点理解&#xff0c;人家就会认为你不太行。平时开发你可能没咋用过位移运算&#xff0c;但往源码里一看&#xff0c;就时常能看到它。我也是看着看着&#xff0c;突然仔细一琢磨&#xff0c;又不由得…

C++缺省参数与函数重载

目录 一.缺省参数 1. 基本概念 2.多参函数中使用缺省参数的情形分类 二.函数重载 (1)形参类型不同构成的重载 (2)形参个数不同构成的重载 (3)形参类型顺序不同构成的重载 函数重载的注意事项&#xff1a; 三.C支持函数重载的底层原理--函数名修饰 编译器生成可执行程序…

选购自主可控全国产交换机时, IP防护等级多少比较合适?

本期武汉海翎光电的小编要为大家介绍的是《选购自主可控全国产交换机时IP防护等级多少比较合适&#xff1f;》首先我们要了解自主可控全国产交换机的工作场景&#xff0c;加固交换机会比工业交换机的IP等级更高一些&#xff0c;而工业交换机又会比普通交换机的IP等级要求高一些…

Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理

Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理 目录 Unity 工具 之 Jenkins 打包自动化工具的下载/安装/基本操作/任务创建执行/Unity打包自动化简单搭建的相关整理 一、简单介绍 二、Jenkins 的下载 三、Jenk…

代码随想录--链表相关题目整理

代码随想录–链表相关题目整理 1. LeetCode203 移除链表中指定元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val…

如何免费创建PDF文档?创建PDF文档的9个工具

PDF 创建器是一种程序、应用程序或软件&#xff0c;旨在制作或创建 PDF 文档。自可移植文档格式 ( PDF ) 出现以来&#xff0c;文档共享和存储变得更加容易。PDF 还使文件交换更加安全。由于 PDF 格式的众多优点&#xff0c;PDF 文档被全球范围内的人们广泛使用。因此&#xff…

Java数据结构(List介绍和顺序表)

1、List的介绍 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection&#xff08;也是一个接口&#xff09;。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;Iterable也是一个接口&#xff0c;表示实现该接口的类是可…

第一天总结 之 用户管理界面的实现 之 修改操作 的实现

修改操作 首先 明确 修改操作的前提是 先在页面显示修改前的数据 然后对其进行修改 之后点击提交在页面显示修改前的数据 方法一&#xff1a; 带着数据直接跳转 到添加页面 即在跳转的url后 直接通过&#xff1f;携带数据跳转 缺点&#xff1a; &#xff01;&#xff01;…

6、Ubuntu20的JDKMySQLtomcatRedis安装

安装JDK 这里以安装版本8为例 进入存放jdk目录创建目录 cd /usr/local mkdir jdk cd jdk 把下好的jdk8压缩包拖拽到Ubuntu连接用户下 移动jdk包文件 mv /home/starfish/jdk-8u351-linux-x64.tar.gz . 解压jdk tar -zxvf jdk-8u351-linux-x64.tar.gz cd jdk1.8.0_351/ p…

【C#】C#Process调用外部程序

前言 使用C#调用外部程序&#xff0c;一种是通过Process类&#xff0c;一种是通过命令行&#xff0c;本文主要说一下使用C#中的Process类调用外部程序的方式。 过程&#xff1a; 创建Process对象配置启动选项&#xff08;输入、输出等&#xff09;切换工作目录设置外部程序名…

Java——全排列

题目链接 leetcode在线oj题——全排列 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 题目示例 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] …

Linux防火墙状态查看 | 端口关闭 | 端口开启 | 修改命令

目录 firewall防火墙 【1】查看firewall状态 【2】开启、重启、关闭firewalld服务 【3】查看防火墙规则 【3】 添加指定需要开放的端口&#xff08;开启8088&#xff09; 【4】重载入添加的端口 【5】查询指定端口是否开启成功 firewall防火墙 【1】查看firewall状态 s…

Java日志系统log4j2的使用配置和异步日志使用

目录1. log4j21.1 log4j2介绍1.2 Log4j2入门1.2.1 log4j2(日志门面 日志框架)使用1.2.2 slf4j log4j2使用1.3 Log4j2配置1.4 Log4j2异步日志1.4.1 全局异步AsyncLogger1.4.2 混合异步AsyncLogger1.4.3 AsyncAppender1. log4j2 1.1 log4j2介绍 Apache Log4j2是Log4j的升级版…

IB地理学什么?适合什么人学习?

IB精选&#xff1a;IB地理学什么&#xff1f;快速搞懂自己适不适合修读地理&#xff01; 核心目的IB地理科是一个很特别的科目&#xff0c;目的是要帮助同学掌握一些认识和了解现实世界的技能。这个现实世界包括了两大部分。 第一个部分是自然环境&#xff0c;当中包括生态系统…

你还在恐惧指针吗?点进来,带你全方位深入了解指针

指针是什么&#xff1f; 指针也就是内存地址&#xff0c;指针变量是用来存放内存地址的变量。(存放在指针中的值都被当做地址处理) 对于32位的机器&#xff0c;假设有32根地址线&#xff0c;那么假设每根地址线在寻找地址的时候会产生高电平&#xff08;高电压&#xff09;和…

[ZJCTF 2019]NiZhuanSiWei

目录 信息收集 代码审计 第一层 第二层 第三层 信息收集 打开页面又是代码审计 代码如下 <?php $text $_GET["text"]; $file $_GET["file"]; $password $_GET["password"]; if(isset($text)&&(file_get_contents($text,…