多语言机器翻译 | (6) Transformer

1. 背景

利用rnn,lstm学习上下文之间的关系,无法实现并行化,给模型的训练和推理带来了困难,因此提出了一种完全基于attention来对语言建模的模型,叫做transformer。transformer摆脱了nlp任务对于rnn,lstm的依赖,使用了self-attention的方式对上下文进行建模,提高了训练和推理的速度,transformer也是后续更强大的nlp预训练模型的基础。

2. 流程和细节

在这里插入图片描述
<1> Inputs是经过padding的输入数据(索引),大小是[batch size, max seq length]。
<2> 初始化embedding matrix,通过embedding lookup将Inputs映射成token embedding,大小是[batch size, max seq length, embedding size],然后乘以embedding size的开方。
乘以embedding size开方的原因是:猜测是因为embedding matrix的初始化方式是xavier init,这种方式的方差是1/embedding size,因此乘以embedding size的开方使得embedding matrix的方差是1,在这个scale下可能更有利于embedding matrix的收敛。

<3> 通过sin和cos函数创建positional encoding,表示一个token的绝对位置信息,并加入到token embedding中,然后dropout。(相对位置信息可以学到距离的远近,绝对位置信息是硬编码)
inputs/token embedding加入positional encoding原因:因为self-attention是位置无关的,无论句子的顺序是什么样的,通过self-attention计算的token的hidden embedding都是一样的,这显然不符合人类的思维。因此要有一个办法能够在模型中表达出一个token的位置信息,transformer使用了固定的positional encoding来表示token在句子中的绝对位置信息。

<4> multi-head attention
<4.1> 输入token embedding,分别通过三个Dense层生成Q,K,V,大小都是[batch size, max seq length, embedding size],然后按第2维(embedding_size维)split成num heads份并按第0维concat(多个注意力头并行计算),生成新的Q,K,V,大小是[num headsbatch size, max seq length, embedding size/num heads],完成multi-head的操作。
<4.2> 将K的第1维和第2维进行转置,然后Q和转置后的K的进行点积(QK^T),结果的大小是[num heads
batch size, max seq length, max seq length]。(包括每一个token查询向量和其他所有token的键向量的内积结果)
<4.3> 将<4.2>的结果除以hidden size的开方(在transformer中,hidden size=embedding size),完成scale的操作。
scale的原因:以数组为例,2个长度是len,均值是0,方差是1的数组点积会生成长度是len,均值是0,方差是len的数组。而方差变大会导致softmax的输入推向正无穷或负无穷,这时的梯度会无限趋近于0,不利于训练的收敛。因此除以len的开方,可以是数组的方差重新回归到1,有利于训练的收敛。
<4.4> 将<4.3>中padding部分token的点积结果置成一个很小的数(-2^32+1),完成mask操作,后续softmax对padding的结果就可以忽略不计了。
<4.5> 将经过mask的结果进行softmax操作。
<4.6> 将softmax的结果和V进行点积,得到attention的结果,大小是[num heads*batch size, max seq length, hidden size/num heads]。
<4.7> 将attention的结果按第0维split成num heads份并按第2维concat,生成multi-head attention的结果,大小是[batch size, max seq length, hidden size]。Figure 2上concat之后还有一个linear的操作,但是代码里并没有。
为什么attention需要multi-head,一个大head行不行?
multi-head相当于把一个大空间划分成多个互斥的小空间,然后在小空间内分别计算attention,虽然单个小空间的attention计算结果没有大空间计算得精确,但是多个小空间并行计算attention然后结果concat有助于网络捕捉到更丰富的信息,类比cnn网络中的channel。
<5> 将token embedding和multi-head attention的结果相加,并进行Layer Normalization(二者维度相同)。
multi-head attention的输入和输出相加的原因:类似于resnet中的残差学习单元(残差连接,shortcut,缓解梯度消失),有ensemble的思想在里面,解决网络退化问题。
<6> 将<5>的结果经过2层Dense(全连接层),其中第1层的activation=relu,第2层activation=None。(第一个全联接层会把输入维度放大,第二个全联接层再恢复原来的维度)
类比cnn网络中,cnn block和fc交替连接,效果更好。相比于单独的multi-head attention,在后面加一个ffn,可以提高整个block的非线性变换的能力。
<7> 功能和<5>一样。
<8> Outputs是经过padding的输出数据(索引),与Inputs不同的是,Outputs的需要在序列前面加上一个起始符号””,用来表示序列生成的开始,而Inputs不需要。(batch_size,max seq length)
<9> 功能和<2>一样。
<10> 功能和<3>一样。
<11> 功能和<4>类似,唯一不同的一点在于mask,<11>中的mask不仅将padding部分token的点积结果置成一个很小的数,而且将当前token(查询向量)与之后的token(键向量)的点积结果也置成一个很小的数。
为什么要mask当前时刻的token与后续token的点积结果?
自然语言生成(例如机器翻译,文本摘要)是auto-regressive的,在推理的时候只能依据之前的token生成当前时刻的token,正因为生成当前时刻的token的时候并不知道后续的token长什么样,所以为了保持训练和推理的一致性,训练的时候也不能利用后续的token来生成当前时刻的token。这种方式也符合人类在自然语言生成中的思维方式。
<12> 功能和<5>一样。
<13> 功能和<4>类似,唯一不同的一点在于Q,K,V的输入,<13>的Q的输入来自于Outputs 的token embedding,<13>的K,V来自于<7>的结果(分别经过两个Dense层)。
<14> 功能和<5>一样。
<15> 功能和<6>一样。
<16> 功能和<7>一样,结果的大小是[batch size, max seq length, hidden size]。
<17> 将<16>的结果的后2维和(decoder端的)embedding matrix的转置进行点积,生成的结果的大小是[batch size, max seq length, vocab size]。
<18> 将<17>的结果进行softmax操作,生成的结果就表示当前时刻预测的下一个token在vocab上的概率分布。
个token在vocab上的概率分布。
<19> 计算<18>得到的下一个token在vocab上的概率分布和真实的下一个token的one-hot形式的cross entropy,然后sum非padding的token的cross entropy当作loss,利用adam进行训练。

3. 总结

在小模型上self-attention并不比rnn,lstm好。直到大力出奇迹的bert出现,当模型变得越来越大,样本数越来越多的时候,self-attention无论是并行化带来的训练提速,还是在长距离上的建模,都是要比传统的rnn,lstm好很多。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer是一种基于自注意力机制(self-attention mechanism)的神经网络模型,被广泛应用于机器翻译任务。它由Google公司在2017年提出,并在机器翻译任务上取得了显著的成果。 传统的神经机器翻译模型(如循环神经网络)在处理长句子时存在信息衰减和顺序建模困难的问题。而Transformer通过引入自注意力机制,使得模型能够同时处理输入序列中的不同位置,从而更好地捕捉长距离依赖关系。 Transformer模型由编码器(encoder)和解码器(decoder)两部分组成。编码器负责将源语言句子编码为一个表示,解码器则利用该表示生成目标语言句子。 编码器和解码器都是由多层的自注意力层和前馈神经网络层(feed-forward neural network layer)组成。自注意力层用于计算输入序列中每个位置与其他位置之间的依赖关系,从而得到一个上下文相关的表示。前馈神经网络层则用于对每个位置的表示进行非线性变换。 在训练过程中,Transformer使用了注意力机制来对编码器和解码器的不同层之间进行信息传递。通过最大化目标语言句子的概率,模型可以学习到输入与输出之间的对应关系,从而实现机器翻译任务。 总的来说,Transformer模型通过引入自注意力机制,克服了传统神经机器翻译模型的一些问题,取得了较好的翻译效果。它也被广泛应用于其他自然语言处理任务中,如文本摘要、问答系统等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值