Transformer入门(一)——结构

2023-10-27


前言


一、Transformer的产生和基础思想

 1.1 Transformer的Motivation

   Transformer是由谷歌于2017年提出。最初是用在NLP领域,在此之前NLP方向的SOTA模型都是以循环神经网络为基础(RNN, LSTM等)。 本质上讲,RNN是以串行的方式处理数据,对应到NLP任务上,即按句中词语的先后顺序,每一个时间步长处理一个词语。然而,Transformer的巨大创新便在于它并行化的处理:文本中的所有词语都可以在同一时间进行分析,而不是按照序列先后顺序。为了支持这种并行化的处理方式,Transformer依赖于注意力机制。注意力机制可以让模型考虑任意两个词语之间的相互关系,且不受它们在文本序列中位置的影响。通过分析词语之间的两两相互关系,来决定应该对哪些词或短语赋予更多的注意力。

 1.2 Transformer的原始框架

   Transformer采用Encoder-Decoder架构,下图就是Transformer的结构。其中左半部分是encoder,右半部分是decoder。
   【PS:Encoder-Decoder架构不是具体的模型,而是泛指一类结构,不同的任务可以用不同的编码器和解码器 (RNN,CNN,LSTM)。编码就是将输入Seq转化成固定长度向量,解码就是把之前生成的固定向量再转化为Seq】
Transformer初始结构图
   Encoder:左边编码部分有N个相同的Encoder层叠加,每个Encoder层结构包含了两个子层,第一个子层是多头注意力层(Multi-Head Attention,橙色部分),第二个子层是前馈连接层(Feed Forward,浅蓝色部分)。 除此之外,还有一个残差连接,直接将input embedding传给第一个Add & Norm层(黄色部分)以及第一个Add & Norm层传给第二个Add & Norm层(即图中的粉色–>黄色1,黄色1–>黄色2部分运用了残差连接)。

   Decoder:右边解码部分有N个相同的Decoder层结构,相比Endoer,它有三个子层。第一个子层结构是遮掩多头注意力层(Masked Multi-Head Attention,橙色部分),第二个子层是多头注意力结构(Multi-Head Attenion,橙色部分),第三个子层是前馈连接层(Feed Forward,浅蓝色部分)。

 1.3 关于Decoder的补充说明

 (1) Decoder单层的残差连接是粉色–>黄色1,黄色1–>黄色2,黄色2–>黄色3三个部分
 (2) Decoder单层的重点是第二个子层,即多头注意力层,它的输入包括两个部分,第一个部分是第一个子层的输出,第二个部分是Encoder层的输出(这是与encoder层的区别之一),这样则将encoder层和decoder层串联起来,以进行词与词之间的信息交换(通过共享权重WQ,WV,WK得到)。
 (3) Decoder单层的第一个子层中mask,它的作用是防止训练的时候使用未来的输出单词,保证预测位置i的信息只能基于比i小的输出。比如训练时,第一个单词是不能参考第二个单词的生成结果的,此时就会将第二个单词及其之后的单词都mask掉。因此,encoder层可以并行计算,一次全部encoding出来,但是decoder层却一定要像RNN一样一个一个解出来,因为要用上一个位置的输入当做attention的query.
 (4) 残差结构是为了解决梯度消失问题,可以增加模型的复杂性。
 (5) LayerNorm层是为了对attention层的输出进行分布归一化,转换成均值为0方差为1的正态分布。cv中经常会用的是batchNorm,是对一个batchsize中的样本进行一次归一化,而layernorm则是对一层进行一次归一化,二者的作用是一样的,只是针对的维度不同,一般来说输入维度是(batch_size, seq_len, embedding),batchnorm针对的是batch_size层进行处理,而layernorm则是对seq_len进行处理(即batchnorm是对一批样本中进行归一化,而layernorm是对每一个样本进行一次归一化)。
使用ln而不是bn的原因是因为输入序列的长度问题,每一个序列的长度不同,虽然会经过padding处理,但是padding的0值其实是无用信息,实际上有用的信息还是序列信息,而不同序列的长度不同,所以这里不能使用bn一概而论。
 (6) FFN是两层全连接:w * [delta(w * x + b)] + b,其中的delta是relu激活函数。这里使用FFN层的原因是:为了使用非线性函数来拟合数据。如果说只是为了非线性拟合的话,其实只用到第一层就可以了,但是这里为什么要用两层全连接呢,是因为第一层的全连接层计算后,其维度是(batch_size, seq_len, dff)(其中dff是超参数的一种,设置为2048),而使用第二层全连接层是为了进行维度变换,将dff转换为初始的d_model(512)维。
 (7) decoder层中间的多头自注意力机制的输入是两个参数——encoder层的输出和decoder层中第一层masked多头自注意力机制的输出,作用在本层时是:q=encoder的输出,k=v=decoder的输出。
 (8) encoder的输入包含两个,是一个序列的token embedding + positional embedding,用正余弦函数对序列中的位置进行计算(偶数位置用正弦,技术位置用余弦)。

二、Encoder中重要模块的具体实现

 2.1 Self-Attention模块

   self-Attention是Transformer能找到与当前单词相关的词并加以关注的一种方法。这里描述self-attention的具体过程如下图所示:
在这里插入图片描述
   从上图可以看出,attention机制中主要涉及三个向量Q(Query), K(Key), V(Value),这三个向量的计算过程如下图所示:
在这里插入图片描述
   图中要用到参数WQ,WV,WK是三个随机初始化的矩阵,每个特征词的向量计算公式如下所示:
在这里插入图片描述
 (1) score:通过打分表示与关注单词的相关程度.
 (2) 这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention。
 (3) attention与self-attention的区别:
  self-attention是一般attention的特殊情况,在self-attention中,Q=K=V每个序列中的单元和该序列中所有单元进行attention计算。Google提出的多头attention通过计算多次来捕获不同子控件上的相关信息。
  self-attention的特点在于无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构,实现也较为简单并且可以并行计算。从一些论文中看到, self-attention可以当成一个层和RNN,CNN,FNN等配合使用,成功应用于其他NLP任务。
  attention中要除以8(根号d_k)的原因是为了缩放,它具备分散注意力的作用;原始注意力值均聚集在得分最高的那个值,获得了权重为1; 而缩放后,注意力值就会分散一些。
  attention中除以根号d_k具备缩放的原因是因为原始表征x1是符合均值为0方差为1的正态分布的,而与权重矩阵相乘后,结果符合均值为0方差为d_k的正态分布了,所以为了不改变原始表征的分布,需要除以根号d_k

 2.2 Multi-Headed Attention模块

   将模型分为多个头,形成多个子空间,可以让模型去关注不同方向的信息。
   多头注意力机制在这里是指分成多组Q,K,V矩阵,一组Q,K,V矩阵独立完成一次注意力机制的运算,transformer使用了8组,所以最终得到了8个矩阵,将这8个矩阵拼接起来再乘以一个参数矩阵WO,即可得出最终的多注意力层的输出。全部过程如下图所示:
在这里插入图片描述
在这里插入图片描述
   左图表示使用多组Q,K,V矩阵,右图表示8组Q,K,V矩阵计算会得出8个矩阵,最终我们还需将8个矩阵经过计算后输出为1个矩阵,才能作为最终多注意力层的输出。如下图所示,其中WO是随机初始化的参数矩阵。
在这里插入图片描述

 2.3 Positional Encoding模块

   它是为了解释输入序列中单词顺序,其维度和embedding的维度一致。这个向量决定了当前词的位置,或者说是在一个句子中不同的词之间的距离。由于后续需要的时做CV,所以无需过多介绍位置编码。

 2.4 Layer Normalization模块

   【主要因为样本间长度不统一,不能直接用BN】
   在transformer中,每一个子层(自注意力层,全连接层)后都会有一个Layer normalization层,如下图所示:
在这里插入图片描述
   Normalize层的目的就是对输入数据进行归一化,将其转化成均值为0方差为1的数据。LN是在每一个样本上都计算均值和方差,如下图所示:
在这里插入图片描述
   LN的公式为: LN(xi) = α * (xi - μL / √(σ2L + ε)) + β

三、Encoder的叠加

   由于展示限制,这里只给出了两个Encoder的叠加,N个叠加可以以此类推。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Transformer入门(一)——结构 的相关文章

  • 01、虚拟机(VMware )部署

    一 VMware 概述 VMware是一家提供虚拟化解决方案的领先公司 其产品被广泛应用于企业和个人用户的计算环境中 VMware的虚拟化技术可以将物理计算资源 如服务器 存储和网络 抽象成虚拟化的资源 从而提供更高的灵活性 可扩展性和资源
  • Hbase Coprocessor 协处理器 与 JavaAPI

    协处理器概念 一 协处理器有两种 observer 和 endpoint 1 observer协处理器 Observer 类似于传统数据库中的触发器 当发生某些事件的时候这类协处理器会被 Server 端调用 Observer Coproc
  • 2021-08-26

    安装opencv python库 安装opencv python库 安装opencv python库 curl https bootstrap pypa io pip 2 7 get pip py o get pip py python g

随机推荐

  • 升级 Node 版本教程

    文章目录 Window 系统 Mac 或 Linux系统 Window 系统 window系统升级node只能到node官网下载window安装包来覆盖之前的node node 安装教程附下载地址 https blog csdn net q
  • selenium学习指南

    Selenium 是一套 Web网站 的程序自动化操作 解决方案 通过它 我们可以写出自动化程序 像人一样在浏览器里操作web界面 比如点击界面按钮 在文本框中输入文字 等操作 而且还能从web界面获取信息 比如获取火车 汽车票务信息 招聘
  • 使用Python,OpenCV制作图像Mask——截取ROIs及构建透明的叠加层

    使用Python OpenCV制作图像Mask 截取ROIs及构建透明的叠加层 1 效果图 2 源码 参考 这篇博客将介绍如何使用OpenCV制作Mask图像掩码 使用位运算和图像掩码允许我们只关注图像中感兴趣的部分 截取出任意区域的ROI
  • web自动化测试框架搭建(python+selenium+pytest+pom+ddt)

    本篇文件利用当下流行的pom设计模式设置测试框架 编写测试用例 生成测试报告 并最终jenkins集成 一 selenium selenium是一个开源的web ui自动化测试工具 详细就不再过多介绍了 二 环境搭建 关于环境搭建 非常简单
  • kubernetes使用ansible快速构建集群

    软硬件限制 1 cpu和内存 master 至少1c2g 推荐2c4g node 至少1c2g 2 linux系统 内核版本至少3 10 推荐CentOS7 RHEL7 3 docker 至少1 9版本 推荐1 12 4 etcd 至少2
  • ES计算指定索引,按多个字段去重后批量查询count结果

    ElasticSearch批量查询各个字段去重后的结果代码实现 计算指定索引 批量按多个字段去重后批量查询count结果 计算指定索引 批量按多个字段去重后批量查询的count结果 param indexName param distinc
  • 关于计算重叠四边形的面积的算法

    一 计算矩形重叠面积的三种方法 方法1 两个矩形的宽之和 减去组合之后的宽就得到重叠区域的宽 高同理 def IOU Reframe GTframe 自定义函数 计算两矩形 IOU 传入为均为矩形对角线 x y 坐标 x1 Reframe
  • 30天自制操作系统——第一天到第二天

    第一天 光盘地址用的这个 30天自制操作系统光盘 夕雨714 博客园 cnblogs com Bz162下载地址 Bz c mos vcraft jp 启动方式 D 文档 学习科目 计算机基础 操作系统 操作系统实验 30dayMakeOS
  • JavaWeb项目(登录注册页面)全过程详细总结

    JavaWeb项目 登录注册页面 全过程总结 文章目录 JavaWeb项目 登录注册页面 全过程总结 一 环境准备与开发工具 二 创建 JavaWeb 项目 2 1 新建Dynamic Web Project项目 2 2 创建前端页面 2
  • 手机Vbus上防护用OVP简介

    手机Vbus上防护用OVP简介 作者 AirCity 2019 10 19 aircity007 sina com 1 什么是OVP OVP是Over Voltage Protection的首字母缩写 中文名是过压保护负载开关 当输入电压大
  • CentOS安装教程-解决“Warning:/dev/root does not exist”问题

    在安装CentOS时 若出现 Warning dev root does not exist could not boot 一般情况下是因为未找到安装系统盘的所在位置 例如 U盘 这时只需找到其位置 并对配置稍作修改即可 当我们使用U盘安装
  • LeetCode:二叉树的修改与构造(5道经典题目)

    LeetCode 二叉树的修改与构造 5道经典题目 本文带来与二叉树的修改与构造有关的经典题目 主要实现是C 226 翻转二叉树 106 从中序与后序遍历序列构造二叉树 105 从前序与中序遍历序列构造二叉树 654 最大二叉树 617 合
  • 安装报错ERROR: Could not find a version that satisfies the requirement tensorflow ERROR: No matching dis

    ERROR No matching distribution found for xxx的情况这可能是因为网络的问题 这时我们使用国内的镜像源来加速输入命令 python m pip install lxml 如果你安装的是别的库 请输入别
  • Java实现 LeetCode 120 三角形最小路径和

    120 三角形最小路径和 给定一个三角形 找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上 例如 给定三角形 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11 即 2 3 5 1 11 说明 如果你可以只使
  • 【YOLOX关键模块记录与解读】YOLOX: Exceeding YOLO Series in 2021

    目录 前言 一 主干部分的Focus网络结构 二 解耦头 三 Mosaic数据增强 四 Anchor Free 五 SimOTA标签匹配策略 六 参考资料 前言 论文地址 https arxiv org abs 2107 08430 源码地
  • uniapp引入外部js链接

    geturl let self this const url https webrtc github io adapter adapter latest js https g alicdn com cloudcallcenter SIPml
  • jenkins安装插件失败

    更改镜像库地址 去以下地址获取当前最新的地址 http mirrors jenkins ci org status html 截取上图红框中的url 在管理插件 gt 高级 中配置成下图中的格式
  • Qt中QLineEdit(取值、赋值、字体大小颜色)、QTextEdit和QPlainTextEdit

    核心 这些东西理解就可以了 下次用的时候看下笔记 能想起来就可以了 背 也背不下来 放弃吧 QString 界面设计最常用到的组件就是QLabel和QLineEdit QLabel用于显示字符串 QLineEdit用于输入和显示字符串 两个
  • 浏览器渲染原理

    浏览器渲染原理 目录 目录 浏览器渲染原理 B S架构及其运行原理 渲染过程 defer async不会阻塞页面解析 B S架构及其运行原理 b s架构是Brower Server结构 chrome浏览器渲染速度最快不同于其他浏览器 因为c
  • Transformer入门(一)——结构

    文章目录 前言 一 Transformer的产生和基础思想 1 1 Transformer的Motivation 1 2 Transformer的原始框架 1 3 关于Decoder的补充说明 二 Encoder中重要模块的具体实现 2 1