零基础入门NLP-新闻文本分类【Task6】
- Task6 基于深度学习的文本分类3
- Transformer原理
- Encoder
- Positional Encodings
- Self-attention
- Residuals
- Decoder
Task6 基于深度学习的文本分类3
Transformer原理
Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作,由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出。
Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。
Transformer 是由编码组件、解码组件和它们之间的连接组成。编码组件部分由一堆编码器(encoder)构成。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。
Encoder
我们重点关注编码部分。他们结构完全相同,但是并不共享参数,每一个编码器都可以拆解成两部分。
- self-attention层,该层帮助编码器在它编码单词的时候能够看到输入序列中的其他单词。
- self-attention的输出再流向一个前向网络(Feed Forward Neural Network),每个输入位置对应的前向网络是独立互不干扰的。最后将输出传入下一个编码器。
这里能看到Transformer的一个关键特性,每个位置的词仅仅流过它自己的编码器路径。在self-attention层中,这些路径两两之间是相互依赖的。前向网络层则没有这些依赖性,但这些路径在流经前向网络时可以并行执行。
Positional Encodings
Positional Encoding 是一种考虑输入序列中单词顺序的方法。为了使模型保持单词的语序,模型中添加了位置编码向量。
例如,input embedding 的维度为4,那么实际的positional encodings如下所示:
下图是20个单词的 positional encoding,每行对应一个向量的位置编码。因此,第一行将是我们要添加到输入序列中第一个单词的嵌入的向量。每行包含512个值—每个值都在1到-1之间。因为左侧是用sine函数生成,右侧是用cosine生成,所以可以观察到中间显著的分隔。
Self-attention
例如,下列句子是我们想要翻译的输入句子:
The animal didn’t cross the street because it was too tired
这个“it”在这个句子是指什么呢?它指的是street还是这个animal呢?这对于人类来说是一个简单的问题,但是对于算法则不是。
当模型处理这个单词“it”的时候,Self-Attention会允许“it”与“animal”建立联系。随着模型处理输入序列的每个单词,Self-Attention会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。
Self-Attention中使用多头机制,使得不同的attention heads所关注的的部分不同。编码"it"时,一个attention head集中于"the animal",另一个head集中于“tired”,某种意义上讲,模型对“it”的表达合成了的“animal”和“tired”两者。
Residuals
编码器结构中值得提出注意的一个细节是,在每个子层中(Self-attention, FFNN),都有残差连接,并且紧跟着layer-normalization。如果我们可视化向量和LayerNorm操作,将如下所示:
Decoder
编码器通过处理输入序列开启工作。顶端编码器的输出之后会变转化为一个包含向量K(键向量)和V(值向量)的注意力向量集 。这些向量将被每个解码器用于自身的“编码-解码注意力层”,而这些层可以帮助解码器关注输入序列哪些位置合适。
在完成编码阶段后,则开始解码阶段。解码阶段的每个步骤都会输出一个输出序列的元素。
接下来的步骤重复了这个过程,直到到达一个特殊的终止符号,它表示transformer的解码器已经完成了它的输出。每个步骤的输出在下一个时间步被提供给底端解码器,并且就像编码器之前做的那样,这些解码器会输出它们的解码结果 。
而那些解码器中的自注意力层表现的模式与编码器不同:在解码器中,自注意力层只被允许处理输出序列中更靠前的那些位置。在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。
这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键/值矩阵。
解码组件最后会输出一个实数向量。我们如何把浮点数变成一个单词?这便是线性变换层要做的工作,它之后就是Softmax层。
线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。例如我们有 10,000 个无重复的单词,那么最后输出的向量就有一万维。每个位置上的值代表了相应单词的分数。
接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出。