6. 文本分类——transformer模型
文章目录一、简介二、transformer结构三、用于文本分类的transformer1. embedding layer(嵌入层)2. positional encoding(位置编码)3. Scaled dot-product attention(缩放的点乘注意力机制)4. Multi-head attention(多头注意力)5. Padding mask6. 残差连接7. Layer No
文章目录
文章:Attention is all you need
文章链接:https://arxiv.org/abs/1706.03762
一、简介
Transformer 是谷歌在 17 年做机器翻译任务的 “Attention is all you need” 的论文中提出的,引起了相当大的反响。 每一位从事 NLP 研发的同仁都应该透彻搞明白Transformer,它的重要性毫无疑问,尤其是你在看完我这篇文章之后,我相信你的紧迫感会更迫切,我就是这么一位善于制造焦虑的能手。不过这里没打算重点介绍它,想要入门 Transformer 的可以参考以下三篇文章:一个是 Jay Alammar 可视化地介绍 Transformer 的博客文章 The Illustrated Transformer ,非常容易理解整个机制,建议先从这篇看起, 这是中文翻译版本;第二篇是 Calvo 的博客:Dissecting BERT Part 1: The Encoder ,尽管说是解析 Bert,但是因为 Bert 的 Encoder 就是 Transformer,所以其实它是在解析 Transformer,里面举的例子很好;再然后可以进阶一下,参考哈佛大学 NLP 研究组写的 “The Annotated Transformer. ”,代码原理双管齐下,讲得也很清楚。
对于Transformer来说,需要明确加入位置编码学习position Embedding。因为对于self Attention来说,它让当前输入单词和句子中任意单词进行相似计算,然后归一化计算出句子中各个单词对应的权重,再利用权重与各个单词对应的变换后V值相乘累加,得出集中后的embedding向量,此间是损失掉了位置信息的。因此,为了引入位置信息编码,Transformer对每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding。
Transformer中的self Attention对文本的长距离依赖特征的提取有很强的能力,因为它让当前输入单词和句子中任意单词进行相似计算,它是直接进行的长距离依赖特征的获取的,不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征。此外,对应模型训练时的并行计算能力,Transformer也有先天的优势,它不像RNN需要依赖前一刻的特征量。
张俊林大佬在https://blog.csdn.net/malefactor/article/details/86500387中提到过,在Transformer中的Block中不仅仅multi-head attention在发生作用,而是几乎所有构件都在共同发挥作用,是一个小小的系统工程。例如Skip connection,LayerNorm等也是发挥了作用的。对于Transformer来说,Multi-head attention的head数量严重影响NLP任务中Long-range特征捕获能力:结论是head越多越有利于捕获long-range特征。
二、transformer结构
详见我的博客总结《Attention is all you need》
三、用于文本分类的transformer
Transformer结构有两种:Encoder和Decoder,在文本分类中只使用到了Encoder,Decoder是生成式模型,主要用于自然语言生成的。
1. embedding layer(嵌入层)
获得词的分布式表示
2. positional encoding(位置编码)
由于attention没有包含序列信息(即语句顺序并不影响结构),因此需要加入位置的信息,在transformer中选择将顺序的信息加入到embedding中。
设某个词在句子中的位置为pos,词的embeding维度为 d m o d e l d_{model} dmodel,我们需要产生一个关于pos的维度为 d m o d e l d_{model} dmodel的向量。因此可以使用公式: P E ( p o s , i ) = p o s 10000 2 i / d m o d e l P{E_{(pos,i)}} = \frac{{pos}}{{{{10000}^{2i/{d_{\bmod el}}}}}} PE(pos,i)=100002i/dmodelpos, 来计算pos对应的位置向量的各个维度的值。
以 p o s = 1 pos=1 pos=1来举例, [ 1 1000 0 0 , 1 1000 0 2 / d m o d e l , 1 1000 0 4 / d m o d e l , . . . , 1 1000 0 2 ] [\frac{1}{10000^0},\frac{1}{10000^{2/d_{model}}} ,\frac{1}{10000^{4/d_{model}}},...,\frac{1}{10000^{2}} ] [1000001,100002/dmodel1,100004/dmodel1,...,1000021];但是这种方式的编码并没有考虑到相对位置,因此在论文中使用了三角函数对奇偶维进行变化,下面是论文中的位置编码公式:
P E ( p o s , 2 i ) = sin ( p o s 10000 2 i / d m o d e l ) P E ( p o s , 2 i + 1 ) = cos ( p o s 10000 2 i / d m o d e l ) \begin{array}{l} P{E_{(pos,2i)}} = \sin (\frac{{pos}}{{{{10000}^{2i/{d_{\bmod el}}}}}})\\\\ P{E_{(pos,2i + 1)}} = \cos (\frac{{pos}}{{{{10000}^{2i/{d_{\bmod el}}}}}}) \end{array} PE(pos,2i)=sin(100002i/dmodelpos)PE(pos,2i+1)=cos(100002i/dmodelpos)
3. Scaled dot-product attention(缩放的点乘注意力机制)
在attention中query、key、value的来源各不相同,但是在该attention中query、key、value均是从同一个输入中产生。如下图中query、key、value均是将输入的embedding乘以一个矩阵产生的:
(可以观测到 q , k , v q,k,v q,k,v的维度是由权重矩阵的维度决定的,因此维度的大小由设计者决定)
有了 q , k , v q,k,v q,k,v后,我们先通过点积计算 k k k与 q q q的相似度,并且为了防止相似度放入 s o f t m a x softmax softmax中太大,因此将点积结果除以 d k \sqrt{d_k} dk,其中 d k d_k dk是 k k k的维度。在将结果放入到 s o f t m a x softmax softmax中输出当前 q q q与各个 k k k的相似度,如下图:

有了 q q q与各个 k k k的相似度以后,使用这些相似度对 v v v进行加权求和,得到当前 q u e r y query query的输出:

上面介绍了Scaled dot-product attention的向量计算方式,但是在实际中为了加速计算需要使用矩阵的计算方式。下面介绍矩阵计算:
首先对于所有的输出计算对应的 q 、 k 、 v q、k、v q、k、v,如下图:
(这样可以一次计算出所有输入的 q 、 k 、 v q、k、v q、k、v,并记输出的矩阵为 Q 、 K 、 V Q、K、V Q、K、V)
计算相似度并加权求和
论文中的计算公式:

4. Multi-head attention(多头注意力)
在论文中他们发现将 Q 、 K 、 V Q、K、V Q、K、V在 d q , d k , d v d_q,d_k,d_v dq,dk,dv, (即每个 q 、 k 、 v q、k、v q、k、v的维度)维度上切成 h h h份,然后分别进行scaled dot-product attention,并将最终的结果合并在一起,其中超参数 h h h就是 h e a d head head的数量。
论文中的公式:
5. Padding mask
因为文本的长度不同,所以我们会在处理时对其进行padding。但是在进行attention机制时,注意力不应该放在padding的部分。因此将这些位置设置为非常大的负数,这样经过softmax后的概率接近0。
对于矩阵 Q K T QK^T QKT的第 i i i行第 j j j列的元素表示的是第 i i i个 q u e r y query query与第 j j j个 k e y key key的相似度,为了进行padding mask,那么必须要将所有与padding key的相似度设为负无穷。因此生成一个形状与 Q K T QK^T QKT相同的padding 矩阵,其中所有padding key对应的列设为false,其余为true。
6. 残差连接

假设网络中某个层对输入 x x x作用后的输出是 F ( x ) F(x) F(x),那么增加残差连接后为 F ( x ) + x F(x)+x F(x)+x。当对该层求偏导时,
7. Layer Normalization
Batch Normalization:设某个batch中的样本均值为 μ B \mu_B μB,样本方差为 σ B 2 \sigma^2_B σB2,那么BN的公式就是 B N ( x i ) = α × x i − μ B σ B 2 + ϵ + β BN(x_i)=\alpha\times\frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\epsilon}}+\beta BN(xi)=α×σB2+ϵxi−μB+β。其主要是沿着batch方向进行的。
Layer Normalization:BN是在batch上计算均值和方差,而LN则是对每个样本计算均值和方差; L N ( x i ) = α × x i − μ L σ L 2 + ϵ + β LN(x_i)=\alpha\times\frac{x_i-\mu_L}{\sqrt{\sigma^2_L+\epsilon}}+\beta LN(xi)=α×σL2+ϵxi−μL+β。可以方向公式中只是均值和方差不同而已。
8.Position-wise Feed-Forward network
这是一个全连接层,包含两个线性变换和一个非线性激活函数ReLU,公式为 F F N ( x ) = m a x ( 0 , x W 1 + b 1 ) W 2 + b 2 FFN(x)=max(0,xW_{1}+b_1)W_{2}+b_2 FFN(x)=max(0,xW1+b1)W2+b2。这个公式还可以用两个大小为 1 1 1的一维卷积来实现,其中中间层的维度为 2048 2048 2048。
四、代码实现
详情参考:https://www.cnblogs.com/jiangxinyang/p/10210813.html
五、参考
更多推荐



所有评论(0)