卡卷网
当前位置:卡卷网 / 每日看点 / 正文

为什么我还是无法理解tranormer?

作者:卡卷网发布时间:2025-01-10 19:20浏览数量:72次评论数量:0次

建议大家看一下李宏毅老师讲解的Tranormer,非常简单易懂(个人觉得史上最强tranormer讲解):s:///watch?v=ugWDIIOHtPA&list=PLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index=60

前言

Tranormer由论文《AttentionisAllYouNeed》提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHu获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。

在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。

AttentionisAllYouNeed:AttentionIsAllYouNeed

1.Tranormer整体结构

首先介绍Tranormer的整体结构,下图是Tranormer用于中英文翻译的整体结构:

Tranormer的整体结构,左图Encoder和右图Decoder

可以看到<>Tranormer由Encoder和Decoder两个部分组成,Encoder和Decoder都包含6个lock。Tranormer的工作流程大体如下:

<>第一步:获取输入句子的每一个单词的表示向量<>X,<>X由单词的Emedding(Emedding就是从原始数据提取出来的Feate)和单词位置的Emedding相加得到。

Tranormer的输入表示

<>第二步:将得到的单词表示向量矩阵(如上图所示,每一行是一个单词的表示<>x)传入Encoder中,经过6个Encoderlock后可以得到句子所有单词的编码信息矩阵<>C,如下图。单词向量矩阵用表示,n是句子中单词个数,d是表示向量的维度(论文中d=512)。每一个Encoderlock输出的矩阵维度与输入完全一致。

TranormerEncoder编码句子信息

<>第三步:将Encoder输出的编码信息矩阵<>C传递到Decoder中,Decoder依次会根据当前翻译过的单词1~i翻译下一个单词i+1,如下图所示。在使用的过程中,翻译到单词i+1的时候需要通过<>Mask(掩盖)作遮盖住i+1之后的单词。

TransofrmerDecoder预测

上图Decoder接收了Encoder的编码矩阵<>C,然后首先输入一个翻译开始符"<egin>",预测第一个单词"I";然后输入翻译开始符"<egin>"和单词"I",预测单词"he",以此类推。这是Tranormer使用时候的大致流程,接下来是里面各个部分的细节。

2.Tranormer的输入

Tranormer中单词的输入表示<>x由<>单词Emedding和<>位置Emedding(PositionalEncoding)相加得到。

Tranormer的输入表示

2.1单词Emedding

单词的Emedding有很多种方式可以获取,例如可以采用Word2Vec、Glove等算法预训练得到,也可以在Tranormer中训练得到。

2.2位置Emedding

Tranormer中除了单词的Emedding,还需要使用位置Emedding表示单词出现在句子中的位置。<>因为Tranormer不采用RNN的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于NLP来说非常重要。所以Tranormer中使用位置Emedding保存单词在序列中的相对或绝对位置。

位置Emedding用<>PE表示,<>PE的维度与单词Emedding是一样的。PE可以通过训练得到,也可以使用某种公式计算得到。在Tranormer中采用了后者,计算公式如下:

其中,pos表示单词在句子中的位置,d表示PE的维度(与词Emedding一样),2i表示偶数的维度,2i+1表示奇数维度(即2i≤d,2i+1≤d)。使用这种公式计算PE有以下的好处:

    使PE能够适应训练集里面所有句子更长的句子,假设训练集里面最长的句子是有20个单词,突然来了一个长度为21的句子,则使用公式计算的方法可以计算出第21位的Emedding。可以让模型容易地计算出相对位置,对于固定长度的间距k,<>PE(pos+k)可以用<>PE(pos)计算得到。因为Sin(A+)=Sin(A)Cos()+Cos(A)Sin(),Cos(A+)=Cos(A)Cos()-Sin(A)Sin()。

将单词的词Emedding和位置Emedding相加,就可以得到单词的表示向量<>x,<>x就是Tranormer的输入。

3.Self-Attention(自注意力机制)

TranormerEncoder和Decoder

上图是论文中Tranormer的内部结构图,左侧为Encoderlock,右侧为Decoderlock。红色圈中的部分为<>Multi-HeadAttention,是由多个<>Self-Attention组成的,可以看到Encoderlock包含一个Multi-HeadAttention,而Decoderlock包含两个Multi-HeadAttention(其中有一个用到Masked)。Multi-HeadAttention上方还包括一个Add&Norm层,Add表示残差连接(ResidualConnection)用于防止网络退化,Norm表示LayerNormalization,用于对每一层的激活值进行归一化。

因为<>Self-Attention是Tranormer的重点,所以我们重点关注Multi-HeadAttention以及Self-Attention,首先详细了解一下Self-Attention的内部逻辑。

3.1Self-Attention结构

Self-Attention结构

上图是Self-Attention的结构,在计算的时候需要用到矩阵<>Q(查询),K(键值),V(值)。在实际中,Self-Attention接收的是输入(单词的表示向量x组成的矩阵X)或者上一个Encoderlock的输出。而<>Q,K,V正是通过Self-Attention的输入进行线性变换得到的。

3.2Q,K,V的计算

Self-Attention的输入用矩阵X进行表示,则可以使用线性变阵矩阵<>WQ,WK,WV计算得到<>Q,K,V。计算如下图所示,<>注意X,Q,K,V的每一行都表示一个单词。

Q,K,V的计算

3.3Self-Attention的输出

得到矩阵Q,K,V之后就可以计算出Self-Attention的输出了,计算的公式如下:

Self-Attention的输出

公式中计算矩阵<>Q和<>K每一行向量的内积,为了防止内积过大,因此除以的平方根。<>Q乘以<>K的转置后,得到的矩阵行列数都为n,n为句子单词数,这个矩阵可以表示单词之间的attention强度。下图为<>Q乘以,1234表示的是句子中的单词。

Q乘以K的转置的计算

得到之后,使用Softmax计算每一个单词对于单词的attention系数,公式中的Softmax是对矩阵的每一行进行Softmax,即每一行的和都变为1.

对矩阵的每一行进行Softmax

得到Softmax矩阵之后可以和<>V相乘,得到最终的输出<>Z。

Self-Attention输出

上图中Softmax矩阵的第1行表示单词1与所有单词的attention系数,最终单词1的输出等于所有单词i的值根据attention系数的例加在一起得到,如下图所示:

Zi的计算方法

3.4Multi-HeadAttention

在上一步,我们已经知道怎么通过Self-Attention计算得到输出矩阵Z,而Multi-HeadAttention是由多个Self-Attention组合形成的,下图是论文中Multi-HeadAttention的结构图。

Multi-HeadAttention

从上图可以看到Multi-HeadAttention包含多个Self-Attention层,首先将输入<>X分别传递到h个不同的Self-Attention中,计算得到h个输出矩阵<>Z。下图是h=8时候的情况,此时会得到8个输出矩阵<>Z。

多个Self-Attention

得到8个输出矩阵之后,Multi-HeadAttention将它们拼接在一起<>(Concat),然后传入一个<>Linear层,得到Multi-HeadAttention最终的输出<>Z。

Multi-HeadAttention的输出

可以看到Multi-HeadAttention输出的矩阵<>Z与其输入的矩阵<>X的维度是一样的。

4.Encoder结构

TranormerEncoderlock

上图红色部分是Tranormer的Encoderlock结构,可以看到是由Multi-HeadAttention,<>Add&Norm,FeedForward,Add&Norm组成的。刚刚已经了解了Multi-HeadAttention的计算过程,现在了解一下Add&Norm和FeedForward部分。

4.1Add&Norm

Add&Norm层由Add和Norm两部分组成,其计算公式如下:

Add&amp;amp;amp;Norm公式

其中<>X表示Multi-HeadAttention或者FeedForward的输入,MultiHeadAttention(<>X)和FeedForward(<>X)表示输出(输出与输入<>X维度是一样的,所以可以相加)。

<>Add指<>X+MultiHeadAttention(<>X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在ResNet中经常用到:

残差连接

<>Norm指LayerNormalization,通常用于RNN结构,LayerNormalization会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

4.2FeedForward

FeedForward层较简单,是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数,对应的公式如下。

FeedForward

<>X是输入,FeedForward最终得到的输出矩阵的维度与<>X一致。

4.3组成Encoder

通过上面描述的Multi-HeadAttention,FeedForward,Add&Norm就可以构造出一个Encoderlock,Encoderlock接收输入矩阵,并输出一个矩阵。通过多个Encoderlock叠加就可以组成Encoder。

第一个Encoderlock的输入为句子单词的表示向量矩阵,后续Encoderlock的输入是前一个Encoderlock的输出,最后一个Encoderlock输出的矩阵就是<>编码信息矩阵C,这一矩阵后续会用到Decoder中。

Encoder编码句子信息

5.Decoder结构

TranormerDecoderlock

上图红色部分为Tranormer的Decoderlock结构,与Encoderlock相似,但是存在一些区别:

    包含两个Multi-HeadAttention层。第一个Multi-HeadAttention层采用了Masked作。第二个Multi-HeadAttention层的<>K,V矩阵使用Encoder的<>编码信息矩阵C进行计算,而<>Q使用上一个Decoderlock的输出计算。最后有一个Softmax层计算下一个翻译单词的概率。

5.1第一个Multi-HeadAttention

Decoderlock的第一个Multi-HeadAttention采用了Masked作,因为在翻译的过程中是顺序翻译的,即翻译完第i个单词,才可以翻译第i+1个单词。通过Masked作可以防止第i个单词知道i+1个单词之后的信息。下面以"我有一只猫"翻译成"Iheacat"为例,了解一下Masked作。

下面的描述中使用了类似TeacherForcing的概念,不熟悉TeacherForcing的童鞋可以参考以下上一篇文章Seq2Seq模型详解。在Decoder的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入"<egin>"预测出第一个单词为"I",然后根据输入"<egin>I"预测下一个单词"he"。

Decoder预测

Decoder可以在训练的过程中使用TeacherForcing并且并行化训练,即将正确的单词序列(<egin>Iheacat)和对应输出(Iheacat<end>)传递到Decoder。那么在预测第i个输出时,就要将第i+1之后的单词掩盖住,<>注意Mask作是在Self-Attention的Softmax之前使用的,下面用012345分别表示"<egin>Iheacat<end>"。

<>第一步:是Decoder的输入矩阵和<>Mask矩阵,输入矩阵包含"<egin>Iheacat"(0,1,2,3,4)五个单词的表示向量,<>Mask是一个5×5的矩阵。在<>Mask可以发现单词0只能使用单词0的信息,而单词1可以使用单词0,1的信息,即只能使用之前的信息。

输入矩阵与Mask矩阵

<>第二步:接下来的作和之前的Self-Attention一样,通过输入矩阵<>X计算得到<>Q,K,V矩阵。然后计算<>Q和的乘积

Q乘以K的转置

<>第三步:在得到之后需要进行Softmax,计算attentionscore,我们在Softmax之前需要使用<>Mask矩阵遮挡住每一个单词之后的信息,遮挡作如下:

Softmax之前Mask

得到<>Mask之后在<>Mask上进行Softmax,每一行的和都为1。但是单词0在单词1,2,3,4上的attentionscore都为0。

<>第四步:使用<>Mask与矩阵<>V相乘,得到输出<>Z,则单词1的输出向量是只包含单词1信息的。

Mask之后的输出

<>第五步:通过上述步骤就可以得到一个MaskSelf-Attention的输出矩阵,然后和Encoder类似,通过Multi-HeadAttention拼接多个输出然后计算得到第一个Multi-HeadAttention的输出<>Z,<>Z与输入<>X维度一样。

5.2第二个Multi-HeadAttention

Decoderlock第二个Multi-HeadAttention变化不大,主要的区别在于其中Self-Attention的<>K,V矩阵不是使用上一个Decoderlock的输出计算的,而是使用<>Encoder的编码信息矩阵C计算的。

根据Encoder的输出<>C计算得到<>K,V,根据上一个Decoderlock的输出<>Z计算<>Q(如果是第一个Decoderlock则使用输入矩阵<>X进行计算),后续的计算方法与之前描述的一致。

这样做的好处是在Decoder的时候,每一位单词都可以利用到Encoder所有单词的信息(这些信息无需<>Mask)。

5.3Softmax预测输出单词

Decoderlock最后的部分是利用Softmax预测下一个单词,在之前的网络层我们可以得到一个最终的输出Z,因为Mask的存在,使得单词0的输出Z0只包含单词0的信息,如下:

DecoderSoftmax之前的Z

Softmax根据输出矩阵的每一行预测下一个单词:

DecoderSoftmax预测

这就是Decoderlock的定义,与Encoder一样,Decoder是由多个Decoderlock组合而成。

6.Tranormer总结

    Tranormer与RNN不同,可以较好地并行训练。Tranormer本身是不能利用单词的顺序信息的,因此需要在输入中添加位置Emedding,否则Tranormer就是一个词袋模型了。Tranormer的重点是Self-Attention结构,其中用到的<>Q,K,V矩阵通过输出进行线性变换得到。Tranormer中Multi-HeadAttention中有多个Self-Attention,可以捕获单词之间多种维度上的相关系数attentionscore。

[1][2]

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码