transformer

Transformer 是一类使用注意力机制(self-attention)加速运算的模型. 由 attention is all you need一文提出(google,NIPS,2017) 

transformer实现

1、基于encoder-decoder的架构。encoder和decoder均为6层结构。

encoder有两个子层(sublayer), multi-head attention 和 point wise fc.

decoder有三个子层,masked multi-head attention、multi-head attention(用来处理encoder输出) 和 point wise fc.

2、特点:

  • 仅使用attention结构,没有使用循环神经网络or卷积
  • 能够大幅缩短模型训练时间

3、结构

transformer子结构:

multi-head attention

1)scale dot-product attention

attention输入:query, key, value

计算方法:query和key计算weight,weight和value做matmul获取attention的输出;

 作者认为,当d_k较大时,会把点积结果推向softmax的梯度平缓区,影响了模型训练的稳定性。

 因此,在做softmax之前加一个尺度因子,网络为scaled dot production attention.

2)multi-head attention 

计算方法:

1.query, key, value经过线性投影,获取不同子空间的表示;

2.每个子空间的Q, K, V做attention

3.把attention的结果拼接(concat),然后做线性变换(linear)即可获取multi-head attention的结果

 

position wise feedforward network

计算方法:FFN ---> ReLu ---> FFN

1.position wise是因为处理的是第i个位置的attention输出,FFN分别作用在每个position

2.同一层内,FFN的网络参数是相同的。在不同层,FFN的参数不同。 

FFN(x) = max(0, xW1+b1)W2 + b2

3.attention输出维度d_model=512,经过position wise fc, W1的维度为d_model*d_ff,  W2的维度为d_ff*d_model,  d_ff={1024, 2048, 4096}

相当于:每个位置attention的结果映射到更大维度的特征空间,然后通过ReLu整流筛选,最后经过fc还原至原来的维度

Layer Normalization

 transformer中每一个子结构均使用了残差连接(res Add)和归一化(Layer Normalization ,2016),每个子层输出: LayerNorm(x + Sublayer(x)).

 

 layer norm好处:

① 分布平移后,让激活值落在 f() 梯度敏感的区间,梯度值大,增加训练速度

② 将数据"白化",消除极端值,提升训练稳定性

③ 梯度敏感区间内隐层输出接近线性,模型表达能力下降。 使用增益g_i和b_i增加模型表达能力。

④ Norm 通常放在非线性函数之前。transformer的非线性在self-attention的softmax和FFN的ReLu把LN设置在每个子层的输出,不是为了让激活值落在梯度敏感的区间,更重要的目的是为了"白化",让每个词的向量化数值更加均衡,以消除极端情况对模型的影响,获得更稳定的深层网络结构。在和之前的 TWWT 实验一样的配置中,删除了全部的 LN 层后模型不再收敛。LN 正如 LSTM 中的tanh,它为模型提供非线性以增强表达能力,同时将输出限制在一定范围内。 因此,对于 Transformer 来说,LN 的效果已经不是“有多好“的范畴了,而是“不能没有”。

batch norm 和 layer norm 区别

BN是在一个batch内,统计某个特定神经元节点的输出分布(跨样本);

LN是在一次迭代中,统计同一层所有神经元节点的输出分布(同一样本);

embedding and softmax

1.encoder和decoder的输入均接入embedding层,且embedding的参数相同

2.embedding层把encoder的input和decoder的input计算为高维特征空间的向量表示,d_model=512

3.对于decoder的输出,使用线性变换和softmax归一化,获取预测token的概率 

⭐️position encoding

1.加入position encoding是为了增加token在序列中的位置信息,维度和d_model相同,可直接相加。

(1)facebook 版本(postional embedding, Convolutional Sequence to Sequence Learning ):learned and fixed, 只能表征有限长度内的位置,无法对任意位置进行建模.

(2)google版本(encode) : 使用公式建模,无长度限制,具体公式如下:

self-attention

考虑3方面的因素:

1.每一层的计算复杂度

2.可以并行计算的总量,用sequential operations衡量。 需要的sequential operations越少,说明并行计算程度越高。

3.网络中的long range dependencies, 使用max path length衡量。max path length越小,说明长时依赖越小。

整体结构:

 

内部结构(6个encoder + 6个decoder):

encoder内部结构:

self-attention对单词进行编码时,会关注输入句子中的其他单词;

decoder内部结构:

self-attention在解码时,会关注输入句子的其他单词;

encoder-decoder attention在解码时,关注输入句子中相关的部分;

attention

自注意力机制

前处理符号过滤 >> 分词 >> embedding把词转为向量(发生在最底层的encoder) >> 向量流经self-attention和feed forward处理

self-attention (自注意力)

【def】找出一个句子中各单词之间的关系,为其赋予正确的注意力

【计算分为4步】

1.使用embedding vector计算获取query vector(查询向量), key vector(键向量), value vector(值向量)

2.计算出 当前单词查询向量(query vector)和其它单词键向量(key vector)相乘的得分,该得分表名对当前向量进行编码时,对其它单词应该实施多少关注。

 

3.把score除以8(使用的键向量的维度(64)的平方根,以得到更稳定的梯度),然后计算softmax。处理后的得分决定了每个单词在这个位置上被「表达」的程度。

 

4.将每个值向量(value vector)与softmax得分相乘。目的是把[关注]的单词值向量维持在较高水平,把无关单词的值向量维持在较低水平(通过将值向量与softmax得分 0.001 这样极小的数字相乘)。然后对加权后的值向量进行求和,获取当前编码位置的self-attention输出。

 

 

【参考】

https://www.jiqizhixin.com/articles/2019-04-07-3

https://towardsdatascience.com/transformers-141e32e69591

https://zhuanlan.zhihu.com/p/60821628

个人学习笔记,网络内容搬运工,喜欢的点个赞,如有侵权请联系删除。
原文地址:https://www.cnblogs.com/qing2105/p/14041320.html