当前位置:   article > 正文

【论文阅读】Deep contextualized word representations

deep contextualized word representations

虽然是个NLP小白,但是感觉ELMo怎么这么眼熟,就在碰见的时候下载下来读一读了。

论文地址:https://arxiv.org/abs/1802.05365

以下是正文:

ELMo是一种计算词嵌入的方式,旨在表示出词的更丰富的信息以及引入上下文相关的性质,同一个词在不同上下文中的表示也不同。


引言

        作者认为,一个好的词嵌入表示要满足两个特征:(1)能表达出词的复杂的特征(2)要能综合上下文的信息来对当前词进行表示。这也就是本文提出的ELMo所具有的特征。

        针对第二个特征,ELMo通过使用LSTM使得整个模型是整个句子的函数来满足。而根据后面提到的实验,LSTM的不同层捕捉到的是不同层次的信息,较高的LSTM层捕捉到的是上下文内容依赖的词义的信息,较低的LSTM层捕捉到的是有关句法的信息。ELMo通过对LSTM的不同层的表示进行加权求和来综合这不同层次的信息,从而满足第一个特征。


相关工作

        这一部分作者讲了其他的一些词嵌入的算法,不过因为这是我看的第一个词嵌入的论文,作者提到的这些都没看过,因此也就迷糊迷糊地读完了。不过就算不知道也不影响主要内容。


ELMo:Embeddings from Language Models

首先介绍双向语言模型(biLM)。

        语言模型是指,给定一些历史词,预测当前词的概率,比如常见的n-gram模型等,整个句子出现的概率就是每个词的概率的连乘,公式表达就是:

p(t_{1},t_{2},t_{3}...t_{N})=\prod _{k=1}^{N}p(t_{k}|t_{1},t_{2}...t_{k-1})

        作者这里用LSTM来实现语言模型。首先选用一种方法(作者提到有token embeddings或者CNN over characters,我也不太懂,之后有时间看完来这里贴个链接)来对句子中的每个词进行一个向量表示,用符号表示就是x_{k}^{LM},之后送进一个两层的单向LSTM中,每一个x_{k}^{LM}对应的当前时间步的输出,在送进softmax层计算之后,我们认为是下一个位置出现什么词的概率,即[p('a'|t_{1},t_{2}...t_{k}),p('abound'|t_{1},t_{2}...t_{k})....]

        反向LSTM和正向LSTM类似,只是这里是给定后面的词,预测当前的词的概率,即

p(t_{1},t_{2},t_{3}...t_{N})=\prod _{k=1}^{N}p(t_{k}|t_{k+1},t_{k+2}...t_{N})

        在构建好正向LSTM与反向LSTM之后,我们的联合优化目标是最大化两个方向上的对数概率,公式如下,也就是最大化我们根据模型认为这个句子出现的概率:

\sum_{k=1}^{N}(log p(t_{k}|t_{1},t_{2}...t_{k-1};\Theta_{x},\Theta^{\rightarrow }_{LSTM},\Theta_{s})+log p(t_{k}|t_{k+1},t_{k+2}...t_{N};\Theta_{x},\Theta^{\leftarrow }_{LSTM},\Theta_{s}))

式子中\Theta_{x}是指在进行LSTM计算前对词进行向量表示的算法的参数,\Theta_{s}是指softmax的计算。公式中可以看到,作者在正向与反向中均使用相同的\Theta_{x}\Theta_{s},只有LSTM的参数不同。

        通过以语言模型为任务导向,这里的双向LSTM可以做到无监督训练,即训练数据不需要有标签。

在此基础上介绍ELMo。

        通过上面的双向LSTM(假设有L层),每个单词我们可以得到2L+1个有关的表示,一个是输入向量,然后正向与反向LSTM的L个层一共产生2L个向量。

        进一步将输入向量视为第0层隐藏层的输出,可以符号化为(不想打公式了,截图吧): 

然后ELMo对这L+1个向量进行加权平均,公式为:

 s^{task}就是进行加权平均的权值,\gamma _{task}是一个尺度因子,具体的作用是可以让模型自己选择合适的尺度,有助于优化过程。这两种参数都是和下流应用一起通过优化进行学习的。

怎么应用这个ELMo?

        对于下流应用或者模型,原本是有一个上下文无关的输入x_{k},我们将所有的这些x_{k}输入到前面建立的ELMo中得到ELMo_{k}^{task},我们将这两个向量进行连接得到[x_{k},ELMo_{k}^{task}],作为下流模型的新输入即可。

        作者提到,这里的ELMo不是只能应用在输入上,而是还可以应用到其他与上下文有关的地方比如输出,有的应用对模型的输出h_{k}咋不同层次上进行ELMo也可以提升性能(此h_{k}非ELMo中的h_{k},而是指下流模型在k时间步的输出)。

        此外,dropout和通过\lambda||\omega ||_{2}^{2}进行正则化都是有帮助的。这会使模型引入对每个层同等权重的偏好,即偏好取所有层的输出的算术平均(非加权)。

一些改变

        作者提到,作者应用的LSTM是有残差连接的(残差连接在resnet里有介绍,我的曾经笔记链接【论文阅读】Deep Residual Learning for Image Recognition_野生的野蛮人的博客-CSDN博客)。

        还有,刚才的介绍中,我们是先用无监督学习的方式训练biLM,之后再训练下流模型的时候这个biLM是要被冻结的,不再进行学习。不过当数据量多的时候,微调这个biLM也是能够提升性能的。


实验

        这一部分是在说应用ELMo会使得很多NLP任务取得同时代的更好的性能,包括Question answering、Textual entailment、Semantic role labeling、Coreference resolution、Named entity extraction、Sentiment analysis这六个NLP任务。具体数据就不展示了。


分析

作者同时做了很多实验来分析ELMo的各个方面。

实验一:biLM的层的加权平均比单独用最上层更好

        作者比较只用biLM的最上层的输出会怎样,结果表示,性能不如用所有层的加权平均。同时,作者也尝试改变了正则化参数\lambda\lambda ||\omega ||^{2}_{2}中的参数),\lambda =1代表我们希望直接取每个层的平均(不加权),\lambda =0.001则表示我们允许不同层的权值有很大差异。结果表示,允许模型更自由地决定各个层的权值会更好:

实验二:在不同位置引入ELMo

        前面提到,不仅可以在模型的输入处引入ELMo,还可以在其他地方比如输出处引入。作者尝试在不同任务的模型的输出处引入ELMo,发现有的模型适合在输出处引入,而有些模型不适合,会降低性能。

实验三:biLM的不同层提取不同层级信息

        这一部分,作者首先拿ELMo对词的表示与GloVe进行对比。在GloVe中,我们取一个词,并寻找与GloVe给出的表示很相近的其他词。ELMo也同样,不过ELMo要对不同上下文的同一个词进行区分。作者拿‘play’进行举例:

 可以发现,GloVe给出的与‘play’相近的其他词中不同词性的都有,而biLM(也就是ELMo)则可以很好地区分同一个词在不同上下文中的词性,即ELMo能够提取到很好丰富的信息,进行更好的歧义消除。

        在这之后,为了分析biLM的不同层都提取到了什么信息,作者拿biLM的不同层的表示进行两个任务上的比较,即歧义消除(Word sense disambiguation,WSD)和词性标注(POS tagging)。结果发现,在歧义消除任务上,最高层比最低层的效果好,在词性标注上则反之,最低层比最高层的效果好。这意味着不同层提取到了不同层次的信息,低层捕获词性等构词信息,而高层捕获词义等语义信息。

实验四:训练效率更高、数据集利用更好

        意思是,如果以达到某一设定的准确率或者分数为目标,那么用ELMo所需要的的训练轮数更少,所需的数据集更小。

实验五:可视化权重

         图示如下,没啥比较有启发性的信息:

 


总结

结束啦


记一些不会的地方:

1.上面提到ELMo可以应用到某些模型的输出的位置,有的效果更好,有的效果更差,作者给出的解释我看不太懂:

 

感谢作者!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号