【文本表征】2018年自然语言理解最火的三种方法
众所皆知的分布式词向量方法CBOM, skip-gram, Glove等已经成为NLP任务的标配,但致命的缺点是无法区别同一个词在不同语境下的含义,如“bank"无论是银行还是河岸的意思,词向量都是同一个,让人脑壳疼。本文要介绍的是2018年很火的三个方法:Elmo, GPT, BERT。它们能够处理多义词、反应不同的语境,从而更好地理解自然语言,并且在下游NLP任务中有突出表现。
1 ELMO
来自论文:“Deep contextualized word representation(2018.3)”
机构:Allen Institute for Artificial Intelligence
概述:文章提出ELMO模型,在大量的语料上训练一个深层双向语言模型,输入为一个完整的句子,句子中的词向量的表征由该模型隐层的函数表示。
1.1 基础:双向语言模型
前向语言模型是用前面的词去预测下一个词:
句子中的词被映射到词向量之后,依次输入L层RNN,将该词在第L层输出的隐藏向量输入softmax去预测下一个词。
后向语言模型是用后面的词去预测前�一个词:
双向语言模型是结合了前向和后向LM,即同时最大化前向和后向的似然对数。和以前的研究(Peters,2017)不同的是,这里的双向语言模型中两个方向是共享参数的。
1.2 Elmo模型结构
Elmo是基于双向语言模型的。若有biLM中有L层隐层,则对于词t_k,共有2L+1个表征:
在下游任务中,ELMO会把所有表征给合并成一个表征。在简单的任务中,只选择最顶层的表征即可,但是一般情况下,会把所有层的表征加权求和:
其中,s是经过softmax-normalized的权重,r是对于下游任务来说获取的ELMO向量的规模。
注意,biML每层的表征的分布可能会不同,最好也可以做一下layer normalization/
1.3 预训练Elmo模型
训练双向语言模型,
1.参数如下:
层数L=2;units=4096, dimension=512;
2.两层之间创建一个residual connection
3.在一些场景下,若在特定领域的语料中fine-tunig模型,会降低模型的perlexity并且提高在下游任务中的表现。
1.4 Elmo模型在下游NLP任务中的运用
给定:一个预训练好的biLM, 一个下游的监督模型结构。
步骤:
1.首先冻结biLM中的权重,根据权重加权ELMO的各层向量
2.将ELMO出来的向量输入下游模型。
2 GPT
来自论文:“Improving Language Understanding by Generative Pre-Training(2018)”
机构:OpenAI
概述:文章提出GPT模型,在大量的语料上预训练一个transformer语言模型,再在下游监督任务中进行微调。
2.1 无监督预训练GPT模型
给定语料,使用标准的语言模型目标函数来最大化一下的似然函数:
注意,从公示中看这个是前向语言模型
在GPT中,使用多层的transformer decoder去构建语言模型,对输入的tokens应用multi-head self-attention,然后再进入position-wise feedforward layers来输出目标token的分布。
2.2 有监督fine-tuning GPT模型
根据目标函数预训练好模型之后,用一个下游的监督任务来进行fine-tuning.同时求将语言模型和有监督的任务的目标函数,能提高模型的泛化能力并加速收敛。目标函数如下:
L2是有监督任务的目标,L1是语言模型的目标,λ是权重。
3 BERT
来自论文:“BERT: Pre-training of Deep Bidirectional Transformers for Language Understandingn(2018.10)”
机构:Google AI Language
概述:文章提出BERT模型,在大量的语料上训练一个双向的transformer语言模型。
3.1 模型结构
模型结构参考transfomrer encoder端
文章总共做了那个两个模型:
其中Bert_base是参照着GPT的规模来做的,为了用于平等地比较
3.2 输入的表征
3.3 预训练任务
(1)masked LM
(2)next sentence prediction