当前位置:   article > 正文

Transformer Encoder你真的懂了吗?

transformer encoder


在这里插入图片描述

1. position enconding(位置编码)

由于transformer模型没有循环神经网络的迭代操作,所以我们必须提供每个字的位置信息给transformer,才能识别出语言中的顺序关系。

现在定义一个位置嵌入的概念,也就是position encoding,位置嵌入的维度为[max_sequence_length,embedding_dimension],嵌入的维度同词向量的维度。max_sequence_length属于超参数,指的是限定的最大单个句子长度。
注意:我们一般以字为单位训练transformer模型,也就是说我们不用分词了。首先我们要初始化字向量为[vocab_size,embedding_dimension],vocab_size为总共的字库数量,embedding_dimension为字向量的维度,也就是每个字的数学表达。
论文中使用sine和cosine函数的线性变换来提供给模型位置信息:
P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 2 i / d m o d e l ) \quad \quad \quad \quad \quad PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}}) \\ \quad \quad \quad \quad \quad PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}}) PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)

  • pos指的是句子中字的位置,取值范围是[0,max_sequence_length)。
  • i i i指的是词向量的维度,取值范围是[0,embedding_dimension)。
  • 上面的sin和cos一组公式,也就是对应着embedding_dimension维度的一组奇数和偶数的序号的维度。

2. self attention mechanism(自注意力机制)

在这里插入图片描述
在这里插入图片描述

attention mask

在这里插入图片描述
注意:在上面self attention的计算过程中,我们通常使用mini batch来计算,也就是一次计算多句话,也就是X的维度是[batch_size,sequence_length],sequence_length是句长,而一个mini batch是由多个不等长的句子组成,我们就需要按照这个mini batch中最大的句长对剩余的句子进行补齐长度,我们一般使用0进行填充,这个过程叫padding。
但这时在进行softmax的时候会产生问题:
s o f t m a x = e x i ∑ j = 1 K e z j softmax = \frac{e^{x_i}}{\sum_{j=1}^Ke^{z_j}} softmax=j=1Kezjexi e 0 e^0 e0是1,是有值的,这样的话softmax中被padding的部分就参与了运算,这就等于是让无效的部分参与了运算,会有很大的隐患,这时就需要一个mask让这些无效区域不参与运算,我们一般给无效区域加一个很大的负数的偏置,也就是:
z i l l e g a l = z i l l e g a l + b i a s i l l e g a l b i a s i l l e g a l → − ∞ e z i l l e g a l → 0 \quad \quad \quad \quad \quad z_{illegal} = z_{illegal}+bias_{illegal}\\ \quad \quad \quad \quad \quad\quad \quad bias_{illegal}→-∞\\ \quad \quad \quad \quad \quad\quad \quad \quad e^{z_{illegal}}→0 zillegal=zillegal+biasillegalbiasillegalezillegal0
经过上式的masking,我们使无效区域经过softmax计算之后还几乎为0,这样就避免了无效区域参与计算

3. layer normalization和残差连接

1)残差连接

我们在上一步得到了经过注意力矩阵加权之后的V,也就是Attention(Q,K,V),我们对它进行一下转置,使其和 X e m b e d d i n g X_{embedding} Xembedding的维度一致,也就是batch_size,sequence_length,embedding_dimension,然后把他们加起来做残差连接,直接进行元素相加,因为他们的维度一致:
X e m b e d d i n g + A t t e n t i o n ( Q , K , V ) \quad \quad \quad \quad \quad X_{embedding}+Attention(Q,K,V) Xembedding+Attention(Q,K,V)
在之后的运算里,每经过一个模块的运算,都要把运算之前的值和运算之后的值相加,从而得到残差连接,训练的时候可以使梯度直接走捷径反传到最初始层:
X + S u b L a y e r ( X ) \quad \quad \quad \quad \quad X+SubLayer(X) X+SubLayer(X)

2) Layer Normalization

Layer Normalization的作用是把神经网络中隐藏层归一化为标准正太分布,也就是独立同分布,以起到加快训练速度,加速收敛的作用:
μ i = 1 m ∑ i = 1 m x i j \quad \quad \quad \quad \quad \mu_i=\frac{1}{m}\sum_{i=1}^mx_{ij} μi=m1i=1mxij
上式中以矩阵的行(row)为单位求均值;
σ j 2 = 1 m ∑ i = 1 m ( x i j − μ i ) 2 \quad \quad \quad \quad \quad \sigma_j^2=\frac{1}{m}\sum_{i=1}^m(x_{ij}-\mu_i)^2 σj2=m1i=1m(xijμi)2
上式中以矩阵的行(row)为单位求方差;
L a y e r N o r m ( x ) = a ⊙ x i j − μ i σ i 2 + ϵ + β \quad \quad \quad \quad \quad LayerNorm(x)=a⊙\frac{x_{ij}-\mu_i}{\sqrt {\sigma_i^2}+\epsilon}+\beta LayerNorm(x)=aσi2 +ϵxijμi+β
然后用每一行的每一个元素减去这行的均值,再除以这行的标准差,从而得到归一化的数值, ϵ \epsilon ϵ是为了防止除以0;之后引入两个可训练参数 α , β \alpha,\beta α,β来弥补归一化的过程中损失掉的信息,注意⊙表示元素相乘而不是点积,我们一般初始化为 α \alpha α为全1,而 β \beta β为全0。

4. transformer encoder整体结构

经过上面3个步骤, 我们已经基本了解到了transformer编码器的主要构成部分,下面用公式把一个transformer block的计算过程整理一下:

1) 字向量与位置编码

X = E m b e d d i n g L o o k u p ( X ) + P o s i t i o n E n c o d i n g X ∈ R b a t c h _ s i z e ∗ s e q _ l e n ∗ e m b e d _ d i m \quad \quad \quad \quad \quad X=EmbeddingLookup(X)+PositionEncoding\\ \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad X∈R^{batch\_size*seq\_len*embed\_dim} X=EmbeddingLookup(X)+PositionEncodingXRbatch_sizeseq_lenembed_dim

2) 自注意力机制

Q = L i n e a r ( X ) = X W Q K = L i n e a r ( X ) = X W K V = L i n e a r ( X ) = X W V X a t t e n t i o n = S e l f A t t e n t i o n ( Q , K , V ) \quad \quad \quad \quad \quad Q=Linear(X)=XW_Q\\ \quad \quad \quad \quad \quad K=Linear(X)=XW_K\\ \quad \quad \quad \quad \quad V=Linear(X)=XW_V\\ \quad \quad \quad \quad X_{attention}=SelfAttention(Q,K,V) Q=Linear(X)=XWQK=Linear(X)=XWKV=Linear(X)=XWVXattention=SelfAttention(Q,K,V)

3) 残差连接与Layer Normalization

X a t t e n t i o n = X + X a t t e n t i o n X a t t e n t i o n = L a y e r N o r m ( X a t t e n t i o n ) \quad \quad \quad \quad \quad X_{attention}=X+X_{attention}\\ \quad \quad \quad \quad X_{attention}=LayerNorm(X_attention) Xattention=X+XattentionXattention=LayerNorm(Xattention)

4) Feed Forward(其实就是两层线性映射并用激活函数激活,比如说ReLU)

x h i d d e n = A c t i v a t e ( L i n e a r ( L i n e a r ( X a t t e n t i o n ) ) ) \quad \quad \quad \quad \quad x_{hidden}=Activate(Linear(Linear(X_{attention}))) xhidden=Activate(Linear(Linear(Xattention)))

5) 重复3)

X h i d d e n = X a t t e n t i o n + X h i d d e n X h i d d e n = L a y e r N o r m ( X h i d d e n ) X h i d d e n ∈ R b a t c h _ s i z e ∗ s e q _ l e n ∗ e m b e d _ d i m \quad \quad \quad \quad \quad X_{hidden}=X_{attention}+X_{hidden}\\ \quad \quad \quad \quad \quad X_{hidden}=LayerNorm(X_{hidden})\\ \quad \quad \quad \quad X_{hidden}∈R^{batch\_size*seq\_len*embed\_dim} Xhidden=Xattention+XhiddenXhidden=LayerNorm(Xhidden)XhiddenRbatch_sizeseq_lenembed_dim

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/373705
推荐阅读
相关标签
  

闽ICP备14008679号