咱们还是照图讨论,transformer结构图如下,本文主要讨论Encoder部分,从低端输入inputs开始,逐个结构进行:
在NLP领域,个人理解,这个inputs就是我们的句子分词之后的词语,比如:我的句子是“我喜欢中国”,那么inputs为“我“,”喜欢“,”中国”,然后Input Embedding就是对这些词语的向量化(词向量),之后加上这些词对应的位置信息(比如“喜欢”在“我喜欢中国”中位置为2),两者结合作为Multi-Head Attention(多头注意力机制)的输入。
多头注意力机制,可以简单的理解为:对这个操作重复了n次,得到n个结果
.....
,之后对这n个结果求平均,得到一个更稳健的输出。
重复n次实际上就是进行n次单独的self-attention,由于每次的、
、
都不同,所以每次self-attention的输出Z也不同,高级的意义:通过重复n次操作,将输入映射到不同的子空间,以便于提取更多的特征信息,从而提高准确性。
大白话:与从不同方位观察物体一样,从前面、侧面、后面看物体,肯定能获取关于这个物体更多的信息对吧,提取更多特征,从而有更深的理解,通俗易懂,Multi-Head Attention的基本思想和这差不多。
如图所示,在self-attention中求出 Z(i) ()后直接将Z放入全连接层中,而transformer又经过了add&Norm步骤 ,这个add是什么呢???
其实add就是在Z的基础上加了一个残差块X,加入残差块X的目的是为了防止在深度神经网络训练中发生退化问题,退化的意思就是深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大。这个Add具体操作如下:其实就是将self-attention的output+input作为新的output,如下图:
就是指对新的output做标准化,也就是上图的,对a+b做标准化
先说一下FeedForward是什么?其实FeedForward是由全连接层(FC)与激活ReLu组成的结构,其实和bp神经网络结构差不多,输入:Add&Norm的输出(记作:Z'(i) ), FC:全连接层
接下来再说一下为什么要用FeedForward呢?不用单纯的FC呢?
其实主要还是想提取更深层次的特征,在Multi-Head Attention中,主要是进行矩阵乘法,即都是线性变换,而线性变换的学习能力不如非线性变换的学习能力强,我们希望通过引入ReLu激活函数,使模型增加非线性成分,强化学习能力。