为什么我还是无法理解tranormer?
作者:卡卷网发布时间:2025-01-10 19:20浏览数量:72次评论数量:0次
前言
Tranormer由论文《AttentionisAllYouNeed》提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHu获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。
在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。
AttentionisAllYouNeed:AttentionIsAllYouNeed
1.Tranormer整体结构
首先介绍Tranormer的整体结构,下图是Tranormer用于中英文翻译的整体结构:
可以看到<>Tranormer由Encoder和Decoder两个部分组成>,Encoder和Decoder都包含6个lock。Tranormer的工作流程大体如下:
<>第一步:>获取输入句子的每一个单词的表示向量<>X>,<>X>由单词的Emedding(Emedding就是从原始数据提取出来的Feate)和单词位置的Emedding相加得到。
<>第二步:>将得到的单词表示向量矩阵(如上图所示,每一行是一个单词的表示<>x>)传入Encoder中,经过6个Encoderlock后可以得到句子所有单词的编码信息矩阵<>C>,如下图。单词向量矩阵用
<>第三步>:将Encoder输出的编码信息矩阵<>C>传递到Decoder中,Decoder依次会根据当前翻译过的单词1~i翻译下一个单词i+1,如下图所示。在使用的过程中,翻译到单词i+1的时候需要通过<>Mask(掩盖)>作遮盖住i+1之后的单词。
上图Decoder接收了Encoder的编码矩阵<>C>,然后首先输入一个翻译开始符"<egin>",预测第一个单词"I";然后输入翻译开始符"<egin>"和单词"I",预测单词"he",以此类推。这是Tranormer使用时候的大致流程,接下来是里面各个部分的细节。
2.Tranormer的输入
Tranormer中单词的输入表示<>x>由<>单词Emedding>和<>位置Emedding>(PositionalEncoding)相加得到。
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有以下的好处:
将单词的词Emedding和位置Emedding相加,就可以得到单词的表示向量<>x>,<>x>就是Tranormer的输入。
3.Self-Attention(自注意力机制)
上图是论文中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的结构,在计算的时候需要用到矩阵<>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的每一行都表示一个单词。>
3.3Self-Attention的输出
得到矩阵Q,K,V之后就可以计算出Self-Attention的输出了,计算的公式如下:
公式中计算矩阵<>Q>和<>K>每一行向量的内积,为了防止内积过大,因此除以
得到
得到Softmax矩阵之后可以和<>V>相乘,得到最终的输出<>Z>。
上图中Softmax矩阵的第1行表示单词1与所有单词的attention系数,最终单词1的输出
3.4Multi-HeadAttention
在上一步,我们已经知道怎么通过Self-Attention计算得到输出矩阵Z,而Multi-HeadAttention是由多个Self-Attention组合形成的,下图是论文中Multi-HeadAttention的结构图。
从上图可以看到Multi-HeadAttention包含多个Self-Attention层,首先将输入<>X>分别传递到h个不同的Self-Attention中,计算得到h个输出矩阵<>Z>。下图是h=8时候的情况,此时会得到8个输出矩阵<>Z>。
得到8个输出矩阵
可以看到Multi-HeadAttention输出的矩阵<>Z>与其输入的矩阵<>X>的维度是一样的。
4.Encoder结构
上图红色部分是Tranormer的Encoderlock结构,可以看到是由Multi-HeadAttention,<>Add&Norm,FeedForward,Add&Norm>组成的。刚刚已经了解了Multi-HeadAttention的计算过程,现在了解一下Add&Norm和FeedForward部分。
4.1Add&Norm
Add&Norm层由Add和Norm两部分组成,其计算公式如下:
其中<>X>表示Multi-HeadAttention或者FeedForward的输入,MultiHeadAttention(<>X>)和FeedForward(<>X>)表示输出(输出与输入<>X>维度是一样的,所以可以相加)。
<>Add>指<>X>+MultiHeadAttention(<>X>),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在ResNet中经常用到:
<>Norm>指LayerNormalization,通常用于RNN结构,LayerNormalization会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
4.2FeedForward
FeedForward层较简单,是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数,对应的公式如下。
<>X>是输入,FeedForward最终得到的输出矩阵的维度与<>X>一致。
4.3组成Encoder
通过上面描述的Multi-HeadAttention,FeedForward,Add&Norm就可以构造出一个Encoderlock,Encoderlock接收输入矩阵
第一个Encoderlock的输入为句子单词的表示向量矩阵,后续Encoderlock的输入是前一个Encoderlock的输出,最后一个Encoderlock输出的矩阵就是<>编码信息矩阵C>,这一矩阵后续会用到Decoder中。
5.Decoder结构
上图红色部分为Tranormer的Decoderlock结构,与Encoderlock相似,但是存在一些区别:
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可以在训练的过程中使用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的信息,即只能使用之前的信息。
<>第二步:>接下来的作和之前的Self-Attention一样,通过输入矩阵<>X>计算得到<>Q,K,V>矩阵。然后计算<>Q>和
<>第三步:>在得到
得到<>Mask>
<>第四步:>使用<>Mask>
<>第五步:>通过上述步骤就可以得到一个MaskSelf-Attention的输出矩阵
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的信息,如下:
Softmax根据输出矩阵的每一行预测下一个单词:
这就是Decoderlock的定义,与Encoder一样,Decoder是由多个Decoderlock组合而成。
6.Tranormer总结
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:为什么感觉杭州科技一下子“爆发”了?
- 下一篇:PHP8.0有大佬用到生产上了吗?
相关推荐

你 发表评论:
欢迎