Transformer学习笔记


前言

  最近在学习Transformer相关的内容,借助这个笔记整理一下这段时间搜集到的相关资料以及个人理解。


一、模型产生背景

    这段时间主要学习了Transformer模型在NLP方向上的应用,具体应用场景为机器语言翻译。主要学习了Transformer产生的背景,模型的整体架构以及模型内部的一些技术细节。我对于Transformer的学习主要围绕Google翻译团队的Attention is All You Need这篇论文,论文中未涉及的一些技术细节参考了大量的论文解读与相关知识点的博客,现将对模型的理解写在下面。 

    Transformer的提出主要是为了解决RNN结构不能并行训练的问题,Transformer同样延用了Encoder-Decoder的结构但是是完全通过Attention机制来实现的,同时寻找一个句子中任意两个部分的相关度也不会因为两部分的时间间隔过长而增加算法的时间复杂度。这里Transformer的优点很好理解,对于任意两个部分的词嵌入,寻找二者的相关性只需要将查询向量Q与键向量K做相关运算即可得到一个相关分数,所以将寻找相关性的算法复杂度降为O(1)。而self-attention机制也具备传统Encoder-Decoder的一些特点,例如传统Encoder-Decoder在编码阶段为了寻找一个词嵌入和他前后文的相关性,通常采用双向循环网络结构,而Self-attention也具有同样的特点。当然对于Transformer来说,在训练过程不仅是Encoder可以并行计算,在Decoder部分,Transformer也同样可以支持并行计算得到输出,具体的细节会在后面的模型解读上体现。 

二、模型架构

1.整体架构

  模型的整体架构如下: 

在这里插入图片描述
    这里是模型的一个缩略版本,左边部分是一个Encoder block,右边部分是一个Decoder block,实际上作者在原文采用左右各六个编码解码块,但实际上具体参数可以根据实际任务来调整。 

2.编码器

    先来介绍一下编码块,一个编码块由一个Multi-head self-attention层和一个全连接层组成。Self-attention其实与最开始提出的应用在Seq2Seq上的Attention机制非常类似,自注意力机制甚至要更为简略一点,它的查询向量Q,键向量K以及值向量V都是同一个句子的一个部分,即(K = Q = V)。当然实际上求Self-attention还需要对原始的词嵌入进行一个线性变换,得到原始K,Q,V的一个子空间。这里注意一下输入部分,可以看到原模型的输入不仅是词嵌入,而是词嵌入与一个位置编码的和,这里位置编码的具体原理目前还不是很清楚,不过其作用是为每一个词嵌入提供其位置信息。 
在这里插入图片描述

    这里的子空间我是根据降维的想法去理解的,映射出来的一组新的K’,Q’,V’包含了原始K,Q,V的部分或全部信息,再利用这个新的K’,Q’,V’来进行Self-attention的计算。下面是Self-attention实际计算的过程: 
在这里插入图片描述

而说到这多头自注意力机制就相对好理解了,简单来说就是将原始K,Q,V进行多组变换(线性降维)求得多组低维嵌入,在对每一组低维嵌入做Self-attention的计算得到多组注意力向量。具体表现如下: 
在这里插入图片描述
这里计算自注意力向量的有一个小trick,即原文采用了如下公式: 
在这里插入图片描述
    其具体原因主要是为了防止维数过高而引起神经网络反向梯度更新出现梯度消失的问题,从而使得网络更新减慢,性能下降。更具体的原因可以参考如下解释:
https://blog.csdn.net/qq_37430422/article/details/105042303 

    当每个位置的多组自注意力向量都计算完成时,接下来在每个位置分别将这些自注意力向量拼接起来,再通过一个全连接神经网络,这样的话便在每一个位置都得到了一个该位置上的特征表达。这时注意看原模型的还有一个Add & Norm层,实际上这是在Multi-head self-attention层上添加了一个残差连接,并通过一个标准化层。具体的残差连接的作用简单概括是为了让模型经过前向传播后,学习到一些复杂的特征后具有能够恢复原始输入数据的能力,以防止模型随着层数加深而性能下降的问题。具体细节可以参考这篇残差神经网络的文章Deep Residual Learning for Image Recognition。 

    当通过Multi-head self-attention层以后,事情就变得稍微简单了一点。因为在前一步骤我们得到了每一个位置上的特征表达,现在我们将每一个位置上得到的向量都通过一个两层的全连接神经网络,同时对于每一个位置上的向量,其通过的全连接神经网络参数都是相同的,也就是参数共享的。 

3.解码器

    而编码块介绍完成后,通常解码部分的大致工作流程就可以理解了。因为具体解码的过程与前面的编码块非常相似,而且基本上大致工作原理可以在其他的博客上找到,因此在这不过多叙述。但是,这里我说一下我在解码器学习过程中遇到的几个问题。首先就是解码器的输入是什么。这大概是困扰我比较久的一个问题,因为常规来说我们会根据上一时间步的输出来作为下一时刻的输入来完成解码的过程,那么解码器是怎么并行的呢?这里要注意区分一下,实际在训练一个Transformer的过程中,Decoder是可以并行计算的,而在实际测试或验证过程中是不能并行计算的,而训练过程为了体现出解码的“公平性”,引入了Masked Multi-head self-attention机制。注意这仍然是一个Self- attention层只不过屏蔽掉了一些向量之间的相关分数。在Transformer实际训练过程中,实际上采用了Teacher force的技巧,也就是说对于每次解码器的输入并不是来源于上一个时间点编码器的输出,而是来自Ground truth中的取值。也就是说其实不管每一次解码器输出什么,每一个时间步的输入都是确定的目标序列该位置上的值。这样的话其实我们在训练一开始就知道每一个时间步的输入是什么,可想而知为什么Transformer可以支持并行训练。Masked attention的具体实现在这不过多叙述,其实简要概括就是将当前时间步的输入与未来时间步的输入进行计算得到的相关分数进行屏蔽,也就是说当前时间步的输入并不知道未来要翻译出的句子是什么,这样得到的一个自相关矩阵实际上是一个下三角矩阵。 

    接下来的步骤与编码器十分类似,不过也要注意一下新引入的第二个注意力层,它并不是Self-attention层,它的查询向量Q来自上一层的输出,而K和V来自编码器最后一个编码块的输出,对于每一个Decoder都是如此: 
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值