[论文笔记]Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

news2024/11/26 12:34:48

引言

我们知道Transformer很好用,但它设定的最长长度是512。像一篇文章超过512个token是很容易的,那么我们在处理这种长文本的情况下也想利用Transformer的强大表达能力需要怎么做呢?

本文就带来一种处理长文本的Transformer变种——Transformer-XL,它也是XLNet的基石。这里的XL取自EXTRAL LONG。

论文题目:Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context

论文地址:https://arxiv.org/pdf/1901.02860.pdf

Transformer

我们先来简单回顾下Transformer,不熟悉的可以先看关于Transformer论文全文翻译——[论文翻译]Attention Is All You Need

在这里插入图片描述
我们重点回顾输入向量的计算方式,如上图底部所示,词嵌入(Embedding) ➕ 位置编码(Positional Encoding)。

假设有两个输入token,它们的位置分别在 i , j i,j i,j处,用 x i , x j x_i,x_j xi,xj相应地表示。

E x i T ∈ R 1 × d E_{x_i}^T \in \Bbb R^{1 \times d} ExiTR1×d为token x i x_i xi的词嵌入, E x j E_{x_j} Exj为 token x j x_j xj的词嵌入;
U i T ∈ R 1 × d U_i^T \in \Bbb R^{1 \times d} UiTR1×d U j T ∈ R 1 × d U_j^T \in \Bbb R^{1 \times d} UjTR1×d分别为第 i i i和第 j j j处的位置编码。

这里 d d d为嵌入大小。

一般向量默认是列向量,而行向量表示需要加上个转置。所以,上面两个记号上有转置。

那么在计算token x j x_j xj相对于token x j x_j xj的Self-Attention时,首先会计算出 q i q_i qi k j k_j kj
q i = ( E x i T + U i T ) W q T ∈ R 1 × d k j = ( E x j + U j ) W k T ∈ R 1 × d (1) q_i = (E_{x_i}^T + U_i^T)W_q^T \in \Bbb R^{1\times d}\\ k_j = (E_{x_j} + U_j)W_k^T \in \Bbb R^{1\times d} \tag 1 qi=(ExiT+UiT)WqTR1×dkj=(Exj+Uj)WkTR1×d(1)
其中 W q T W_q^T WqT W k T ∈ R d × d W_k^T \in \Bbb R^{d \times d} WkTRd×d

这里把词嵌入+位置编码分开写,后面会看到为什么这么做。

接下来,在计算它们两之间的注意力得分时,直接拿这两个向量做点积得到一个标量,注意维度:
q i ⋅ k j T = ( E x i T + U i T ) W q T ⋅ ( ( E x j T + U j T ) W k T ) T = ( E x i T W q T + U i T W q T ) ⋅ ( W k E x j + W k U j ) = E x i T W q T W k E x j + E x i T W q T W k U j + U i T W q T W k E x j + U i T W q T W k U j (2) \begin{aligned} q_i \cdot k_j^T &= (E_{x_i}^T + U_i^T)W_q^T \cdot \left ( (E_{x_j}^T + U_j^T)W_k^T \right)^T \\ &= (E_{x_i}^TW_q^T + U_i ^TW_q^T) \cdot ( W_k E_{x_j} + W_kU_j) \\ &= E_{x_i}^TW^T_qW_k E_{x_j} + E_{x_i}^TW^T_qW_kU_j + U_i ^TW_q^T W_k E_{x_j} + U_i ^TW_q^T W_kU_j \end{aligned} \tag 2 qikjT=(ExiT+UiT)WqT((ExjT+UjT)WkT)T=(ExiTWqT+UiTWqT)(WkExj+WkUj)=ExiTWqTWkExj+ExiTWqTWkUj+UiTWqTWkExj+UiTWqTWkUj(2)

相当于把它们进行了展开,整个过程应该没什么问题。

下面进入本文的主题。

Transformer-XL

我们先来看如果想在Transformer中处理长文本的话,要怎么做呢?

在这里插入图片描述

图1: Transformer中处理长文本的传统方法

比如传统的做法就是将长文本切分成固定长度的块(segment),并为每个块单独编码,块与块之间没有信息流动(正向传播与反向传播)。这样会导致两个问题,一是模型无法捕获长期依赖(long-term dependency);另一个是在分块之后,后面块在进行预测时没有前面块的信息,使模型存在优化难和表现差的问题,这被称为上下文碎片问题(context fragmentation problem)。

而Transformer-XL的提出就是为了处理(address)上面的两个问题。

上图给出了块长度为4时的一个示例,可以看到,在训练阶段,Transformer分别对第一个块中的序列 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4和第二块中的序列 x 5 , x 6 , x 7 , x 8 x_5,x_6,x_7,x_8 x5,x6,x7,x8进行建模(modeling)。
而在评估(evaluation)阶段,为了不将文本切成块,会通过类似移动窗口的方式,一个一个token地向后移动,这种方法效率非常低下。

为此,Transformer-XL提出了两种改进策略——块级别循环(Segment-level Recurrent)和相对位置编码(Relative Positional Encoding)。

我们先来看第一个。

块级别循环

块级别循环,全称是状态复用的块级别循环(Segment-Level Recurrence with State Reuse)。如下图(a)部分:

在这里插入图片描述

图2: Transformer-XL中处理长文本的方法

上面有两个块,每个块都会做Self-Attention,块之间有一些绿色的连线。在第二个块的时候,可以把第一个块的某些信息通过绿色的连线传递过来,那么它是怎么实现的呢?

实际上非常简单,它的思想是,在跑完第一个块的信息后,把它中间所有的隐藏层向量都缓存起来,然后跑第二个块的信息时,可以拿到这些缓存向量。

下面用公式描述一下,假设两个连续长度为 L L L的块分别为 s τ = x τ , 1 , ⋯   , x τ , L \pmb s_{\tau}=\pmb x_{\tau,1}, \cdots,x_{\tau,L} sτ=xτ,1,,xτ,L s τ + 1 = x τ + 1 , 1 , ⋯   , x τ + 1 , L \pmb s_{\tau+1}=\pmb x_{\tau+1,1}, \cdots,x_{\tau+1,L} sτ+1=xτ+1,1,,xτ+1,L。记由第 τ \tau τ个块 s τ \pmb s_{\tau} sτ在第 n n n层上产生的隐藏状态序列 h τ n ∈ R L × d \pmb h_{\tau}^n \in \Bbb R^{L\times d} hτnRL×d d d d为隐藏层维度大小。
那么对于片段 s τ + 1 \pmb s_{\tau +1} sτ+1在第 n n n层上的隐藏状态 h τ + 1 n \pmb h_{\tau+1}^n hτ+1n计算如下:
h ~ τ + 1 n − 1 = [ SG ( h τ n − 1 ) ∘ h τ + 1 n − 1 ] (3) \pmb {\tilde h _{\tau +1}^{n-1}} = [\text{SG}(\pmb {h _{\tau}^{n-1}}) \circ \pmb { h _{\tau +1}^{n-1}} ] \tag 3 h~τ+1n1=[SG(hτn1)hτ+1n1](3)
q τ + 1 n , k τ + 1 n , v τ + 1 n = h τ + 1 n − 1 W q T , h ~ τ + 1 n − 1 W k T , h ~ τ + 1 n − 1 W v T (4) \pmb q_{\tau +1}^n, \pmb k_{\tau +1}^n,\pmb v_{\tau +1}^n = \pmb h_{\tau+1}^{n-1}W^T_q , \pmb { \tilde h_{\tau+1}^{n-1}}W^T_k, \pmb { \tilde h_{\tau+1}^{n-1}}W^T_v \tag 4 qτ+1n,kτ+1n,vτ+1n=hτ+1n1WqT,h~τ+1n1WkT,h~τ+1n1WvT(4)
h τ + 1 n = Transformer-Layer ( q τ + 1 n , k τ + 1 n , v τ + 1 n ) (5) \pmb h_{\tau+1}^n = \text{Transformer-Layer}(\pmb q_{\tau +1}^n, \pmb k_{\tau +1}^n,\pmb v_{\tau +1}^n) \tag 5 hτ+1n=Transformer-Layer(qτ+1n,kτ+1n,vτ+1n)(5)

其中函数 SG ( ⋅ ) \text{SG}(\cdot) SG()表示停止梯度传输;记号 [ h u ∘ h v ] [\pmb h_u \circ \pmb h_v] [huhv]表示沿着长度(时间步)维度拼接两个隐藏状态序列; W W W表示全连接权重。
这里通过拼接当前块第 n − 1 n-1 n1层的隐藏状态和缓存的前一块第 n − 1 n-1 n1层的隐藏状态来生成扩展的上下文 h ~ τ + 1 n − 1 \pmb {\tilde h _{\tau +1}^{n-1}} h~τ+1n1

与传统的Transformer的主要不同点在于键 k τ + 1 n \pmb k_{\tau +1}^n kτ+1n和值 v τ + 1 n \pmb v_{\tau +1}^n vτ+1n的计算依赖于扩展的上下文 h ~ τ + 1 n − 1 \pmb {\tilde h _{\tau +1}^{n-1}} h~τ+1n1,即用到了前一块的缓存信息 h τ n − 1 \pmb {h _{\tau}^{n-1}} hτn1
同时可以看到在计算查询 q τ + 1 n \pmb q_{\tau +1}^n qτ+1n时只会基于当前块来计算。这种设计体现在了上图(a)的绿线中。

这种状态复用的块级别循环机制应用于语料库中每两个连续的块,本质上是在隐藏状态下产生一个块级别的循环。在这种机制下,Transformer利用的有效上下文可以远远超出两个块。注意到这种在 h τ + 1 n \pmb h_{\tau +1}^n hτ+1n h τ n − 1 \pmb h_{\tau}^{n-1} hτn1的循环依赖每块间向下移动一层,与传统RNN中的同层循环不同。因此,最大可能的依赖长度随块的长度 L L L和层数 N N N呈线性增长。这种机制和RNN中常用的随时间反向传播机制(Back Propagation Through Time,BPTT)类似。然而,在这里是将整个序列的隐藏层状态全部缓存,而不是像BPTT机制中只会保留最后一个状态。

在训练的时候,先训练第一块,更新完第一块的权重后,然后固定中间的隐藏状态向量。在训练第二块的时候,读取刚才保存那些向量,在训练第二块的时候,还是只更新第二块的权重,不过可以隐式地用到第一块的信息(通过绿线传递过来)。梯度不会沿着绿线进行更新,因此实际上学的还是一个块之间的信息。

通过这种方式可以延长依赖的长度到N倍,N就是网络的深度(块的个数)。

这样解决了上下文碎片问题,让模型可以捕获到长期依赖的信息。而评估阶段就更简单了,此时可以直接拿到全部的上下文信息,沿着上面的绿线将信息向后传递,而不需要像图1(b)那样从头开始计算。每次可以以块进行移动,而不是以token为单位进行移动,大大加快了推理过程。

虽然它的思想很简单,但如果直接实现的话会发现表现很差,因为这里还有一个问题,就是不连贯的位置编码问题。这就涉及到了第二个改进策略,相对位置编码。

相对位置编码

如果直接简单地把原来Transformer的绝对位置编码信息应用到块级别的循环上就会很奇怪:
[ 0 , 1 , 2 , 3 ] → [ 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 ] [0,1,2,3] \rightarrow [0,1,2,3,0,1,2,3] [0,1,2,3][0,1,2,3,0,1,2,3]

假设和上面的例子一样,块长度限制为4。现在长度为8之后就会变成两个单独的块,对应的位置编码就成了 [ 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 ] [0,1,2,3,0,1,2,3] [0,1,2,3,0,1,2,3]

这样模型无法区分第一个块的第2个位置编码和第二个块的第2个位置编码,认为是一样的,这显然是不合理的。因为位置编码的目的是为了引入位置信息。Transformer-XL针对这种情况提出了相对位置编码。

位置信息的重要性体现在注意力分数的计算上面,在传统Transformer中,同一块(segment)内的查询 q i q_i qi和键向量 k j k_j kj的注意力分数计算如下:

在这里插入图片描述
就是上文公式 ( 2 ) (2) (2),拆分成四项后,为每项进行编号,从 ( a ) (a) (a) ( d ) (d) (d)

E x i T ∈ R 1 × d E_{x_i}^T \in \Bbb R^{1 \times d} ExiTR1×d为token x i x_i xi的词嵌入, E x j E_{x_j} Exj为 token x j x_j xj的词嵌入;
U i T ∈ R 1 × d U_i^T \in \Bbb R^{1 \times d} UiTR1×d U j T ∈ R 1 × d U_j^T \in \Bbb R^{1 \times d} UjTR1×d分别为第 i i i和第 j j j处的绝对位置编码。

原本的做法里面,位置嵌入是绝对位置,因此如果是第i个位置,这个 U i U_i Ui都会是一样的(不管是哪个块)。

基于仅依赖相对位置信息的思想,Transformer-XL提出了改进如下:


其中为每项进行编号,从下面展开描述一下它的改进点:

  • ( b ) (b) (b) ( d ) (d) (d)项中计算key向量的绝对位置嵌入 U j U_j Uj替换为相对位置 R i − j R_{i-j} Rij,代表一个相对距离信息。注意这里的 R R R是传统Transformer中的正弦函数编码模式,是不需要学习的。
  • 引入一个可学习的参数 u u u ∈ R d \in \Bbb R^d Rd去替换 ( c ) (c) (c)项中的query向量 U i T W q T U_i^TW_q^T UiTWqT。这样新的query向量 u u u对于所有的位置都是一样的,因为是以位置 i i i为基准点,所以 i i i使用的位置嵌入是一个固定的嵌入,只需要考虑 i i i j j j之间相关位置的关系。同理,用可学习的参数 v v v ∈ R d \in \Bbb R^d Rd去替换 ( d ) (d) (d)项中的 U i T W q T U_i^TW_q^T UiTWqT
  • W k W_k Wk分成两个权重矩阵 W k , E W_{k,E} Wk,E W k , R W_{k,R} Wk,R,以分别产生基于内容的key向量和基于位置的key向量。

在新的计算公式中,每项都有直观的意义:

  • ( a ) (a) (a)项表示基于内容的相关度,计算query x i x_i xi和key x j x_j xj内容之间的关联信息;
  • ( b ) (b) (b)项捕获内容相关的位置偏置,计算query x i x_i xi的内容与key x j x_j xj的位置编码之间的关联信息, R i − j R_{i-j} Rij表示两者的相对位置信息,取 R R R中的第 i − j i-j ij行;
  • ( c ) (c) (c)项表示全局内容偏置,计算query x i x_i xi的位置编码与key x j x_j xj的内容之间的关联信息;
  • ( d ) (d) (d)项表示全局位置偏置,计算query x i x_i xi与key x j x_j xj的位置编码之间的关联信息;

把块级别循环和相对位置编码的信息合并后,我们就得到了Transformer-XL的最终架构。对于一个 N N N层的Transformer-XL的单个注意力头,对于 n = 1 , ⋯   , N n=1,\cdots,N n=1,,N有:

在这里插入图片描述

这样对于每个query,所有的位置嵌入都是一样的,对于不同的token注意力偏差也是一样的。

这里的注意力偏差怎么理解?原始的Transformer中的位置编码,对于每个位置都会学一个向量,假设某个token经常出现在第一个位置,比如“今年”这个token,那么模型学到的位置编码可能会包含“今年”这个token的意思,而没有其他不常出现在第一个位置的token信息。也就说第一个位置编码对“今年”产生了偏差。

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

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

相关文章

SQS (Simple Queue Service)简介

mazon Simple Queue Service (SQS)是一种完全托管的消息队列服务,可以让你分离和扩展微服务、分布式系统和无服务应用程序。 在讲解SQS之前,首先让我们了解一下什么是消息队列。 消息队列 还是举一个电商的例子,一个用户在电商网站下单后付…

【LeetCode每日一题:[面试题 17.05] 字母与数字-前缀和+Hash表】

题目描述 给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。 返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。 示例 1: 输入…

LDGRB-01 3AFE61320954P0001

LDGRB-01 3AFE61320954P0001变频器的作用_变频器工作原理变频器是把工频电源(50Hz或60Hz)变换成各种频率的交流电源,以实现电机的变速运行的设备,其中控制电路完成对主电路的控制,整流电路将交流电变换成直流电&#x…

教育培训机构屡遭投诉?湖南中创教育给出三点建议

在中消协发布的《2021年校外教育培训领域消费者权益保护报告》中,受新冠疫情以及校外教育培训行业治理政策的冲击,我国校外教育培训领域消费维权舆情及消费者投诉呈上升趋势。2021年全国消协组织受理有关校外教育培训的投诉案件共80,528件,同…

探索N-gram模型:语言模型中的基础算法

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Proteus8.15安装教程

1、解压Proteus8.15 安装包,然后双击进去,找到setup文件,右键,以管理员身份运行。 2、需要安装一些插件,点击“next”。把插件安装完成。 点击“finfish” 点击“install” 点击“Cancel” 3、如果没有上面步骤&…

零拷贝技术

1. 零拷贝技术 零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的…

latex使用笔记

在线表格转latex格式:https://tablesgenerator.com/ 在线公式转latex格式:https://latex.91maths.com/ 1、希腊字母 eg.σ 2、% 3、大小写罗马数字 大写罗马数字:\uppercase\expandafter{\romannumeral} 在romannumeral后加上相应的数字即可。 eg.Ⅱ \uppercas…

Python每日一练(20230311)

目录 1. 合并两个有序数组 2. 二叉树的右视图 3. 拼接最大数 🌟 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为…

SpringSecurity第一讲

目录 一、SpringSecurity01 1.2 什么是会话 1.2.1 基于session的认证 1.2.2 基于ToKen的认证 1.3 什么是授权 1.3.1 为什么要授权 1.3.2 SpringSecurity简介 1.4 SpringSecurity入门 1.4.1 pom文件 1.4.2 主启动类 1.4.3 创建控制层 1.4.4 启动项目进行测试 1.5 自…

工作三年,月薪不到20k,软件测试工程师,担心被应届生取代

工作了3年,一个月工资不到20K,担心被应届毕业生取代! 互联网的快速发展伴随着员工适者生存的加速。几年是一条分界线。如果人们的能力和体力不够,他们就会被淘汰。生动的工作生活让许多人焦虑不安。 最近,一名来自211本…

Java分布式事务(五)

前言 随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用,下图描述了单体应用向微服务的演变。 文章目录🔥分布式事务处理-认识分布式事物🔥分布式架构的理论知识-CAP理论🔥分布式事务处理-分布式事务产…

查询校园网是否支持IPv6绕过校园网

方法一、连接校园网,登录认证网络可用后返回WIFI页面点击校园网WIFI的属性查看是否有IPV6地址 本地的IPV6地址不算哦 (一般IPv6地址都是数字开头,fe80开头的都是本地IPv6地址是没用的)方法二、连接校园网,登录认证网络…

《信号分析与处理》期末复习题库整理(题目+手写知识点+答案+期末知识点精细)

文章目录一、傅里叶变换、s域变换、z域变换(待:整理一些常用以及方程变换)傅里叶变换s域变换z域变换二、试卷一、选择题12345678910111213141516171819202122232425262728二、填空题123567891011121314151617三、计算题123456781011121314151…

shiro反序列化

shiro550反序列化 | 清风的博客这个看着更舒服点 环境搭建 JDK:1.7 Tomcat:8.5.83 shiro源码:下载地址:https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4 shiro war包:下载地址SHIRO-550/samples-…

逻辑优化基础-disjoint support decomposition

先遣兵 在了解 disjoint support decomposition 之前,先学习两个基本的概念。 disjoint 数学含义上的两个集合交集,所谓非相交,即交集为空集。 A∩BC⊘A \cap B C \oslash A∩BC⊘ support 逻辑综合中的 supportsupportsupport 概念是…

【创建“待选项”按钮02计算坐标 Objective-C语言】

一、之前,我们已经把“待选项”按钮,创建好了,但是唯一的问题是,坐标都是一样的,所以都显示在一起了 1.下面,我们来设置一下,这些“待选项”按钮的坐标, 现在,“待选项”按钮的坐标,是不是都在同一个位置啊, 回忆一下,这个待选项按钮,是怎么生成的, 首先,是在…

PCA-APCA-MLR

全称 principal component analysis-absolute principal component score-multiple linear regression 原理 绝对因子分析/多元线性回归受体模型(APCS—MLR)的基本原理是将因子分析的主因子得分转化为绝对主因子得分(APCS),各指标含量再分别对所有的APCS进行多元线性回…

课程作业及比赛任务,已支持 Notebook 内直接提交|ModelWhale 版本更新

早春时节、万物复苏,我们又迎来了 ModelWhale 新一轮的版本更新。本次更新中,ModelWhale 主要进行了以下功能迭代:新增 Notebook 内提交课程作业及比赛任务(团队版✓ )新增 Canvas 组件停止维护提示(团队版…

44-Golang中的channel

Golang中的channel为什么要使用channelchannel的介绍channel的基本使用定义/声明channel管道的遍历和关闭channel的关闭channel的遍历goroutine和channel结合应用实例1应用实例2案例注意事项为什么要使用channel 前面使用全局变量加锁同步来解决goroutine的通讯,但…