6. 文本分类——transformer模型


文章: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} ,我们需要产生一个关于pos的维度为 d m o d e l d_{model} 的向量。因此可以使用公式: 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}}}}}} , 来计算pos对应的位置向量的各个维度的值。

p o s = 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}} ] ;但是这种方式的编码并没有考虑到相对位置,因此在论文中使用了三角函数对奇偶维进行变化,下面是论文中的位置编码公式:

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}

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 后,我们先通过点积计算 k k q q 的相似度,并且为了防止相似度放入 s o f t m a x softmax 中太大,因此将点积结果除以 d k \sqrt{d_k} ,其中 d k d_k k k 的维度。在将结果放入到 s o f t m a x softmax 中输出当前 q q 与各个 k k 的相似度,如下图:

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

在这里插入图片描述
上面介绍了Scaled dot-product attention的向量计算方式,但是在实际中为了加速计算需要使用矩阵的计算方式。下面介绍矩阵计算:
首先对于所有的输出计算对应的 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 d q , d k , d v d_q,d_k,d_v , (即每个 q k v q、k、v 的维度)维度上切成 h h 份,然后分别进行scaled dot-product attention,并将最终的结果合并在一起,其中超参数 h h 就是 h e a d head 的数量。
论文中的公式:
在这里插入图片描述

5. Padding mask

因为文本的长度不同,所以我们会在处理时对其进行padding。但是在进行attention机制时,注意力不应该放在padding的部分。因此将这些位置设置为非常大的负数,这样经过softmax后的概率接近0

对于矩阵 Q K T QK^T 的第 i i 行第 j j 列的元素表示的是第 i i q u e r y query 与第 j j k e y key 的相似度,为了进行padding mask,那么必须要将所有与padding key的相似度设为负无穷。因此生成一个形状与 Q K T QK^T 相同的padding 矩阵,其中所有padding key对应的列设为false,其余为true。
在这里插入图片描述

6. 残差连接

在这里插入图片描述
假设网络中某个层对输入 x x 作用后的输出是 F ( x ) F(x) ,那么增加残差连接后为 F ( x ) + x F(x)+x 。当对该层求偏导时,

7. Layer Normalization

Batch Normalization:设某个batch中的样本均值为 μ B \mu_B ,样本方差为 σ B 2 \sigma^2_B ,那么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 。其主要是沿着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 。可以方向公式中只是均值和方差不同而已。

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 。这个公式还可以用两个大小为 1 1 的一维卷积来实现,其中中间层的维度为 2048 2048

四、代码实现

详情参考:https://www.cnblogs.com/jiangxinyang/p/10210813.html

五、参考

  1. https://blog.csdn.net/bqw18744018044/article/details/89501595
  2. https://www.cnblogs.com/jiangxinyang/p/10210813.html
发布了21 篇原创文章 · 获赞 3 · 访问量 615

猜你喜欢

转载自blog.csdn.net/qq_38293297/article/details/105027845