Attention Is All You Need

在这里插入图片描述
论文链接:https://arxiv.org/pdf/1706.03762.pdf

李沫老师讲解这篇文章非常的详细,视频链接:
https://www.bilibili.com/video/BV1pu411o7BE?from=search&seid=4820643104805224410&spm_id_from=333.337.0.0

1、Introduct

RNN的特点,同时也是缺点

给一个序列,RNN的计算是从左往右一步一步往前做。

假设序列是句子,就是一个词一个词往前看,对第t个词会计算一个输出ht,也叫隐藏状态。

ht是由前面一个词的隐藏状态ht-1和当前第t个词本身决定的,就可以把前面学到的历史信息,通过ht-1放到当下,然后和当前的词做计算,得到输出。

这也是RNN如何能够有效处理时序信息的关键性所在,把之前的信息全部放在隐藏信息里面,然后一个一个放下去。

存在问题:

  • 时序,难以并行。计算ht必须保证ht-1必须计算完成。
  • 历史信息一步一步往下传递,如果序列很长,前面信息可能被丢掉了。如果不想丢掉,就需要保存下来,内存开销很大。

2、Background

卷积网络替换循环神经网络,减少时序的计算。

存在问题:用卷积神经网络对比较长的序列很难建模。卷积计算每次看一个比较小的一个小窗口。例如看一个3×3的像素块。

  • 如果两个像素隔的比较远,需要用很多层卷积,一层一层上去,最后才能把这两个像素融合起来。
  • 如果使用Transformer的注意力机制的话,每次能看到所有的像素,一层就可以把整个序列看到。

卷积好的地方为可以做多个输出通道。每个输出通道相当于可以识别不一样的模式。因此Transformer提出一个Multi-Head Attention,模拟神经网络多输出通道的效果。

3、Model Architecture

Transformer使用了 编码器-解码器 的架构

什么是编码器、解码器

  • 编码器:把输入长度为n的(x1,…,xn) 序列,假设是一个句子的话,xt 就代表第 t 个词。编码器会将序列变成一个长度为n的序列 z =(z1,…,zn),每个zt 是对应的是 xt 的向量的表示。
    假设是一个句子,那么 zt 就表示第 t 个词的向量的表示。也就是把原始的输入变成机器学习可以理解的一个向量。
  • 解码器:拿到编码器的输出 z ,生成一个长为 m 的序列(y1,…,ym)
    n和m可以是一样长的,也可以是不一样长的。比如翻译,将英文句子翻译成中文句子,两个句子很有可能就是不一样长的。
  • 解码器跟编码器很大的一个区别:
    对于编码器来讲,编码器是可以看到一整个句子的。但是对于解码器,词只能一个一个的生成。
    编码器为一个自回归模型(auto-regressive),即你的输入又是你的输出(过去时刻的输出也会作为你当前时刻的输入)。
    举个例子:最开始给定 z ,生成第一个输出 y1,在拿到y1之后,生成 y2,一般来说,要生成 yt 的话,可以把之前的 y1 到 yt-1 的词拿到,也就是一个词一个词的往外蹦,也就是你在过去时刻的输出也会作为你当前时刻的输入。

Transformer将 自注意力机制(self-attention )以及point-wise,fully connected layers,一个一个堆在一起。

3.1 Encoder and Decoder Stacks
Transformer框架
在这里插入图片描述

编码器:
在这里插入图片描述

  • 编码器的输入Inputs:如果是中文翻译成英文的话,输入就是中文句子。
  • 嵌入层Inputs Embedding:将输入的词表示成向量。(3.4节细讲
  • Positional Encoding:加入时序信息。(3.5节细讲
  • N×,代表有N个层堆叠在一起。
  • Multi-Head Attention、Feed Forward:注意力层(3.2细讲) + MLP(Feed Forward (3.3细讲))
  • Add & Norm:残差连接 + LayerNorm (详细解释细讲

详细解释:

  • 首先Encoder包含N=6个layers,每个layers包含两个sub-layers,第一个为multi-head self-attention,另一个为simple,position-wise fully connected feed-forward network(实际上就是MLP)。然后对每个子层,用了一个残差连接,再使用一个layer normalization。

    每一层公式表示为 L a y e r N o r m ( x + S u b l a y e r ( x ) ) LayerNorm(x+Sublayer(x)) LayerNorm(x+Sublayer(x)):输入x,进入子层Sublayer,然后残差连接(输入和输出加在一起),最后经过LayerNorm。

  • 残差需要输入和输出一样大小,不一样就得做投影。为了简单起见,把每一个层输出的维度变为 d m o d e l = 512 d_{model}=512 dmodel=512,也就是说,对于每个词,不管是哪一个层,都做512长度的表示。这里和CNN、NLP不一样,NLP经常维度往下减,CNN空间维度往下减,但是channel维度往上拉。

    固定长度为512,使得模型相对是简单,也就只有N,和 d m o d e l d_{model} dmodel两个参数可以调。简单设计影响到后面一系列网络,例如BETR,实际上也就2个参数可以调。

什么是LayerNorm?
首先考虑2维数据输入,输入为一个矩阵。
假设每一行是我们的样本,每一列是特征。(每一行是同一个样本的不同特征,每一列是不同样本的一个特征)

BatchNorm(2维数据)

  • BatchNorm干的事情就是:每一次把每一列(也就是每个特征),在一个小的mini-batch里面均值变成0,方差变成1。在训练的时候,可以小批量。在预测的时候,把全局的均值算出来。也就是训练时候把整个数据扫一遍,把全部的均值和方差存起来,在预测使用。
  • 还会去学一个λ、和β,可以把向量通过学习可以换成一个任意方差为某个值,均值为某个值的东西。
    在这里插入图片描述

LayerNorm(2维数据)

  • LayerNorm很多时候和BatchNorm是一样的。
  • LayerNorm干的事情就是:对每个样本(也就是每个行)变成均值为0,方差为1。
  • 可以认为LayerNorm把整个数据转置一下,放进BatchNorm,出来的结果,再转置回去。
    在这里插入图片描述

但是Transformer里面,或者正常的RNN里面,输入是一个3维的数据,是一个序列的样本。
例如一个句子,有n个词,一个词有一个向量,还有一个batch
行为样本batch、列为sequence的长度、对于每个sequence(每个词)有自己的向量(feature)

BatchNorm(3维数据)
n为长度,d为512
在这里插入图片描述
取一个特征,然后把每个序列里面的元素以及整个batch全部提取,拉成一个向量,然后把均值变成0,方差变成1。

LayerNorm(3维数据)
只看黄色,横着切一下
在这里插入图片描述
具体来说,为什么LayerNorm用的多一点?
因为在时序序列模型里面,每个样本的长度会发生变化。
例子:4个长度不一样的样本
在这里插入图片描述
如果用的是BatchNorm的话,feature切出来的效果如下(0填充到max_len)
在这里插入图片描述
如果样本长度变化比较大的时候,每次做小批量的时候算的均值和方差抖动相对比较大。
做预测的时候,需要把全局的均值和方差记录下来。
如果全局的方差遇到一个新的样本,特别特别长,在训练的时候没见过,则之前算的均值和方差是不那么好用的。
在这里插入图片描述

但LayerNorm没有这样的问题,因为LayerNorm是每个样本自己来做均值和方差,也不需要存下每个样本的均值和方差。不管样本是长还是短,反正算样本是在自己本身算的。相对来说稳定一些。
在这里插入图片描述

解码器:
在这里插入图片描述

  • 解码器的输入Outputs:解码器在预测的时候是没有输入的,实际上是解码器在之前时刻的输出作为输入(因此叫做Outputs)。shifted right就是一个一个往右移。
  • 基本上和编码器一样,但是多了一个Masked Multi-Head Attention

详细解释:

  • 解码器由N=6个identical layers构成的,每个层和编码器一样,有两个一样的子层,但是解码器用了一个第三个子层,同样是一个多头的注意力机制,同样用了残差连接和LayerNorm。
  • 解码器做的是一个自回归,当前的输入其实是上一刻的输出,意味着在做预测的时候,不能看到之后的输出,但是在注意力机制里面,每一次能看到一整个完整的输入,所以在解码器训练的时候,在预测第 t 个时刻的输出的时候,不能看到 t 时候之后的输入(3.2中怎样做mask小节中进行讲解)。从而保证训练和预测的时候行为是一致的。

接下来看每个子层是怎样实现的

3.2 Attention

  • 注意力函数是一个将一个query和一些key-value对映射成一个输出的一个函数。query、keys、values、output都是向量。具体来说就是,output是values的一个加权和。output的维度和value的维度是一样的。
  • 对于每一个value的权重,是value对应的key和查询query的相似度算来的(compatibility function)

假设我们有3个value和3个对应的key,假设query和第一个和第二个key比较像。那么输出就是3个v的相加,但是第一个value和第二个value的权重会比较大一点。
在这里插入图片描述
不同的相似函数会导致不同的注意力版本

3.2.1 Scaled Dot-Product Attention

  • querys和keys长度是等长的,都是dk,values的长度为dv,输出也一样是dv。
  • 对querys和keys,做内积,内积的值越大,越相似。如果内积为0,为垂直状态,没有相似度。
  • 算完内积之后,再除以 d k \sqrt{d_{k}} dk (再经过softmax,在作用在value上。
    querys可以写成矩阵Q(n行(n个query),维度dk),keys也可以写成矩阵K(m行,维度dk)。values为矩阵V。
    在这里插入图片描述
    矩阵(n×m)的每一行,蓝色的线,就是一个query对所有key的累积值。
    矩阵(n×dv)的每一行就是我们要的输出了。
    对于key-value对,对于n个query,可以通过2次矩阵乘法完成计算,实现并行。

除以 d k \sqrt{d_{k}} dk 的原因:

  • 当dk不是很大的时候,其实除不除没有关系。
  • 但是dk比较大的时候,也就是两个向量长度比较长的时候,做点积的时候,值可能比较大,也可能比较小。当值相对大的时候呢,相对差距就会变大,导致最大的值做softmax之后,就会更靠近1,剩下的值更加靠近0,值更加向两端靠拢。当出现这种情况的时候,算梯度的时候会发现,梯度比较小,因为softmax最后的结果就是希望置信的地方靠近1,不置信的地方尽量靠近0,这样就说明收敛得差不多了,梯度就会变得小,就会跑不动。
    transformer的dk=512比较大,所以除以 d k \sqrt{d_{k}} dk 是一个不错的选择。( d k \sqrt{d_{k}} dk 应该是作者找的经验参数。)
    在这里插入图片描述
    在这里插入图片描述

怎么做Mask?

Mask是避免在 t 时刻,看到 t 时候以后的东西。
假设query和key是等长的。长度为n,时间是可以对齐的。
对 t 时间的 qt,计算 qt 时刻的时候,应该只是看 k1 一直到 kt-1 ,而不应该去看 kt 和它之后的东西。因为 kt 在当前时刻还没有。但是我们知道在注意力机制的时候,其实我们是能看到所有,这个时候怎么办?
算的时候还是可以算的,但是算出来之后,记住在计算权重的时候,也就是算输出的时候,不要用到后面的东西就行了。具体操作就是加了Mask。

Mask的意思是说,对于qt 和 kt 和它之后的计算的值,换成非常大的负数,例如 -1e10 ,这么大的负数,在进入softmax做指数的时候就会变成0.所有导致softmax出来后,kt 和之后的值对应的权重都为0,只有前面的 k1,…,kt-1 出效果。在算output的时候,只用了v1,…,vt-1 。

Mask效果是,在训练的时候,让 t 时刻的query,只看对应的前面那些时刻对应的key-value对,使得在做预测的时候,跟训练是可以一一对应上的。
在这里插入图片描述
3.2.2 Muti-Head Attention

与其做当个单个的注意力函数,不如keys和values投影到低维,投影h次。然后再做h次的注意力函数。然后每一次的注意力函数并在一起,再投影回来,得到最终的输出。
V、K、Q为原始的values、keys、querys,然后经过Linear线性层,投影到低维的维度。再做一个Scaled Dot-Product Attention。这里做h次,得到h个输出,全部Concat合并到一起,最后做一个Linear线性的投影。
在这里插入图片描述
为什么要做多头注意力机制呢?
如果只做Scaled Dot-Product Attention,没有什么可以学的参数。距离函数就是累积。
有时候为了识别不一样的模式,希望有不一样的计算相似度的办法。
首先先投影到低维,这个投影的W是可以学的,所以给它 h 次机会,学到不一样的投影方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的相似函数,最后concat回来。有点像在卷积函数里面有多个输出通道的感觉。
在这里插入图片描述
在Multi-Head的情况下,还是以前的Q、K、V,但是输出是不同的head输出的结果concat在一起,然后投影到 W O W^{O} WO里面。对于每一个头的head,把Q、K、V,通过不同可以学习的W: W i Q W_{i}^{Q} WiQ W i K W_{i}^{K} WiK W i V W_{i}^{V} WiV投影到一个低维上面,再做注意力函数。
实际上用 h=8 ,也就是用8个head。而且我们知道,做注意力的时候,因为有残差理解的存在,输入和输出的维度是一样的,所以投影的时候,为输出的维度除以h,也就是每一次投影到64维的维度,然后算注意力函数,再合并,投影回来。

3.2.3 Applications of Attention in our Model

Transformer里面3个attention在干什么事情。

编码器的注意力层是干什么事情?

  • 编码器的输入,假设句子的长度维 n 的话,则输入为n个长为d的向量。
  • 注意力层有三个输入,从左到右分别表示的是key,value,query,然后是由Input Embedding过来,复制成3项,意思就是说,同样的东西即作为key,value,也作为query。所以叫做自注意力机制
  • 输入n个query,每个会得到一个输出,会有n个输出,输出的维度和value一样,也就是d,输入和输出的大小其实是一样的。
  • 对于每个query,计算一个输出。输出其实就是value的加权和。绿色线代表权重,跟自己算肯定是最大的。如果不考虑多头和有投影的情况,输出其实就是输入的加权和,权重来自于自己本身跟各个向量之间的相似度。而考虑多头和投影,会学习h个不一样的距离空间出来,使得出来的东西不一样。 在这里插入图片描述

解码器的注意力层是干什么事情?

  • 解码器第一个注意力层和编码器是一样的,长度改为m,维度也是一样的。唯一不一样的就是有Mask,再解码器的时候,对应输出的时候,不应该看后面的东西,也就是黄色的线,后面的权重设置为0。
    在这里插入图片描述
  • 解码器的第二个注意力层,注意到这里已经不是自注意力机制了
    key和value 来自于编码器的输出,query来自于解码器下一层的输出。
    在这里插入图片描述
    也就是说,这个attention干的事情,就是去有效的把编码器里面的输出,根据我想要的东西,拎出来。
    举个例子:
    假设英文翻译中文。在算“好”的时候,去看Hello的向量应该会相近一点,给比较大的权重。在算“世”的时候,会在第二个向量world,给一个大的权重。
    在这里插入图片描述
    意思就是,根据在解码器的时候,输入不一样,会根据当前的向量query,去在编码器的输出里面挑我感兴趣的东西,也就是注意到感兴趣的东西,不那么感兴趣的东西可以忽略掉。

接下来看Feed Forward在干什么事情。
3.3 Position-wise Feed-Forward Networks
实际上就是一个fully connected feed-forward network(MLP),输入的序列有很多个词,每个词为position,每个MLP对每个词做一次,每个词是同样的MLP。
在这里插入图片描述
红色先做一个线性层,然后绿色做relu,再蓝色做一个线性层。
注意力层是输入的长为512,x为512维的向量,W1会把512变成2048,最后有残差连接,又得投影回去,所以W2把2048投影回512。所以说实际上就是一个单隐藏层的MLP,中间隐藏层扩大为2048,最后输出的时候有缩小为输入的大小。

Transformer和RNN的区别:
Transformer

  • 整个Transformer是如何抽取序列信息,然后把这些信息加工成我们最后要的语义空间的向量的过程
  • attention起的作用:就是把整个序列的信息抓取出来,做一次汇聚,所以第一个输出已经有了我们感兴趣的东西抓取出来了,以至于做投影、MLP的时候(映射成更想要的语义空间的时候),因为每个输出已经含有我们想要的序列信息,所以每个MLP只需要在对每个点position(词)独立做就行了。
    在这里插入图片描述

RNN

  • 第一个点做简单的线性层(没有隐藏层的MLP),对于下一个点,怎么利用序列信息的呢?
  • 第二个点还是用MLP,和之前的权重是一样的。但是时序信息为上一个时刻的输出(绿色)和当前的信息(蓝色)并起来一起作为输入。
    在这里插入图片描述

可以看出RNN和Transformer是一样的,都是利用线性层或者MLP,来做语义空间的转换。关注点都是如何有效的使用序列的信息。但是不一样的是如何传递序列的信息。
RNN是将上一个时刻的信息输出传入下一个时刻的输入。
Transformer里面是通过一个attention层,在全局拿到序列的信息。

3.4 Embeddings and Softmax
Embedding:输入的是一个个的词,或者叫做token,我们需要把它们映射成一个向量。
embedding就是说,给定任何一个词,学习一个长度为d=512的向量来表示它.
编码器和解码器的输入都需要一个embedding,在softmax前面的线性也需要一个embedding,三个是一样的权重。训练起来会简单一点。
为什么权重乘以 512 \sqrt{512} 512
因为在学embedding的时候,多多少少会把每个向量的L2 Norm(欧几里德距离)学的比较小。例如学成1,不管维度多大,最后的值都会等于1。就是说,维度一大,学到的权重就会变小。
但是之后还需要加上 positional encoding,加上positional encoding的时候不会随着长度变长把Norm固定住,所以权重乘以 512 \sqrt{512} 512 使得Enbedding之后的结果和Position Encoding相加的时候在一个scale上大家差不多。

3.5 Position Encoding
attention是没有时序信息的,输出是value的加权和,权重是query和key 的相似度。跟序列信息是无关的。也就是不会在意query,key-value对的元素在序列的哪个地方,意味着给一句话,将顺序打乱之后,attention出来的结果是一样的,attention不会处理这样的情况。
做法:在输入里面加入一个时序信息。也就是一个词在位置为i,将 i 位置(1,2,3,4,5)加入到输入里面。
在这里插入图片描述
一个词,在嵌入层会表示成为512的向量,同样我们用一个长为512的向量来表示位置(0,1,2,3…),具体的值是怎么算出来的:使用周期不一样的sin和cos的值来算出来的。也就是说,任何一个词,能用一个长为512的记录时序信息向量来表示它。然后将这个长为512的记录了时序信息的向量和嵌入层相加就会完成将时序信息加进数据的做法。
在这里插入图片描述
因为是cos、sin函数,在+1、-1之间抖动的,所以 Embedding里面乘以一个 d \sqrt{d} d ,d=512。使得每个数字也是在差不多+1、-1区间里面。然后加上Position Encoding,完成输入里面加入了时序信息。
输入的序列不管怎么打乱顺序,进去之后输出因为输出的值是不变的,最多是顺序发生了变换,所以它就把顺序信息直接在里面那个值给加进去了。

4. Why Self-Attention
在这里插入图片描述
比较了4种不一样的层

  • 自注意力(self-attention)
  • 循环层(recurrent)
  • 卷积层(convolution)
  • 以及构造的一个受限的自注意力(self-attention(restricted))。

有三个比较

  • Complexity per Layer:计算复杂度(越低越好)。
  • Sequential Operations:顺序的计算(越少越好),顺序的计算就是说你下一步计算必须要等前面多少步计算完成。
  • Maximum Path Length:一个点的信息跳到到另外一个点要走多远(越短越好)

其中自注意力:

  • n是序列的长度,d是向量的长度。矩阵相乘(query(n行,d列),key也是一样(n,d),所以计算复杂度Complexity per Layer就是O(n²×d)。
  • 矩阵乘法可以认为并行度比较高,所以sequential operation(顺序操作)是为O(1)的。
  • Maximum Path Length最大长度是说从一个点的信息项跳到到另外一个点要走多少步,在attention里面一个query会跟所有的key做运算,输出是所有的value的加权和,也就是说,所有的计算,我们只需要一步就能解决,所以为O(1)。

循环层

  • 如果序列长度为n的话,一个一个做运算,每个里面主要的计算就是n×n的dense layer,然后乘以长度为d的一个输入。所以是一个d²,然后做n次,Complexity per Layer所以就是 O(n×d²) 。
  • 循环一步一步做运算,当前时间刻的值需要之前的时间刻,所以并行上有点吃亏,sequential operation为O(n)
  • 最初点的历史信息到最后那个点需要走n步才能计算。所以Maximum Path Length为O(n)

卷积

  • 卷积在序列上怎么做,用1d的卷积。所以kernel是k,n是长度,d是输入输出的通道数。Complexity per Layer所以就是 O(k×n×d² ),k一般不大,也就是说卷积的复杂度和RNN差不多。
  • 卷积的好处就是一个卷积操作就完成了,sequential operation为O(1),并行度很高,比RNN快一点。
  • 卷积每一次的一个点是由一个长k为的点来看的,如果信息在k距离以内就能传递,那么做一次就够了。如果超过k,要多层卷积,为一个log操作,Maximum Path Length为O( l o g k ( n ) log_{k}(n) logk(n)).

受限的自注意力

  • 当做注意力的时候,query只和最近的r个邻居去做运算,这样就不用算n²的东西,Complexity per Layer为O(r×n×d)。但是比较远的点,需要走几步才能过来,Maximum Path Length为O(n/r)。

但是实际上,用attention主要是关心特别长的序列,真的能够把整个信息融合的好一点,所以实际上受限的自注意力基本不会用。所以只考虑自注意力、 循环层、 卷积层。当序列长度,模型宽度,深度差不多的时候,基本上3个模型的算法复杂度差不多。attention和卷积相对来说,计算会好一点。attention在信息和融合度会好一点。
看上去是说用了self-attention之后数据处理更好,计算也不会慢。但是实际上并不是这样,实际上attention对模型的假设做的更少,导致需要更多的数据和更多的模型才能训练处理和RNN和CNN同样的效果。导致现在基于transform的模型特别大。

5. Training
5.1 数据集
英文翻德语 WMT 2014,450w句子对,用了byte-pair encoding(BPE)提取词根,处理一个词的多种变化,例如-ing -ed、最终生成37000 tokens,然后英语、德语共享字典 也就是encoder 和 decoder 用一个东西、使得模型更简单、Embedding 共享权重。

5.2 Hardware and Schedule
使用8 P100 GPUs ,base模型使用一个小一点的超参数,每一个batch训练的时间是0.4秒 ,训练了10万步,一共在8块gpu上面训练12个小时。然后一个大的模型,每一个batch训练的时间是1秒,训练了30万步,训练3.5天。

5.3 Optimizer
在这里插入图片描述

  • 学习率是用公式算出来的,有意思的是学习率是根据模型的宽度的-0.5次方,也就是模型越宽的时候,学的向量越长的时候,学习率要低一点。同时使用了warmup, 从一个小的值慢慢爬到一个高的值,然后根据步数 ^ 0.5衰减,warmup-steps=4000

5.4 Regularization

  • Residual Dropout
    在每一个子层:多头注意力和之后的 MLP,在每一层的输出上,在进入残差连接之前和进入 LayerNorm 之前,使用 dropout,P_drop = 0.1 ,也就是10% 的元素置为 0,剩下的值 × 1.1 。
    另外在输入,加上embeddiing加上position encodings,也用了dropout,P_drop = 0.1。
    也就是说,在带权重的层,输出都使用了 dropout。

  • Label Smoothing
    这个技术Inception V3中被大家广泛知道 ,意思是:我们用softmax去学一个东西的时候,标签正确是1,错误是0,对于正确label是softmax的值去逼近1,但是softmax很难趋近为1(因为是指数)。需要输出值接近无限大的时候,才能逼近1。因此,我们可以把1往下降,例如降成0.9。
    但是这篇文章,下降的比较大,降成了0.1,也就是说,对于正确的词,只需要softmax的输出为 0.1 即可,剩下的值是 0.9 / 字典大小 。损失 perplexity(log(loss)做指数,模型的不确信度)。因为正确的答案只需要给到 10 %。
    模型不那么精确,可以提高 精确度accuracy 和 BLEU score ,由于我们关注的是精确度accuracy和BLEU score,所以作者觉得没关系。

6. Results
在这里插入图片描述
不同超参数的对比:

  • N :堆多少层
  • dmodel 模型的宽度:是 一个 token 进来之后表示成多长的向量
  • dff : MLP 中间隐藏层输出的大小
  • h :注意力层 head 的个数
  • dk, dv :分别是 key 和 value 的维度
  • Pdrop :dropout 的概率
  • Els :label smoothing 要学的正确的 label 值为多少

base model:用了6个层,每个层宽度512,dff为dmodel的4倍,dmodel = h * dk ,dropout率为0.1,label smoothing 要学的正确的 label 值为0.1,训练10w步。

big model:用了6个层,模型宽度 * 2, dff * 2, h * 2 ,dk 和 dv 不用变维度 ,模型更复杂所以用了比较大的丢弃率 Pdrop = 0.3,而且模型更加复杂了,收敛会更加慢一点,因为学习率变低了,训练了30w步。

模型可调的参数:

  • 多少层 N,
  • 模型多宽dmodel,
  • 模型的 head数 h,
  • 剩下的参数按比例计算

总结:
Transformer几乎能用在所有nlp任务上,能训练很大的预训练模型,能够极大的提升所有nlp任务的性能。
像 CNN 对 整个计算机视觉的改变,训练一个大的CNN模型,使得别的任务也能够收益。CNN给整个计算机视觉研究人员提供了一个框架,也就是只要学会CNN就行了。而不需要管以前跟任务相关的专业知识,例如特征提取,怎么特征建模。Transformer也是一样。
Transformer不仅仅应用在NLP,在 图片、语音、Video上也有很好的应用。同样一个模型,能在所有的领域都能用。
人对世界的感知是多模态的,看图片,读文字。现在Transformer能把所有不同的数据融合起来,如果大家都用同一个架构抽取特征的话,那么可以抽取到同一个语义空间。使得我们可以在文本、语音、视频等训练更好更大的模型。
最新结果表明,其实不是只要attention就行了,attention只是将整个序列信息聚合起来。但是后面的MLP和残差连接是不可或缺的。去掉MLP和残差连接,模型基本是学不到什么东西的。
Attention根本不会对数据的顺序建模,为什么可以打赢RNN呢?RNN能显式的建模序列信息,理论上应该比Attention效果更好。因为Attention用了一个更广泛的偏纳归置,使得Attention能够处理更一般化的信息。这也是为什么Attention并没有做空间上的假设,也能取得比CNN更好的结果。但是代价是:假设更加一般,对数据抓取信息能力变差了,以至于需要使用更多的数据,更大的模型才能训练出想要的效果,这也是为什么Transformer模型越来越大的原因。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值