transformer变体

这篇博客深入探讨了Transformer模型的三种变体:Universal Transformers, Transformer-XL和Reformer。Universal Transformers通过循环结构解决了图灵完备性问题,Transformer-XL引入了Segment-level Recurrence解决长文本建模问题,而Reformer则通过可逆层、分块计算和LSH注意力机制降低了计算资源需求。" 8722823,949380,Android开发:CMWAP与CMNET登录差异解析,"['Android开发', '移动网络', 'HTTP协议', '代理设置', 'CMWAP', 'CMNET']
摘要由CSDN通过智能技术生成

1. Introduction

 在这篇博客,我们详细的介绍了transformer的结构,也介绍了transformer还存在的问题,接着本篇文章将会介绍关于transformer的多种改进,让我们了解一下更加丰富多彩的transformer结构。

2.各种变体

2.1 Universal transformers(UT)

 提出于2018年,是transformer的后续工作,它的提出是为了解决transformer固有的非图灵完备性及缺少conditional computation的问题。

 UT与transformer的结构基本相同,只是在细节方面存在着差异:

UT序列图

架构图

 理解transformer后这里很容易理解,稍微的区别就是注意由于transformer只有一次前传,所以位置与时间编码都是一次的,而UT则使用了类似RNN的循环,所以每次迭代都要编码位置信息和时间信息,编码方式为:
P i , 2 j t = s i n ( i / 1000 0 2 j / d ) + s i n ( t / 1000 0 2 j / d ) P_{i,2j}^{t} =sin(i/10000^{2j/d})+sin(t/10000^{2j/d}) Pi,2jt=sin(i/100002j/d)+sin(t/100002j/d)

P i , 2 j + 1 t = c o s ( i / 1000 0 2 j / d ) + c o s ( t / 1000 0 2 j / d ) P_{i,2j+1}^{t} =cos(i/10000^{2j/d})+cos(t/10000^{2j/d}) Pi,2j+1t=cos(i/100002j/d)+cos(t/100002j/d)

前传过程:universal transformer encoder的示意图,横坐标position是输入序列token的位置;纵坐标是迭代次数depth。在transformer中,block的层数是固定的(base是6层),universal transformer则通过递归函数使得层数不再固定,可以是任意。这种模式综合了transformer的优点,同时又具备RNN的Recurrent Inductive Bias,并且在理论上做到了图灵完备。

 循环的加入解决了图灵完备性问题,那么conditional computation问题则是通过Adaptive Computation Time(ACT)机制来实现的。此处供参考

ACT机制作用下的UT

2.2 Transformer-XL

 CMU联合Google Brain在2019年1月推出的新模型,它的提出解决了transformer模型对长文本建模能力不足的问题。受限于算力问题,对于长文本,如果一次全部输入,考虑到query,key, value的shape为[batch_size, seq_len, d_model],很容易就OOM,这时候,一个变通方法就是通过分割成长度小于等于 d m o d e l d_{model} dmodel(默认512)的segment,每个segment单独处理,互不干涉,这种模型也被称为vanilla Transformer

将长文本进行segment,然后依次建模

vanilla Transformer

 在vanilla transformer中,根据之前的字符预测片段中的下一个字符。例如,它使用 x 1 x_{1} x1 , x 2 x_{2} x2 , . . . , x n − 1 x_{n − 1} xn1预测字符 x n x_{n} xn,而在之 x n x_{n} xn后的序列则被mask掉。它将输入分成段,并分别从每个段中进行学习,如上图所示。 在测试阶段如需处理较长的输入,该模型会在每一步中将输入向右移动一个字符,以此实现对单个字符的预测。

 很显然,这样的处理是存在问题的:

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

 针对上面的问题,transformer-xl通过一种被称为Segment-level Recurrence的技术来解决,其思路类似于RNN,通过将前一个segment的memory送入到下一阶段来实现信息传递。

Segment-level Recurrence

Recurrence 细节

 具体的过程中,加入segment t生成的memory为(prev_seq_len, batch_size, d_model), segment t+1进行运算的时候,对于其key和value,由于这两个状态编码了token的信息,因而需要look ahead来混合t时刻的信息,做法就是在进行multihead的时候,不是针对当前时刻的输入x(cur_seq_len, batch_size, d_model)进行project(x),而是进行project(concat([memory, x], axis=0))(project一般为Linear层),另外,memory不参与本segment的反响传播。

key和value的计算需要考虑前一个segment的信息

recurrence公式:

 其中,τ表示第几段,n表示第几层,h表示隐层的输出。SG(⋅)表示停止计算梯度, [ h u ∘ h v ] [ h u ∘ h v ] [huhv] 表示在长度维度上的两个隐层的拼接,W.是模型参数。

 transformer-xl中还有个需要注意的地方就是,其使用的不是absolute positional encoding,因为在分段的情况下,如果仅仅对于每个段仍直接使用Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。比如,第i−2段和第i−1段的第一个位置将具有相同的位置编码,但它们对于第i段的建模重要性显然并不相同(例如第i−2段中的第一个位置重要性可能要低一些)。因此,需要对这种位置进行区分。取而代之的是,transformer-xl使用的是relative position encoding技术,其提出理论基础如下:
( Q K T ) i , j = ( E + P ) i , ∘ W Q ( W K ) T ( E + P ) ∘ , j T = ( E + P ) i , ∘ W Q ( W K ) T ( E T + P T ) ∘ , j = E i , ∘ W Q ( W K ) T ( E T + P T ) ∘ , j + P i , ∘ W Q ( W K ) T ( E T + P T ) ∘ , j = E i , ∘ W Q ( W K ) T E ∘ , j T ⏟ a + + P i , ∘ W Q ( W K ) T P ∘ , j T ⏟ b + E i , ∘ W Q ( W K ) T P ∘ , j T ⏟ c + P i , ∘ W Q ( W K ) T E ∘ , j T ⏟ d \begin{aligned} (QK^{T})_{i,j}&=(E+P)_{i,\circ}W^{Q}(W^{K})^{T}(E+P)^{T}_{\circ,j}\\&=(E+P)_{i,\circ}W^{Q}(W^{K})^{T}(E^{T}+P^{T})_{\circ,j}\\&=E_{i,\circ}W^{Q}(W^{K})^{T}(E^{T}+P^{T})_{\circ,j}+P_{i,\circ}W^{Q}(W^{K})^{T}(E^{T}+P^{T})_{\circ,j}\\&=\underbrace{E_{i,\circ}W^{Q}(W^{K})^{T}E^{T}_{\circ,j}}_{a}++\underbrace{P_{i,\circ}W^{Q}(W^{K})^{T}P^{T}_{\circ,j}}_{b}+\underbrace{E_{i,\circ}W^{Q}(W^{K})^{T}P^{T}_{\circ,j}}_{c}+\underbrace{P_{i,\circ}W^{Q}(W^{K})^{T}E^{T}_{\circ,j}}_{d} \end{aligned} (QKT)i,j=(E+P)i,WQ(WK)T(E+P),jT=(E+P)i,WQ(WK)T(ET+PT),j=Ei,WQ(WK)T(ET+PT),j+Pi,WQ(WK)T(ET+PT),j=a Ei,WQ(WK)TE,jT++b Pi,WQ(WK)TP,jT+c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值