Task6 基于深度学习的文本分类3
6.1 学习目标
1.了解Transformer的原理和基于预训练语言模型(Bert)的词表示。
2.学会Bert的使用,具体包括pretrain和finetune。
6.2 文本表示方法Part4
6.2.1 Transformer原理
Transformer是在“Attention is All You Need”中提出的,模型的编码部分是一组编码器的堆叠(论文中依次堆叠六个编码器),模型的解码部分是由相同数量的解码器的堆叠。
编码部分的结构完全相同,但是并不共享参数,每一个编码器都可以拆解为两部分。在对输入序列做词的向量化后,它们首先经过一个self-attention层,该层计算每个单词与其他所有单词之间的关联,帮助编码器在编码单词时能够看到序列中的其他单词。在例子“I arrived at the bank after crossing the river”中,当翻译bank一词时,river一词就有较高的Attention score。利用这些Attention score就可以得到一个加权的表示,然后再放到一个前馈神经网络中得到新的表示,这一表示很好的考虑到上下文的信息。
self-attention的输出流向一个前向网络(Feed Forward Neural Network),每个输入位置对应的前向网络独立互不干扰。最后将输出传入下一个编码器。
上图体现出Transformer的一个关键特性:每个位置的词仅仅经过它自己的编码器路径。在self-attention层中,这些路径两两之间相互依赖。前向网络则没有这些依赖性,但这些路径在经过前向网络时可以并行执行。
self-attention中使用多头机制,使得不同的attention所关注的部分不同。其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征。
在编码“it”时,一个attention head集中于“the animal”,另一个head集中于“tired”,可以说,模型对“it”的表达合成了“animal”和“tired”两者。
此外,为了使模型保持单词的语序,模型中添加了位置编码向量。如下所示,每行对应一个向量的位置编码。所以,第一行就是我们要添加到输入序列中第一个单词的嵌入向量。每行包含512个值,每个值范围在[1,-1]之间。左侧使用sine函数生成,右侧使用cosine生成,可以看到中间显著的分隔。
编码器的每个子层中(self-attention,FFNN),都有残差连接,并且紧跟着 layer-normalization.。可视化向量和LayerNorm操作后可以看到:
6.2.2 基于预训练语言模型的词表示
传统静态词向量无法建模“一词多义”的语言,基于预训练语言模型的词表示可以通过建模上下文信息解决该问题。
最早提出的ELMo基于两个单向LSTM,将从左到右和从右到左两个方向的隐藏层向量表示拼接学习上下文词嵌入。而GPT用Transformer代替LSTM作为编码器,首先进行了语言模型预训练,然后在下游任务微调模型参数。但GPT仅使用了单向语言模型,因此难以建模上下文信息。
为了解决以上问题,研究者们提出BERT,它是一个基于Transformer的多层Encoder,通过执行一系列预训练,进而得到深层的上下文表示。BERT的模型结构:
ELMo论文题目中的Deep是指双层LSTM,更关键的地方在于context。传统方法生成的单词映射表的形式,是先为每个单词生成一个静态向量,之后该单词的表示就被固定住了,不会跟着上下文的变化而改变。事实上,由于一词多义的语言现象,静态向量是有很大弊端的。以bank为例,如果训练语料足够大,事先学好的词向量中混杂着所有的语义。而当下游应用时,即使在新句子中,bank的上下文里包含money等词,我们基本可以确定bank是“银行”的语义,而不是在其他上下文中的“河床”的语义。但是由于静态词向量不能跟随上下文而进行变化,所以bank的表示还是混杂着很多种语义。为了解决这一问题,ELMo首先进行了语言模型预训练,然后在下游任务中动态调整Word Embedding,因此最后输出的词表示能够充分表达单词在上下文中的特定语义,进而解决一词多义的问题。
GPT来自于openai,是一种生成式预训练模型。GPT除了将ELMo中的LSTM替换为Transformer的Encoder外,更开创了基于预训练——微调的新范式。尽管GPT采用的也是和ELMo相同的两阶段模式,但GPT在第一个阶段并没有采取ELMo中使用两个单向双层LSTM拼接的结构。
Google在NAACL 2018发表的论文中提出了BERT,与GPT一样,BERT也采用了预训练——微调这一阶段模式。在模型结构方面,BERT采用了ELMo的范式,即使用双向语言模型代替GPT中的单向语言模型,但BERT的作者认为ELMo使用两个单向语言模型拼接的方式太粗暴,因此在第一阶段的预训练中,BERT提出掩码语言模型,即类似完形填空的方式,通过上下文来预测单词本身,而不是从左到右或从右到左建模,这就允许了模型能够自由地编码每个层中来自两个方向的信息。为了学习句子的词序关系,BERT将Transformer中的三角函数位置表示替换为可学习的参数;其次为了区别单句和双句输入,BERT还引入了句子类型表征。此外,为了充分学习句子间的关系,BERT提出了下一个句子预测任务。具体来说,在训练时,句子对中的第二个句子有50%来自原有的连续句子,而其余50%的句子通过在其他句子中随机采样获得。同时,消融实验也证明,这一预训练任务对