零、前言:
📕欢迎访问:
Bilibili:space.bilibili.com/57089326
🍬观前小剧场:
Q:现在网上也有很多解读Transformer的文章,你这个优势在哪里?
A:事实上,我并不是因为有优势而去写的,写文章的目的其实也是自己学习和理解的一个过程。
A:不仅如此,我觉得可能我的一些解释和例子,在大牛看起来可能有些小儿科,可能是没必要的内容,但是,如果能够帮助到像我一样的初学者,或者仅仅是给通勤路上的你带来一点点乐趣,那也就值得了。
A:原文链接:arxiv.org/abs/1706.03…
一、变压器?变形金刚?Transformer到底在变什么鬼?
0. Transformer名字解释:
事实上,Transformer这个名字在技术上体现了模型中的自注意力机制。在Transformer中,自注意力机制允许模型在输入序列中的每个位置上关注序列中其他位置的信息,从而能够有效地将输入序列中的不同部分进行转换和组合。
现在还不太理解?没关系,继续往后看,会逐一解释。
类比于电气工程中的变压器,变压器可以将输入电压转换为输出电压,并且能够在输入和输出之间实现电气隔离。Transformer模型可以将输入序列中的信息转换为输出序列中的信息,并且能够在输入和输出之间实现信息隔离。因此,这种类比可以帮助人们更好地理解Transformer模型中自注意力机制的作用和优势。
另外,类比于变形金刚,变形金刚可以通过变形来适应不同的环境和任务,类似地,Transformer模型也可以通过调整不同的超参数和结构来适应不同的自然语言处理任务。此外,变形金刚还可以将不同部分进行组合,形成新的机器人,Transformer模型也可以通过自注意力机制将输入序列中不同部分进行组合,形成新的特征表示,从而更好地完成自然语言处理任务。
1. 摘要和结论:
对于主流的序列转录(由序列生成序列)模型,一般是通过复杂的循环,或者是CNN,一般是用一个Encoder和Decoder的架构。在性能比较好的模型里面,通常会在Encoder和Decoder之间使用一个注意力机制。
Transformer这篇文章提出了一个比较简单的架构,也就是仅仅依赖于注意力机制,而没有用循环或者卷积。Transformer做了两个机器翻译的实验,达到了更好的并行度、更少的训练时间,达到了28.4的BLEU(机器翻译的一个衡量标准)。
一开始,Transformer其实只是想做一个机器翻译的任务,但后来随着BERT和GPT把它用到了更多的NLP任务上时,Transformer就火了,还用在了CV方面,几乎什么东西都能用。
-
Transformer是第一个仅仅使用注意力机制做序列转录的模型,主要就是用Multi-Headed Self-Attention。
-
Transformer在机器翻译上的训练速度比其他架构快很多,而且效果比较好。
-
Transformer用于其他的任务上可以使得生成不那么时序化。
2. 导言:
2017年,在时序模型里面有LSTM,GRU等等。这里面主要有两个模型:语言模型,Encoder+Decoder模型(当输出的结构化信息比较多的时候)。对于RNN,假设输入是一个句子,那么就会从左往右一个词一个词的看过去。
具体来说:对于第tt个词,会计算一个输出hth_t(隐藏状态),而hth_t是由ht−1h_{t-1}和第tt个词来决定的,这就是为什么RNN能够有效处理时序信息。
但同时,问题也出现在这里,因为是时序的过程,所以比较难去并行(依赖关系),不能很好的利用现在的硬件加速设备GPU,TPU等。
不仅如此,当序列比较长的时候,前面的信息可能传到后面就被丢掉了,如果要保留下来的话就需要比较大的hth_t,这样会导致很大的内存开销,显然也是划不来的。
RNN的Encoder+Decoder其实已经用上了注意力机制了,主要是用在如何有效把Encoder的内容传给Decoder。但是Transformer因为是用的纯注意力机制,所以可以达到比较高的并行度,可以在更短的时间里面获得更好的结果。
3. 相关工作:
ByteNet和ConvS2S这些工作已经说了如何使用卷积神经网络替换循环神经网络,使得减少时序的计算,但是这存在一些问题,就是说,利用CNN难以对比较长的序列进行建模。这是因为CNN在做计算的时候,每次会看一个比较小的窗口,如果说有两个比较远的像素,那就需要很多层卷积来最后把它给融合起来。
但是如果使用Transformer的注意力机制的话,一层就可以看到所有的像素。不过CNN的好处就是可以多通道的输出,所以说Transformer在普通的注意力机制上提出了多头注意力机制,即Multi-Head Attention。这个会在后面讲到。
Transformer还提到了自注意力机制,虽然这个东西并不是Transformer的独创就是了,自注意力机制和注意力机制有什么区别呢?
自注意力机制是一种用于计算输入序列中不同位置之间关联度的机制,而注意力机制是一种用于计算不同位置之间权重关系的机制。
可以说,自注意力机制是注意力机制的一种特殊形式。
注意力机制是一种用于计算不同位置之间的权重关系的机制,用于在输入序列中找到与特定查询相关的信息。具体来说,注意力机制将查询向量和一组键向量进行比较,并使用softmax函数将每个键向量的权重计算出来,最终将加权的值向量作为注意力机制的输出。这种机制常用于自然语言处理中的任务,如机器翻译和问答系统中。
自注意力机制是Transformer模型中的一种机制,它是一种特殊的注意力机制,用于计算输入序列中不同位置之间的关联性。与传统的注意力机制不同,自注意力机制中的查询向量、键向量和值向量都来自于同一个位置的输入向量,通过计算不同向量之间的相似度来计算关注程度。这种机制能够捕捉输入序列中的长距离依赖关系,避免了传统序列模型中的信息瓶颈问题,因此被广泛应用于自然语言处理任务中。
文章还提到了Memory Network的东西,在当时(2017年)是一个热点,不过现在已经不温不火了。
二、模型架构——让我们来拆开变形金刚看一看
1. 模型概述:
要了解Transformer的模型,首先就需要解释一下Encoder+Decoder:
对于Encoder而言,会将一个输入[x1,x2,…,xn][x_1, x_2, …, x_n]表示成,也就是输出为[z1,z2,…,zn][z_1, z_2, …, z_n],每一个ztz_t都是对应着xtx_t的一个向量表示。这就是把原始的输入转换成机器学习可以理解的向量,比如说从句子到向量。
对于Decoder而言,拿到了Encoder的输出,会生成一个长为mm的序列[y1,y2,…ym][y_1, y_2, …y_m](mm不一定等于nn),需要注意的是,Decoder是一个一个生成的,而不是像Encoder一样一口气可以看过去,这个一个一个生成的模型叫做自回归,即auto-regressive
。
自回归:要想获得yty_t,就需要把y1y_1到yt−1y_{t-1}全部都得到,即过去时刻的输出,也会作为当前时刻的输入。
如图所示,我们接下来就来说一下这张典中典的图:
这是一个Encoder-Decoder的架构,左边一坨是Encoder,右边一坨是Decoder。
左下角的input
就是Encoder的输入,而右下角的Output
实际上是Decoder的输入,也就是上一时刻的Decoder的输出,shifted right
就是输入和输出不断右移的过程。
输入input
会先进入一个嵌入层Embedding
,作用是把一个一个的词表示成一个一个的向量。
Positional Encoding
是一种将位置信息嵌入到输入序列中的技术,以便模型能够感知输入序列中各个位置之间的相对距离关系。
再往上就是Encoder的部分了,左边的N×
代表的是,像这样的Encoder层,有NN个;
Multi-Head Attention
顾名思义就是多头注意力机制;Add
就是残差的连接;Norm
是一个层归一化的操作;Feed Forward
是前馈神经网络;
随后,Encoder的输出进入到Decoder的中间作为输入。
对于Decoder的部分,我们可以看到上面的部分和Encoder是完全一样的,
只是下面多了一个Masked Multi-Head Attention
,同样的,N×
的意思还是一样。
最后,输出会进入一个线性的输出层Lineat
,然后进行一个Softmax
,就会得到最终的输出。
2. Encoder:
默认的Encoder一共有N=6N = 6层,的每个层layers
有两个子层sub-layers
:
Multi-Head Self-Attention
MLP: Positionwise fully connected feed-forward network
用残差连接每个sub-layers
,最后使用layer normalization
。
每个layer
的公式:LayerNorm(x+Sublayer(x))LayerNorm(x+Sublayer(x))
因为残差需要输入输出一样大,Transformer为了简单起见(不做投影)就都设置了dmodel=512d_{model}=512。
由此,Transformer的可调参数就只有两个了:NN和dmodeld_{model};
后续基于它做的BERT和GPT等等,都是只需要调这两个参数。
3. LayerNormalization:
LayerNormalization
是一种在深度神经网络中用于归一化每个输入特征的技术。
在Encoder层中,LayerNormalization
被用于对每个位置的隐藏层向量进行归一化,以确保每个位置的向量在同一尺度上。
如果要解释呢,就是说LayerNormalization
会对每个位置的隐藏层向量进行如下的归一化操作:
- 首先,计算该向量在每个特征维度上的均值和方差。
- 然后,将该向量在每个特征维度上减去均值并除以方差的平方根。
- 最后,将结果乘以一个可学习的缩放因子和加上一个可学习的偏移量。
这样做的话,层归一化可以使得每个位置的向量更加稳定,减少了不同输入之间的差异,有助于提高模型的泛化性能。
至于为什么使用LayerNorm
而不是BatchNorm
,事实上是因为在变长的任务中(文本分类、机器翻译等),输入序列的长度可能会不同,因此每个batch的样本数量和长度都可能不同。
4. Decoder:
Decoder的结构与Encoder类似,但是在处理输入序列时需要注意避免自身的信息泄露。
默认的Dncoder也有N=6N = 6层,每个层layers
有三个子层sub-layers
:
Masked Multi-Head Self-Attention
:在生成目标序列时,需要避免将当前位置之后的信息泄露给模型。因此,Decoder的第一个子层使用Mask
来限制每个位置只能看到之前的位置,并使用多头自注意力来计算每个位置的编码表示。Multi-Head Attention
:Decoder需要将编码表示与Encoder的输出进行交互,以获取源序列的信息。因此,Decoder的第二个子层使用多头注意力来计算每个位置的上下文向量。MLP: Positionwise fully connected feed-forward network
:与Encoder类似,Decoder的第三个子层使用全连接前馈网络来对每个位置的编码表示进行非线性变换。
三、Attention is all you need?
1. Scaled Dot-Product Attention:
注意力函数是一个将query
和一些key-value
对映射成ouptut
的函数。
output
是value
的一个加权和,所以他们的维度是一样的。
对于每个value
的权重,是通过这个value
对应的key
和query
的相似度计算而来的。
当然,这个相似度计算的算法对于每个任务而言是不一样的(但是道理是一样的),Transformer的版本:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(frac{QK^T}{sqrt{d_k}})V
名字叫做Scaled Dot-Product Attention
,其query
和key
的长度都是dkd_k,对它们做内积,
而value
是dvd_v(显然输出也就是dvd_v了)。
用内积表示相似度这个事情很好理解,向量嘛,看一看它们的夹角。
在实际过程中,这样算可能会有点慢,所以其实真正的方法是把很多query
写成一个矩阵,同时对一组查询进行注意力计算,这些查询被打包成一个矩阵QQ,键和值也被打包成矩阵KK和VV,就如上式啦。
至于为什么要除以一个dksqrt{d_k},是因为当dkd_k的值比较小时,这种点乘方法的注意力机制和另一种加性方法的注意力机制的表现相似。但是,对于较大的dkd_k值,加性注意力的表现要优于点积注意力(没有缩放因子)。这大概是因为在较大的dkd_k值下,点积的值会变得很大,将softmax
函数推到具有极小梯度的区域。为了抵消这种影响,Transformer就使用了缩放因子1dkfrac{1}{sqrt{d_k}}来调整点积的大小。
整个过程的计算图如下:
其中的Mask
操作是为了防止tt时刻看到后面的内容,影响输出(因为注意力机制不是会看到所有的嘛),挡上之后,后面的那些内容的权值就会变成负的一个绝对值很大很大的数,比如1e-10
,从而让它们在softmax
的时候变成00。
2. Multi-Head Attention:
Multi-Head Attention
是一种用于计算输入序列中不同位置之间关联度的机制。
基本原理是将输入序列中的每个元素都映射为多个不同的向量表示,然后计算不同向量之间的相似度来计算关联度。这个过程涉及三个步骤:
- 线性映射:对输入序列进行线性映射,将其转换为一个包含不同维度的向量表示。具体来说,将输入序列乘以三个权重矩阵,分别表示查询、键和值的线性映射。
- 注意力计算:对于每个查询向量,在所有键向量上计算其与之对应的注意力得分,表示该查询向量对不同键向量的关注程度。这个计算过程可以使用点积注意力、加性注意力等方法。
- 加权求和:将每个值向量与对应的注意力得分相乘并加权求和,得到一个表示该查询向量的加权键向量。这个过程可以重复多次,得到多个加权键向量,最终将它们拼接在一起生成一个多头注意力表示。
这样一来,模型就能够同时关注输入序列中不同位置的信息,并且学习到它们之间的关联性了。
3. 不只是Attention!
实际上,Transformer模型不仅仅依赖于自注意力机制,还使用了MLP、Mask、残差连接、层归一化等关键技术,这些技术也缺一不可。
这些技术都是Transformer模型中不可或缺的组成部分,它们共同作用于模型中,使得Transformer能够在自然语言处理任务中取得了很好的效果。
四、站在过去,展望未来
当我们回顾过去,会发现,Transformer模型对NLP领域的影响是深远的。Transformer模型的提出,不仅仅是一种新的神经网络模型,更是一种全新的思路和范式,它开创了自注意力机制的新时代,成为NLP领域的一股强劲推动力量,就如几年前的CNN之于CV一样。
站在过去的2017年,Transformer模型在机器翻译、文本生成、问答系统等任务中取得了突破性进展,赋予了NLP模型更强的处理语义和上下文的能力,使得NLP应用更加普及和高效。此外,Transformer模型也为NLP领域的研究提供了新的思路,推动了NLP乃至所有的AI领域的发展和创新。
展望未来的20年代中后期,Transformer模型大概仍将继续发挥重要作用。在多模态、现实交互等挑战面前,Transformer模型需要进一步优化和改进,以适应更加复杂和多样化的应用场景。同时,我们也需要探索更多新的技术和思路,以进一步提升模型的性能和效率。
THE END.