NLP学习-Task 4: Contextual Word Embeddings

NLP学习

更新流程↓
Task 1: 简介和词向量Word Vectors
Task 2: 词向量和词义Word Senses
Task 3: 子词模型Subword Models
Task 4: Contextual Word Embeddings
Task 5: 大作业
日本人综艺感从昭和时代开始就这么强了吗?
今日份的舒适
常见餐桌礼仪


Contextual Word Embeddings




1. ELMo

  Allen实验室认为好的词表征应该同时兼顾两个问题:一是单词在语义和语法上的复杂特点;二是随着语言环境的改变,这些用法也应该随之变化
  为此,Allen实验室提出了deep contextualized word representation(深度情景化词表征)。这种算法的特点是每个词的表征都是整个输入语句的函数。

具体做法:

  1. 现在大语料上以 language model为目标训练处 Bi-LSTM模型,利用它产生词语的表征 (pre-trained biLM模型)。ELMo因此得名embedding from language model。
  2. 为了应用在下游NLP任务中,一般先利用下游任务的语料库(此时,忽略掉label)进行 language model的微调(fine tuning),这种微调相当于一种domain transfer
  3. 然后才是利用label的信息进行supervised learning

  ELMo表征是“深”的,就是说它们是biLM的所有层的内部表征的函数。这样做的好处是能够产生丰富的词语表征。高层的LSTM的状态可以捕捉词语意义中和语境相关的那方面的特征(比如可以用来做语义的消歧),而低层的LSTM可以找到语法方面的特征(比如可以做词性标注)。如果把它们结合在一起,在下游的NLP任务中会体现优势。

在这里插入图片描述



 1.1. Bidirectional language models

  ELMo顾名思义是从Language Models得来的embeddings,确切的说是来自于Bidirectional language models。具体可以表示为:
p(t1,t2,...,tN)=k=1Np(tkt1,t2,...,tk1)p(t1,t2,...,tN)=k=1Np(tktk+1,tk+2,...,tN)p(t_1,t_2,...,t_N)=\prod_{k=1}^{N}p(t_k|t_1,t_2,...,t_{k-1})和p(t_1,t_2,...,t_N)=\prod_{k=1}^{N}p(t_k|t_{k+1},t_{k+2},...,t_N)

  这里(t1,t2,...,tN)(t_1,t_2,...,t_N)的是一系列的tokens,作为语言模型可能有不同的表达方法,最经典的方法是利用多层的LSTM,ELMo的语言模型也采取了这种方式。所以这个Bidirectional LM由stacked bidirectional LSTM来表示。

  假设输入是tokentoken的表示xkLMx_k^{LM}。在每一个位置kk,每一层LSTM上都输出相应的context-dependent的表征hk,jLM\vec{h}_{k,j}^{LM}j=1,2,...,Lj=1,2,...,Ljj代表LSTM的某层layer。例如顶层的LSTM的输出可以表示为:hk,jLM\vec{h}_{k,j}^{LM},通过Softmax层来预测下一个token tk+1t_{k+1}
  最开始两个概率的对数极大似然估计Loglikehood表达如下:
Loglikehood=k=1N(logp(tkt1,...,tk1;Θx,ΘLSTM,Θs)+logp(tktk+1,...,tN;Θx,ΘLSTM,Θs))Loglikehood=\sum_{k=1}^{N}(log\, p(t_k|t_1,...,t_{k-1};\Theta_x,\vec{\Theta}_{LSTM},\Theta_s)+log\,p(t_k|t_{k+1},...,t_N;\Theta_x,\overleftarrow{\Theta}_{LSTM},\Theta_s))
  这里的ΘxΘ_x代表token embedding, ΘsΘ_s代表softmax layer的参数。



 1.2. ELMo

  对于每一个token,一个LL层的biLM要计算出共2L+12L+1个表征:
Rk={xkLM,hk,jLM,hk,jLMj=1,...,Lhk,jLMj=0,...,LR_k=\left\{\begin{matrix} x_k^{LM},\vec{h}_{k,j}^{LM},\overleftarrow{h}_{k,j}^{LM}&j=1,...,L\\ \\ h_{k,j}^{LM}&j=0,...,L \end{matrix}\right.  这里hk,jLMh_{k,j}^{LM}是简写,当j=0j=0时,代表token层。j>0j>0时,同时包括两个方向的hiddenhidden表征。
  在下游的任务中, ELMo把所有层的R压缩在一起形成一个单独的vector。(在最简单的情况下,可以只保留最后一层的hk,jLMh_{k,j}^{LM}。) ELMoktask=E(Rk;Θtask)=γtaskj=0Lsjtaskhk,jLM      (1)ELMo_k^{task}=E(R_k;Θ^{task})=\gamma^{task}\sum_{j=0}^{L}s_j^{task}h_{k,j}^{LM}\; \; \; (1)

  具体来讲如何使用ElMo产生的表征呢?对于一个supervised NLP任务,可以分以下三步:

  1. 产生pre-trained biLM模型。模型由两层bi-LSTM组成,之间用residual connection连接起来。
  2. 在任务语料上(注意是语料,忽略label)fine tuning上一步得到的biLM模型。可以把这一步看为biLM的domain transfer。
  3. 利用ELMo的word embedding来对任务进行训练。通常的做法是把它们作为输入加到已有的模型中,一般能够明显的提高原模型的表现。



2.GPT

  GPT的核心思想是先通过无标签的文本去训练生成语言模型,再根据具体的NLP任务(如文本蕴涵、QA、文本分类等),来通过有标签的数据对模型进行fine-tuning
在这里插入图片描述

  具体来说,在这篇论文中提出了半监督的方法,即结合了无监督的预训练和有监督的fine-tuning。论文采用两阶段训练。首先,在未标记数据集上训练语言模型来学习神经网络模型的初始参数。随后,使用相应NLP任务中的有标签的数据地将这些参数微调,来适应当前任务。

  模型的结构是使用了多层的单向Transformer结构(《Attention is All you need》提出)。下图是GPT语言模型的结构:
在这里插入图片描述


 2.1. 无监督的预训练

  对于无标签的文本U={u1,u2,...,un}U=\{u_1,u_2,...,u_n\},最大化语言模型的极大似然函数:L1(u)=log  P(uiuik,...,ui1;Θ)L_1(u)=\sum log \;P(u_i|u_{i-k},...,u_{i-1};\Theta)  这里的kk是文本上下文窗口的大小。
  论文中使用的是多层Transformer的decoder的语言模型,input为词嵌入以及单词token的位置信息;再对transformer_block的输出向量做softmax,output为词的概念分布。具体公式如下:
h0=UWe+WpHl=transformer_block(hl1)i[i,n]P(u)=softmax(hnWeT)\begin{matrix}h_0=UW_e+W_p\\H_l=transformer\_block(h_{l-1})\forall i\in[i,n]\\ P(u)=softmax(h_nW_e^T)\end{matrix}  这里U={uik,...,ui1}U=\{u_{i-k},...,u_{i-1}\}表示uiu_i的上下文,WeW_e是词向量矩阵,WpW_p是位置向量矩阵。



 2.2. 有监督的fine-tuning

  在对模型预训练之后,采用有监督的目标任务对模型参数微调。假设一个有标签的数据集,假设每一条数据为一个单词序列x1,...,xmx_{1}, . . . , x_{m}以及相应的标签yy,通过之前预训练的模型获得输出向量hlmh_{l}^{m},再送入线性输出层,来预测标签yy
P(yx1,...,xm)=softmax(hlmWy)P(y|x^1,...,x^m)=softmax(h_l^mW_y)  Loss函数为:L2(C)=x,ylog  P(yx1,...,xm)L_2(C)=\sum_{x,y} log\;P(y|x^1,...,x^m)  最后,将两阶段的目标函数通过超参λ\lambda相加训练整个模型:L3(C)=L2(C)+λL1(C)L_3(C)=L_2(C)+\lambda L_1(C)



 2.3. 具体任务的模型微调

  对于文本分类,只需要在预训练模型上微调。对于QA任务或者文本蕴含,因为预训练模型是在连续序列上训练,需要做一些调整,修改输入结构,将输入转化为有序序列输入

  1. 文本蕴含 :将前提pp和假设hh序列拼接,中间用($)符号来分隔两个序列。

  2. 文本相似度:分别将两个序列输入,通过模型输出两个序列的特征向量,再逐元素相加输入线性层。

  3. 问答和常识推理:给定上下文文本zz,问题qq,一组可能的候选答案 {ak}\{a_k\},将上下文文本、问题以及每个候选答案拼接起来,得到这样一个序列[z;q;[z;q; $ ;ak];a_k],再将该序列输入预训练模型,经softmax层得到候选答案的概率分布。




3. BERT

  Bert(原文)是谷歌的大动作,公司AI团队新发布的BERT模型,在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类,并且还在11种不同NLP测试中创出最佳成绩,包括将GLUE基准推至80.4%(绝对改进7.6%),MultiNLI准确度达到86.7% (绝对改进率5.6%)等。可以预见的是,BERT将为NLP带来里程碑式的改变,也是NLP领域近期最重要的进展。

  BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

  BERT采用了Transformer Encoder的模型来作为语言模型,Transformer模型来自于经典论文《Attention is all you need》, 完全抛弃了RNN/CNN等结构,而完全采用Attention机制来进行input-output之间关系的计算,如下图中左半边部分所示:
在这里插入图片描述

  Bert模型结构如下:
在这里插入图片描述

  BERT模型与OpenAI GPT的区别就在于采用了Transformer Encoder,也就是每个时刻的Attention计算都能够得到全部时刻的输入,而OpenAI GPT采用了Transformer Decoder,每个时刻的Attention计算只能依赖于该时刻前的所有时刻的输入,因为OpenAI GPT是采用了单向语言模型。




4. 参考资料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章