1. 语言模型

2. Attention Is All You Need(Transformer)算法原理解析

3. ELMo算法原理解析

4. OpenAI GPT算法原理解析

5. BERT算法原理解析

6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质

7. Transformer-XL原理介绍

1. 前言

2017年6月,Google Brain在论文《Attention Is All You Need》中提出的Transformer架构,完全摒弃了RNN的循环机制,采用一种self-attention的方式进行全局处理。我也在博客Attention Is All You Need(Transformer)算法原理解析有所介绍。

Transformer结构的特点:

  1. 全部用self-attention的自注意力机制。
  2. 在self-attention的基础上改进了Multi-Attention和Mask Multi-Attention两种多头注意力机制。
  3. 网络由多个层组成,每个层都由多头注意力机制前馈网络构成。
  4. 由于在全局进行注意力机制的计算,忽略了序列中最重要的位置信息,添加了位置编码(Position Encoding),使用正弦函数完成,为每个部分的位置生成位置向量。

2. Vanilla Transformer

Vanilla Transformer是Transformer和Transformer-XL中间过度的一个算法,所以在介绍Transformer-XL之前我们先来了解下Vanilla Transformer。

Vanilla Transformer的原理图:

Vanilla Transformer论文中使用64层模型,并仅限于处理 512个字符这种相对较短的输入,因此它将输入分成段,并分别从每个段中进行学习,如下图所示。 在测试阶段如需处理较长的输入,该模型会在每一步中将输入向右移动一个字符,以此实现对单个字符的预测。

Vanilla Transformer的三个缺点:

  • 上下文长度受限:字符之间的最大依赖距离受输入长度的限制,模型看不到出现在几个句子之前的单词。
  • 上下文碎片:对于长度超过512个字符的文本,都是从头开始单独训练的。段与段之间没有上下文依赖性,会让训练效率低下,也会影响模型的性能。
  • 推理速度慢:在测试阶段,每次预测下一个单词,都需要重新构建一遍上下文,并从头开始计算,这样的计算速度非常慢。

3. Transformer-XL

Transformer-XL架构在vanilla Transformer的基础上引入了两点创新:

  1. 循环机制(Recurrence Mechanism)
  2. 相对位置编码(Relative Positional Encoding)。

以克服Vanilla Transformer的缺点。与Vanilla Transformer相比,Transformer-XL的另一个优势是它可以被用于单词级和字符级的语言建模。

3.1 循环机制(Recurrence Mechanism)

Transformer-XL仍然是使用分段的方式进行建模,但其与Vanilla Transformer的本质不同是在于引入了段与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性。如下图所示:

在训练阶段,处理后面的段时,每个隐藏层都会接收两个输入:

  1. 该段的前面节点的输出,与Vanilla Transformer相同(上图的灰色线)。
  2. 前面段的节点的输出(上图的绿色线),可以使模型创建长期依赖关系。这部分输出市通过cache的机制传导过来,所以不会参与梯度的计算。原则上只要GPU内存允许,该方法可以利用前面更多段的信息。

在预测阶段:

如果预测\(x_{11}\)我们只要拿之前预测好的[\(x_1\),\(x_2\)...\(x_{10}\)]的结果拿过来,直接预测。同理在预测\(x_{12}\)的时候,直接在[\(x_1\),\(x_2\)...\(x_{10}\),\(x_{11}\)]的基础上计算,不用像Vanilla Transformer一样每次预测一个字就要重新计算前面固定个数的词。

3.2 相对位置编码

在Transformer中,一个重要的地方在于其考虑了序列的位置信息。在分段的情况下,如果仅仅对于每个段仍直接使用Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。比如,第\(i_2\)段和第\(i_1\)段的第一个位置将具有相同的位置编码,但它们对于第\(i\)段的建模重要性显然并不相同(例如第\(i_2\)段中的第一个位置重要性可能要低一些)。因此,需要对这种位置进行区分。

可以将Transformer-XL中的attention的计算分为如下四个部分:

  1. 基于内容的“寻址”,即没有添加原始位置编码的原始分数。
  2. 基于内容的位置偏置,即相对于当前内容的位置偏差。
  3. 全局的内容偏置,用于衡量key的重要性。
  4. 全局的位置偏置,根据query和key之间的距离调整重要性

4. 总结

4.1 优点

  1. 在几种不同的数据集(大/小,字符级别/单词级别等)均实现了最先进的语言建模结果。
  2. 结合了深度学习的两个重要概念——循环机制和注意力机制,允许模型学习长期依赖性,且可能可以扩展到需要该能力的其他深度学习领域,例如音频分析(如每秒16k样本的语音数据)等。
  3. 在inference阶段非常快,比之前最先进的利用Transformer模型进行语言建模的方法快300~1800倍。

4.2 不足

  1. 尚未在具体的NLP任务如情感分析、QA等上应用。
    没有给出与其他的基于Transformer的模型,如BERT等,对比有何优势。
  2. 训练模型需要用到大量的TPU资源。

7. Transformer-XL原理介绍的更多相关文章

  1. 03 Yarn 原理介绍

    Yarn 原理介绍 大纲: Hadoop 架构介绍 YARN 产生的背景 YARN 基础架构及原理   Hadoop的1.X架构的介绍   在1.x中的NameNodes只可能有一个,虽然可以通过Se ...

  2. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  3. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  4. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

  5. 分布式文件系统FastDFS原理介绍

    在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...

  6. 内存分析_.Net内存原理介绍

    内存原理介绍 1.       .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果 ...

  7. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  8. 淘宝JAVA中间件Diamond详解(2)-原理介绍

    淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...

  9. Traceroute原理介绍

    一.路由追踪 路由跟踪,就是获取从主机A到达目标主机B这个过程中所有需要经过的路由设备的转发接口IP. 二.ICMP协议 Internet控制报文协议(internet control message ...

随机推荐

  1. Python学习笔记3 函数_20170614

    # 函数 定义 def my_abs(x) : if not isinstance(x, (int, float)) : raise TypeError('bad operand type') if ...

  2. jwt, token, session和cookies

    jwt token,session和cookies

  3. 使用threaddump-analyzer 快速查看jvm thread 状态信息

    日常开发中,我们可以需要通过thread dump 查看线程信息,比如锁,spotify 团队提供了一个web 界面,很方便 以下是简单使用,同时添加了docker 支持 添加docker 支持 cl ...

  4. 如何运用C语言求(判断)素数。

    int i,n; scanf("%d",&n); i=2;   //这一步是亮点!! while(i<n) { if(n%i==0) break; i++; } if ...

  5. Spring Security OAuth2学习

    什么是 oAuth oAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需 ...

  6. redis延迟队列

    异步消息队列 Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列, 使用 lpop 和 rpop 来出队列. > rpush notify ...

  7. CodeForce 222C Reducing Fractions

    To confuse the opponents, the Galactic Empire represents fractions in an unusual format. The fractio ...

  8. Window权限维持(五):屏幕保护程序

    屏幕保护是Windows功能的一部分,使用户可以在一段时间不活动后放置屏幕消息或图形动画.众所周知,Windows的此功能被威胁参与者滥用为持久性方法.这是因为屏幕保护程序是具有.scr文件扩展名的可 ...

  9. 用guava快速打造两级缓存能力

    首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 ...

  10. keepalived+Nginx实现主备保障Nginx的高可用。

    1.什么是keepalived? Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障. Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工 ...