本文是根据哔哩哔哩up主视频讲解所写,加入了一些个人理解。视频地址:Transformer从零详细解读
Transformer最初用于机器翻译,具体功能可以看成:
再进一步细分:Encoder-Decoder结构,多个Encoder和Decoder个数可以自行设置,每个Encoder和Decoder参数不同,但是是循环结构。
1.1 Embedding
单词到词向量的过程,可采用word2vec等操作,对句子进行处理,生成其对应的词向量表征。
1.2 位置编码
RNN在进行序列信息处理时共享的是一套参数,因为是循环使用同一个模块,因此在训练时,对于不同的输入也是对同一套参数进行更新。
RNN梯度消失的解释:RNN的梯度是梯度和,随着时间的推进,根据链式传播的法则,RNN的梯度被近时间距离的梯度主导,远时间距离梯度可以忽略不计。
而Transformer的Encoder中采用的是多头注意力机制,是直接对整个句子输入进行处理,没有保留句子中单词位置信息。位置编码方式如下:
位置编码规则:对于偶数位置采用sin,奇数位置采用cos。
然后将词向量Embedding同位置编码相加,形成最终输入表征向量。
PS:引入位置编码为何有意义?
根据sin和cos的运算规则,可以得出不同位置向量之间的相对位置关系。
注意力机制的核心在于Q、K、V的计算。除以dk是为了防止Q、K点乘过大时导致的梯度消失问题。且控制方差为1。
举个图文对应的例子:“婴儿在干嘛”这句话+右上角的图。
从例子中看,第一个Query是从输入向量中提取出来的的短时序列特征,而Key表示图片中局部命名特征和Value一一对应,Value表示从图片中提取的不同命名局部区域的特征。
Q、K的点乘运算可以体现不同特征之间的相似性,如例子中的“婴儿”和图片中那个区域联系更紧密,从而得到针对不同局部区域的权重信息。最后将结果同V相乘,得到加权和。
NLP的例子。
Query是输入短时特征,需要计算该特征同其他不同时序信息之间的关系,Key则代表着不同时序信息,Value是一一对应的时序信息内容所对应的向量表征。
在只有单词向量时,如何获取Q、K、V,并计算对应的Attention值。
3.1 残差
残差,反向传播链式法则易产生梯度消失的问题,而残差则通过相加和shortcut操作避免了梯度为0的情况出现,可以缓解梯度消失。
3.2 Layer Normalization(LN)
Batch Normalization(BN)在NLP中效果差,所以用LN。
BN是针对所有样本在同一维度的特征进行处理,可以解决内部协变量偏移,缓解梯度饱和(使用sigmoid作为激活函数时)加速收敛。
但是Batch_size较小时效果很差,均值方差只是在小范围内进行计算。
BN在NLP中的体现:“我”和“今”属于同一维度特征,“爱”和“天”属于同一维度特征,以此类推。这种类比没有意义。
Layer Norm则是针对每一个样本,在该样本范围内计算均值和方差来进行规范化。即“我”、“爱”、“中”、“国”、“共”、“产”、“党”范围内作规范化。
在Decoder中的第一个多头注意力处理过程中需要对当前和之后的单词作mask,隐藏未来时刻的信息,这样就符合预测时的情境。因为在预测时,只是输入之前信息来预测当前信息,不可能提前预知未来信息。