当前位置: 首页 > news >正文

【深度学习】Transformer梳理

零、前言

对于transformer,网上的教程使用记号、术语不一 。
最关键的一点,网上各种图的简化程度不一 (画个图怎么能这么偷懒) ,所以我打算自己手画一次图。
看到的最和善(但是不是那么靠谱,我怀疑图有误)的transformer教程:一文了解Transformer全貌(图解Transformer)

注意: 全连接层在概念上输入必须是一维向量,但是实际实现的时候我们会采用批处理将多个样本的向量组拼成矩阵,用矩阵乘法加速运算。如果用单一样本的向量来标注全文可能更清晰,但是为了更贴近实用,约定全文的输入长这个样子而不是向量:

输入为X矩阵其实,输入也不是矩阵。。。输入是3维张量,三个维度分别是batch_size, number(当前用到的词数), dimension(特征维度)
其中,number没有画出来,你可以按number=1来想,当成矩阵方便一些

一、前置基础中的前置基础

  • RNN
  • 残差连接(无论什么书,通常会在CNN的ResNet这一节中讲)
  • 归一化
  • 注意力机制

二、前置基础

  • Encoder-Decoder模型
  • 自注意力
  • 多头注意力

简单介绍一下,

  1. Encoder-Decoder模型是为了解决RNN容易忘记前文的问题(即使是LSTM也可能存在这个问题)

  2. 自注意力
    自注意力图示
    (其中Q、K、V是什么属于“注意力机制”的内容,假设你已经了解了这一块内容并能看懂上面的图)
    (对于Scale为什么除以根号d,原因引用一篇文章:Attention为什么要除以根号d)
    可以发现,自注意力的作用是把X转换为固定形状的M,便于处理

  3. 多头注意力
    多头注意力本身并不限制使用的是什么注意力来连接起来,Transformer中用的是自注意力。
    多头注意力图示多头注意力将多个自注意力Concat,是因为这样“并列”的结构能优化最长最短路,而且这样能表达的注意力机制更丰富

三、Transformer

Transformer相比起Seq2Seq模型,区别在于,Seq2Seq中RNN承担了Encoder、Decoder的角色,事实上,Encoder、Decoder可以由多种途径实现,Transformer中RNN不复存在,用的是多头注意力。因此Transformer是一种纯注意力机制的模型。
接下来在一个具体场景中学习Transformer。

目标:做文本翻译
数据集:包含翻译前后的文本,分别为Source和Target

1. 输入原文本Source

Source是单词,所以不能直接扔进神经网络去,需要先编码成向量,既不要损失词本身的信息,也不要损失词所在语句的位置的信息,那就干脆都编码,然后加起来。
输入处理

2. Encoder

Part 1
首先先经过多头注意力机制,然后Add&norm

  • Add指的是残差连接,使梯度流动更平稳,防止梯度消失/爆炸
  • norm本身归一化的目的是为了防止协变量偏移,提高泛化能力,归一化分为两种(层归一化对batch_size归一化,批归一化对dimension进行归一化),这里用的是层归一化
  • 关键:多头注意力机制对于注意力的表达更丰富,且本身“注意力”的含义就是对哪个词(所编码的向量)更有偏向(注意力分数,即权重矩阵),也就是说中英文语序这种问题不存在,是靠注意力机制来不定顺序翻译的

Part 2矩阵M是原本是三维张量,漏掉的n并不是随意漏的,而是因为翻译不应当和n相关(后面还会具体解释的),所以这一部分是为了丢掉n这个维度。

Encoder

3. 输入目标文本Target

Target
和Source是一样的,但是Target需要有 “Mask” ,为了避免模型过早“偷窥”到Target后面的内容

4.Decoder

上图也展示了Decoder的第一个多头注意力,还有第二个,第二个与之前的Encoder相连
Connection回忆注意力机制,现在把Encoder想成环境条件Key和Value,Decoder中已经出现的Target(没有被Mask的部分)词,你可能会对其中感兴趣也就是Query,那么你就懂上图为什么这么连了。
接着是熟悉的Dense,和Encoder一样。

Classification用一个Softmax决定生成哪个词,这里再次体现了Dense类似于1×1卷积层的功能。

Decoder(decoder图里忘了画×n了)

5. 反向传播进行训练

Back propagation图中打勾的部分是有参数能学的部分,由于输出是Softmax所以用交叉熵损失函数,链式法则反向传播更新参数。
注意一点,反向传播是等到所有词都依次通过一遍transformer后,再反向传播(再次体现了上文中的翻译不应当与序列长度n有关),以确保模型学习到了整个序列的上下文信息。

输出序列长度既可以长于输入序列,也可以短于输入序列,这是因为有输入序列Source有mask(Target也有mask,确实,Transformer有两个地方用到了mask),你认为的一次丢几个词进去,本质上输入序列长度固定,是因为mask的存在使得前面有指定几个词有效。输入序列长度固定,那么输出序列长度也理应固定且很长(是一个你规定的最大长度),只是模型通过大规模的数据集自己判断何时给出,所以输出序列长度是介于没有到这个规定最大长度之间的数,可以长于输入序列,也可以短于输入序列。

相关文章:

  • nginx 安全配置
  • docker安装ubtuntu
  • MongoDB~存储引擎了解
  • C/C++|回调函数的正确打开方式
  • go-gin中session实现redis前缀和db库选择+单点登录
  • 攻防实战 | 邮件高级威胁检测与自动化响应
  • 【原创】springboot+mysql医院预约挂号管理系统设计与实现
  • EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?
  • 匠心独运,B 端系统 UI 演绎华章之美
  • springboot 的yaml配置文件加密
  • React 为什么使用map来渲染列表 而不是其他循环方法
  • Docker 的基本概念和优势
  • 遗传算法(GA)
  • Python怎么使用 SQLAlchemy 和model 查询数据呢?
  • SpringCloud如何实现SSO单点登录?
  • 「译」Node.js Streams 基础
  • 4个实用的微服务测试策略
  • Flex布局到底解决了什么问题
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript-Array类型
  • Js基础知识(一) - 变量
  • mongo索引构建
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • v-if和v-for连用出现的问题
  • XForms - 更强大的Form
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零开始在ubuntu上搭建node开发环境
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端相关框架总和
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 学习ES6 变量的解构赋值
  • 赢得Docker挑战最佳实践
  • 硬币翻转问题,区间操作
  • 用简单代码看卷积组块发展
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #Linux(make工具和makefile文件以及makefile语法)
  • ${ }的特别功能
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (12)目标检测_SSD基于pytorch搭建代码
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)(3.5) 遥测无线电区域条例
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (函数)颠倒字符串顺序(C语言)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (转)jdk与jre的区别
  • (转)Linq学习笔记