Transformer机制(Attention Is All You Need)在自然语言处理NLP领域取得了席卷全领域的效果。
此前的时序网络模型有:(参考梗直哥丶、跟李沐学AI)
1.RNN
RNN输出:
可以用于多种与时间有关的智能任务,例如:
- 1 to N的任务:根据图片输出音乐;
- N to 1的任务:根据一年内的用户评价推测商品的质量;
- N to N的任务:根据一段话输出等长的诗歌或者更优美的润色过的文章;
- N to M的任务:根据一段汉语翻译一段英文,对文本进行概括。
RNN虽然记忆力较短,对当前时刻信息的预测仅仅基于上一时刻的预测结果和当前时刻输入得到,但在小数据量,低算力的情况下非常有效。
但是如果一个女生只有前一天的记忆,那么作为她的男朋友,如果隔了一天不见面,后天就成陌生人了,对于这位女生,我们认为她需要一个日记本对长期记忆进行记录,以便她记得自己的一生。
2.LSTM
LSTM就是为此而生的,
在RNN的隐藏层上进行改进,序列就是长期记忆链条:
RNN隐藏层单元短期记忆链条、当前时刻输入和长期记忆链条之间的关系是:
- 擦除长期记忆中的无用信息;
- 整理和两个信息源,并增加在中;
- 。
是遗忘操作,是写入操作:
3.Attention基本观点
Attention其实本质上与权重Weight一致,Transformer模型等模型就基于Attention机制。
如果前半段时序为将来的时序片段提供的信息只有一份,那么未来的每一个时刻,模型都将无视自己的独特情况,仅仅凭借做参考。例如Encoder-Decoder模型,是两个RNN的结合:
上述结构将各时刻的输入信息通过RNN编码为单一向量,作为后续时刻的输入,无法让后续的每个时刻根据自己的需求,从单一编码中选择性提取不同的参考信息。
映射到现实中,举个例子,如果年份的决策者遇到当下的一个情况,想要参考以往5000年的中国历史资料去解决,但是他们只能拿到一本融汇了整部史书和上一年中国发展情况,但是写史书的作者可能是以他在年份的视角描述他觉得对时局重要的信息,作为年份的决策者能够参考的史书和上一年中国发展情况就充满了局限,因为部分对这位决策者有用的历史信息都被那位史书作者一带而过,这会为决策者造成极大地误导。
Attention机制的做法如下:
每个时刻都以不同的编码作为输入,,为不同时刻的输入分配了不同程度的注意力因子。对于不同时刻的推断模型,注意力因子分布也因为时刻的情况而不一致。
训练过程中,将作为训练参数通过学习调整优化,通过这种机制可以让每个时刻的模型能够动态地看到全局信息,将注意力集中到该时刻更为重要的信息上。
4.Self-Attention
但是上述Attention结构并不适合并行加速计算,且引入Attention机制后,来源于RNN的顺序结构失去了其本身的意义,所以删除顺序结构,删除顺序结构的Attention即为Self-Attention。
5.Attention机制的优势
参数更少、速度更快、效果更好。
通过加权求和的简单原理,帮助模型理解上下文。
相较于RNN中的循环层,Attention没有顺序计算的限制,能够并行计算并且由于能够考虑整个时间序列所以避免了RNN中循环层不断传递导致古早信息严重丢失的缺陷。
相较于CNN中的卷积层,Attention无需多个卷积层堆叠就能够通过一层获得输入序列中相距很远的两个单元,即单元和单元之间的关系。但是CNN能够实现多通道输出从而得到多种不同的模式特征,但是Attention机制只能输出单通道特征,所以在后续的Transformer中提出了Multi-Headed Attention机制,从而实现多通道输出。
6.Transformer
Transformer最初提出的目的是为了进行机器翻译工作,此前该任务均使用具有Encoder-Decoder结构的RNN或CNN进行,引入注意力机制,就能使得模型的性能得到提升,而Transformer模型则完全依赖自注意力机制Self-Attention机制的架构去完成该任务,使用Transformer意味着更好地并行计算和更高的指标。后来由于其优越性能,Transformer被引入视频、图像等多种任务中,具体结构如图所示:
这个图乍一看非常难懂,所以我们可以根据论文的解释从宏观到微观去理解它:
6.1.Encoder-Decoder架构
宏观上Transformer使用的是Encoder-Decoder结构,Encoder的输入是一段时序信息,例如一句英文,每个单词会被编码为一个向量(类似于word2vec的嵌入层Input Embedding),一句话就转为多个向量的堆叠,即相当于多个时刻向量组成的序列;经过编码器Encoder的编码,将编码为模型可理解的向量序列;Decoder解码器根据该向量序列一个词一个词地找到每个英文单词对应的中文词汇组成输出序列,在这个解码过程中使用自回归auto-regression机制:当要生成时,之前的输出和均作为预测过程的输入。Decoder在训练时,解码器最底层输入是目标序列,因为考虑到有mask操作,是想要掩盖预测位置之后的词信息。训练完模型在预测时,底层输入就不再是目标序列了,而是当前时刻之前的所有时刻产生的输出。
模型架构中,Encoder和Decoder都是由个Block或称为Layer堆叠在一起的,N一般取值为6。
Encoder的一个Block包括两个Sub-Layer:
- 带有残差连接Add和LayerNorm的Multi-headed Attention;
- 带有残差连接Add和LayerNorm的前馈神经网络Feed Forward(position-wise)。
Decoder的一个Block包括三个Sub-Layer:
- 带有残差连接Add和LayerNorm的Masked Multi-headed Attention;
- 带有残差连接Add和LayerNorm的Multi-headed Attention(输入来自Encoder的Blocke输出和1.的输出);
- 带有残差连接Add和LayerNorm的前馈神经网络Feed Forward。
最后,Decoder的输出将经过一个线性层和Softmax得到标准神经网络的输出概率分布。
6.2.Add&LayerNorm注解
Add&LayerNorm:
为了保证Add残差连接简单方便,每一个子层sub-layer的输出维度
LayerNorm v.s. BatchNorm
例如,我们的输入是二维的那么两种操作如下图所示:
LayerNorm在时序任务中更常用,原因是时序任务中的数据集中样本在时序Sequence维度上长度不相等,如:"Hey Guys!" "We are bloody win!"两句英文时序上长度就不相等。如果长度参差不齐,使用BatchNorm则Batch与Batch之间均值方差差异极大,造成抖动,且对于预测阶段的未知语句,我们训练时对均值和方差的假设有可能不能够泛化到测试集上。如果使用LayerNorm,则每个样本的均值方差只受自己内容影响,那么预测阶段也可以直接算预测样本自己的均值和方差。
6.3.Mask实现自回归机制
通过Mask Multi-headed Attention机制中使用的Mask掩膜,将当前时刻及以后时刻的目标向量遮住,将解码器的可见范围局限在时刻以前的目标向量;而在测试阶段,通过自回归机制,让解码器根据以前做出的预测向量做判断。上述操作确保训练测试两种场景下解码器模型的任务一致性。
6.4.Scaled Dot-Product Attention
给定一个查询向量Query,输入一个序列样本被拆分成若干Key-Value Pair,其中Key和Value均为向量。 我们的目的是根据Query向量查询那些Value需要被着重整合到最终向量中,从而将最终向量上交。而这些Value的Attention配比则依托Query与Value们所对应的Key之间的compatibility function计算得到,简单的方法是通过矩阵间的Dot-Product计算余弦相似度作为Attention配比。上述一段话落实到公式实现上:
带有Mask操作的Attention计算流程如下图:
其中Mask会将Scale后的Query与Key的内积中,时刻及以后的值全部替换成大负数,从而让Softmax屏蔽为0。
6.5.Multi-Headed Attention
单个的注意力函数可能存在不够稳定,偶然性大等问题,且不具有多通道特征的提取功能,Multi-Headed能够解决这一问题。
- 将Query、Key和Value通过线性层映射到较低维度的向量(从单个Attention输出512维向量缩短到先映射为维向量);
- 通过Scaled Dot-Product Attention输出维向量;
- 重复1.2.两步次,得到的维向量共个,拼接为维向量。
这种改进能够在线性层引入可训练的参数,比Scaled Dot-Product Attention更灵活,为Transformer的Block提供多样化的计算方式,给模型次机会学习各种提取特征策略,得到的特征可以去匹配不同的模式。
通常。
6.6.Self-Attention和Attention
可以从上述两图中看到,编码器和解码器中的第一个sub-layer中,三个输入箭头都来自于同一个序列,这里表示输入Key、Value和Query三个向量,都是单词word2ve后的同一个向量,所以我们称这种Attention为自注意力机制Self-Attention。 这也意味着中的和相等。即输入输出形状相同。
当然,如果没有Multi-Headed,那么我们的Attention输出就是在某一种规则下一句话中单词A与其余单词之间的距离分布情况。但是如果由Multi-Headed,那我们就能得到种不同的距离度量规则,最后能构建出种不同的距离分布空间。
但是解码器的第二个Sub-Layer:
可以看到输入的Key和Value来源于编码器Encoder,Query来源于解码器的第一个SubLayer。 假设Encoder的输入Input序列长度为,而Decoder的输入Output序列长度为,那么Encoder输出的Key和Value的维度即为,而Decoder提供的Query维度为。即"Hello Word"这个的序列和"你好世界"这个的序列之间做相似度衡量,并根据相似度得到的Value加权和向量。这个过程就是编码器与解码器的唯一信息传递通道。
6.7.Multi-Headed Attention + position-wise Feed-Forward Networks
position-wise Feed-Forward Networks即对Multi-Head Attention输出的序列中的每个向量单独做前馈神经网络,从而实现整合后序列信息的语义空间转换。
其实Transformer就是将基于RNN的Encoder-Decoder中所有的循环层换成了Multi-Headed Attention。
循环层实际上就是通过一个共享MLP,将上一时刻的MLP输出向量与当前时刻输入向量作为这个共享MLP当前时刻的新输入,串联构成;使用Multi-Headed Attention代替则是将各个时刻的信息通过注意力机制整合成新的序列,通过一个共享的MLP映射到需要的语义空间。
6.8.Embedding + Position Encoding
Embedding就是将序列中的每个单词转换为长度为的向量,组成向量序列。
另外,对于一句话,词汇间的相对位置是十分重要的信息,但是可以从Attention机制中看到,模型会忽略位置关系,这其实对于翻译任务是不对的。所以我们通过为每个词汇向量设置一个长的位置编码向量,通过词汇向量+=位置编码向量的操作,将位置编码传递进Transformer中。