[nlp入门论文精读] | Transformer

写在前面
 
最近工作从CV转向了NLP,于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候,我们小组就选择了经典的Attention和Bert,但还有很多细节并不完全理解,实际使用时也很困惑。
 
因此这个系列就来记录NLP复习知识!文章内容会结合工作实际所需持续更新。加油哇~

Transformer

        • 1. 简介和背景
        • 2. 相关工作
        • 3. 模型结构
          • 3.1 整体概览——编码器-解码器(Encoder-Decoder)
          • 3.2 注意力机制(Attention)
          • 3.3 "point-wise"前馈神经网络
          • 3.4 向量化层(Embedding)
          • 3.5 位置编码(Positional encoding)
        • 4. 为什么使用自注意力?(self-attention)
        • 5. 文章评价

1. 简介和背景
  • 论文的工作:聚焦于序列转录模型,序列转录模型是一类根据一个序列生成另外一个序列的模型,以往主流的方法通常基于RNN或者CNN、结构上采用Encoder-Attention-Decoder;提出的Transformer这种新的网络结构仅使用Attention机制。
  • RNN特点:能够处理序列数据的关键所在,是对输入序列从左到右依次进行计算,并将前面学到的知识放入隐藏状态向后传递
    • 这种计算机制带来的问题:
      • 无法并行计算
      • 当输入序列较长时,前面学到的知识在向后传递的过程中存在信息丢失的风险
    • 已有的提升计算效率的方法,如分解技巧,并不能从根本上解决问题
  • Attention机制在以往的工作中主要用来将Encoder的信息更好地传递给Decoder,论文提出的Transformer网络,不再使用循环层,仅使用attention学习输入和输出的全局依赖关系,而且能够有效进行并行计算

2. 相关工作
  • 减少时序计算代价途径之一——使用卷积神经网络
    • cnn的缺点在于难以建模长序列,每次计算使用的是k*k(k=3,5)的卷积核,如果需要建模两个距离较远的像素,需要使用多层卷积逐层计算;而Transformer中的注意力机制,每次计算使用全部像素;
    • 卷积的好处在于使用多个输出通道计算不同的特征,所以设计多头注意力机制进行模拟。
  • 自注意力机制:在计算一个序列表达时,将序列不同位置关联起来的一种注意力机制;已有工作并非论文创新。

3. 模型结构
3.1 整体概览——编码器-解码器(Encoder-Decoder)

Transformer基于经典序列转录模型的Encoder-Decoder架构:

  • 长度为n的输入x=(x_1, x_2,…x_n),如果是一个句子,x_t表示第t个单词
  • 编码器E:将输入映射为长度同样为n的连续向量z=(z_1, z_2,…z_n)
  • 解码器D:以编码器的输出z为输入,生成长度为m的输出序列y=(y_1, y_2, …y_m)
    • m可以不等于n,例如英翻中任务中,输入的英文句子长度可以不等于输出的中文句子长度
    • 解码器是典型的自回归模型,即逐步生成序列的每个元素来生成整个序列,生成y_t时考虑已经生成的y_1到y_(t-1),过去时刻的所有输出作为当前时刻的输入
      同时在编码器和解码器堆叠了多层self-attention、norm和fc

在这里插入图片描述

  1. 编码器
    在这里插入图片描述
  • batchnorm和laynorm
    在这里插入图片描述
  1. 解码器
  • 与编码器结构相似,包含6个完全相同的层,每层除了与编码器相同的两个子层(多头自注意力和前馈神经网络)外,增加一个额外的子层,同样是多头注意力
  • 由于解码器预测t时刻输出时,只能使用0到t-1时刻的输出作为输入,而t时刻后的不能;但注意力机制每次可以看到完整输入;因此使用带掩码的注意力机制–>保证训练和测试一致。
3.2 注意力机制(Attention)

简要理解:注意力函数将输入的 query,key-value 映射为输出output;具体来说,输出是value的加权和(二者维度相同),权重由query和key的相似度函数计算得出。其中不同的相似度函数则对应不同的注意力机制。

  1. 点乘注意力(Scaled dot attention)——TransFormer中使用的注意力机制
    在这里插入图片描述
  • quey的个数可以和kye-value对的个数不一样,但维度相同
  • 为什么要做缩放?当d_k较大时,点乘的值会变大,对应的softmat结果靠近1,使得梯度比较小
  • mask的目的——避免t时刻的query看到t时刻之后的key-value对;具体计算时,将t时刻之后的qk设置成较大的负数,经过softmax计算后变成0
  1. 多头注意力(Multi-Head attention)
    目的:模拟卷积神经网络不同输出通达学习不同特征
    做法:将QKV先投影到低维空间,投影h次–>缩放的点乘注意力机制–>拼接之后投影到原维度
    在这里插入图片描述

  2. Transformer中三种不同的注意力
    (1)Encoder中
    在这里插入图片描述
    (2)Dncoder中
    第一个注意力机制与Encoder相似,增加了mask机制:预测t时刻输出时,t时刻之后的权重设置为0
    第二个不再是自注意力,key-value对来自编码器的输出
    在这里插入图片描述

3.3 "point-wise"前馈神经网络
  • point-wise的意思:输入序列每个位置的词语都会经过相同的前馈神经网络计算
  • 两个线性层,使用Relu激活函数,将512维输入映射到2048维度后再映射回512维
  • 为什么是point-wise?注意力子层已经把输入的整个句子信息做了一次汇聚,使得注意力层输出的每个向量中都融合了其他位置信息(权重不同,感兴趣信息不同),因此每个位置词语对应的注意力子层输出向量可以单独进入前馈神经网络进行计算。
    在这里插入图片描述
3.4 向量化层(Embedding)
  • 整个网络包括三个向量化层,分别在编码器输入、解码器输入和解码器输出softmax层前。三者共享权重(训练简单)
  • 在编码器和解码器的输入部分,目的是将输入词映射成d_model向量;在解码器的输出部分,则是将隐藏状态的向量(eg:512维)映射到词汇表大小(eg:3万)的维度空间,然后进入softmax函数计算每个词概率值。

补充chatgpt的解释: Q:在decoder的softmax之前也会embedding,这是为什么呢?
A:在Transformer解码器中,在进行softmax之前进行额外的嵌入操作,通常是因为需要将解码器的输出(即经过softmax后的概率分布)转换为最终的词汇预测。这个额外的嵌入操作通常被称为"输出投影"(output
projection)或者"生成词嵌入"(generation embedding)。 这个额外的嵌入操作的作用有几个方面:

  1. 维度匹配:通常情况下,解码器的隐藏状态的维度可能与词汇表的大小不匹配。因为在解码器的隐藏状态中,每个时间步都有一个隐藏状态向量,而词汇表的大小通常远大于隐藏状态的维度。所以,需要通过输出投影将隐藏状态的维度转换为词汇表大小,以便之后进行softmax计算得到每个词汇的概率分布。
  2. 生成词嵌入:除了维度匹配之外,输出投影还可以被看作是将隐藏状态映射到词嵌入空间的过程。通过这个过程,模型可以更好地捕捉输出词汇的语义信息,从而更准确地预测下一个词汇。
    综上所述,在Transformer解码器中,在进行softmax之前进行额外的嵌入操作,既可以保证维度匹配,又可以提高模型对输出词汇的表示能力,从而提高预测的准确性。
3.5 位置编码(Positional encoding)
  • RNN是通过将上一时刻输出作为下一时刻输入来编码序列信息的,但注意力却缺少对时序信息的编码,针对这个问题,Transformer选择直接在输入中加入词语的位置信息。
  • 位置编码是一个与位置相关的向量,它被加到词嵌入向量中,以使模型能够区分不同位置的词汇。它通过周期不同的正弦、余弦函数计算而得,使得每个位置都会有一个唯一的位置编码向量与之对应。
4. 为什么使用自注意力?(self-attention)

虽然论文中这个章节标题是why self-attention,但并不是解释为什么这么设计,而是侧重时间复杂度、并行程度等相比RNN和CNN的优势
在这里插入图片描述

衡量三个维度

  • 每层的时间复杂度
  • 顺序计算:下一步计算必须等前面多少步完成计算,值越低并行程度越高
  • 最大路径长度:信息从一个点到另一个点要走多少步
    (1) 自注意力层:query矩阵n行d列,key矩阵n行d列,二者时间复杂度是n^2d;query和所有的key计算,输出是所有value的加权和,所以query一次就可以完成所有key-value计算,同时矩阵之间并行运算,所以每一步无需等待,信息传输一次完成。
    剩余三者计算量再补充

TODO:剩余循环层和卷积层计算之后遇到实际场景后再补充


5. 文章评价

论文写作:正文精简讲好一个故事,为什么要做?设计理念是什么?思考–>增加文章深度
模型本身:几乎可以用于所有NLP任务;扩展到图像、语音等领域;预训练让整个训练过程变的简单


2024.03.09 春日伊始,阳光明媚;在北京的小破出租屋,第一次更新:论文中Transformer基本结构。

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

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

相关文章

【Android 内存优化】KOOM 快手开源框架线上内存监控方案-源码剖析

文章目录 前言OOMMonitorInitTask.INSTANCE.initOOMMonitor.INSTANCE.startLoopsuper.startLoopcall() LoopState.Terminate dumpAndAnalysisdumpstartAnalysisService回到startLoop方法总结 前言 这篇文章主要剖析KOOM的Java层源码设计逻辑。 使用篇请看上一篇: 【Android …

Kubesphere前端项目分析

1 KubeSphere console功能导图 模块: 命令行工具 (kubectl) 日志(Logging) 平台设置(Platform Settings) 服务组件(Service Components) 监控和警报(Monitoring & Alerting&…

手写分布式配置中心(六)整合springboot(自动刷新)

对于springboot配置自动刷新,原理也很简单,就是在启动过程中用一个BeanPostProcessor去收集需要自动刷新的字段,然后在springboot启动后开启轮询任务即可。 不过需要对之前的代码再次做修改,因为springboot的配置注入value("…

pytest教程-15-多个fixture以及重命名

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了fixture的yield关键字,本小节我们讲解一下使用多个fixture的方法。 使用多个fixture 如果用例需要用到多个fixture的返回数据,fixture也可以return一个元组、list或字…

[嵌入式系统-37]:龙芯1B 开发学习套件 -7-MIPS指令集

目录 一、MIPS指令分类 二、常用指令详解 三、常用MIPS指令集及格式: 四、CPU内部的32个寄存器: 一、MIPS指令分类 MIPS(Microprocessor without Interlocked Pipeline Stages)指令集是一种广泛用于教学和嵌入式系统的指令集…

在线部署ubuntu20.04服务器,安装jdk、mysql、redis、nginx、minio、开机自启微服务jar包

一、服务器 1、查看服务器版本 查看服务器版本为20.04 lsb_release -a2、服务器信息 服务器初始账号密码 sxd / 123456 首先,更改自身密码都输入123456 sudo passwd 创建最高权限root账号,密码为 123456 su root 3、更新服务器源 1、更新源列表 sudo apt-g…

【golang】Windows与Linux交叉编译保姆级教程

【golang】Windows与Linux交叉编译 大家好 我是寸铁👊 总结了一篇【golang】Windows与Linux交叉编译的文章✨ 喜欢的小伙伴可以点点关注 💝 问题背景 今天寸铁想将Windows中的程序部到Linux下跑,我们知道在从Windows与Linux下要进行交叉编译…

11、Linux-安装和配置Redis

目录 第一步,传输文件和解压 第二步,安装gcc编译器 第三步,编译Redis 第四步,安装Redis服务 第五步,配置Redis ①开启后台启动 ②关闭保护模式(关闭之后才可以远程连接Redis) ③设置远程…

Java基础 - 8 - 算法、正则表达式、异常

一. 算法 什么是算法? 解决某个实际问题的过程和方法 学习算法的技巧? 先搞清楚算法的流程,再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

21 easy 1. 两数之和

//给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 // // 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 // // 你可以…

java Spring boot简述jetcache 并叙述后续文章安排

我们之前 讲了 Spring boot 整合 cache 使用 simple(默认) redis Ehcache memcached的几种方式 但是 始终有人觉得不够完善 提出了一些问题 例如 觉得 当前spring boot 对缓存过期的控制过于松散 不严谨 比较明显的体现就是 memcached过期时间在逻辑代码中控制 Ehcache的过期时…

Tomcat的安装

下载Tomcat(这里以Tomcat8.5为例) 直接进入官网进行下载,Tomcat官网 选择需要下载的版本,点击下载这里一定要注意:下载路径一定要记住,并且路径中尽量不要有中文!!!&…

Prompt Engineering、Finetune、RAG:OpenAI LLM 应用最佳实践

一、背景 本文介绍了 2023 年 11 月 OpenAI DevDay 中的一个演讲,演讲者为 John Allard 和 Colin Jarvis。演讲中,作者对 LLM 应用落地过程中遇到的问题和相关改进方案进行了总结。虽然其中用到的都是已知的技术,但是进行了很好的总结和串联…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。 单层的正向传递: 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。 我们用这个方法就可以得…

排序算法的对比

类别排序方法时间复杂度空间复杂度稳定性平均情况特殊情况 插入 排序 插入排序基本有序最优稳定希尔排序不稳定 选择 排序 选择排序不稳定堆排序不稳定 交换 排序 冒泡排序稳定快速排序基本有序最差不稳定归并排序稳定基数排序稳定

0环PEB断链实现

截止到昨天那里我们的思路就清晰了,通过EPROCESS找到我们要隐藏的进程的ActiveProcessLinks,将双向链表的值修改,就可以将我们想要隐藏的这个进程的ActiveProcessLinks从双向链表中抹去的效果,这里的话如果在windbg里面直接使用ed…

用Python实现一个简单的——人脸相似度对比

近几年来,兴起了一股人工智能热潮,让人们见到了AI的能力和强大,比如图像识别,语音识别,机器翻译,无人驾驶等等。总体来说,AI的门槛还是比较高,不仅要学会使用框架实现,更…

Day33|贪心算法part3

k次取反后最大的数组元素和 思路:贪心,局部最优,让绝对值大的负数变正数,当前数值达到最大,整体最优;整个数组和达到最大。如果把序列中所有负数都转换为正数了,k还没耗尽,就是k还大…

AWS的CISO:GenAI只是一个工具,不是万能钥匙

根据CrowdStrike的年度全球威胁报告,尽管研究人员预计人工智能将放大对防御者和攻击者的影响,但威胁参与者在其行动中使用人工智能的程度有限。该公司上个月在报告中表示:“在整个2023年,很少观察到GenAI支持恶意计算机网络运营的开发和/或执行。” 对于GenAI在网络安全中的…

Python:在 Ubuntu 上安装 pip的方法

目录 1、检测是否已安装pip 2、更新软件源 3、安装 4、检测是否安装成功 pip和pip3都是Python包管理工具,用于安装和管理Python包。 在Ubuntu上,pip和pip3是分别针对Python2和Python3版本的pip工具。 pip3作用:自动下载安装Python的库文…
最新文章