系统学习NLP(二十七)--EMLo

论文:Deep contextualized word representations

参考:https://www.cnblogs.com/huangyc/p/9860430.html

https://blog.csdn.net/firesolider/article/details/88092831

ELMo的语言理解是通过预测训练单词序列中的下一个单词来实现,这项任务被称为语言建模。这是很方便的,因为我们有大量的文本数据,这样的模型不需要标签就可以从中学习。

1. 前言

今天给大家介绍一篇2018年提出的论文《Deep contextualized word representations》,在这篇论文中提出了一个很重要的思想ELMo。ELMo是一种是基于特征的语言模型,用预训练好的语言模型,生成更好的特征。

2. ELMo模型介绍

ELMo是一种新型深度语境化词表征,可对词进行复杂特征(如句法和语义)和词在语言语境中的变化进行建模(即对多义词进行建模)。我们的词向量是深度双向语言模型(biLM)内部状态的函数,在一个大型文本语料库中预训练而成。

说到词向量,我们一定会联想到word2vec,因为在它提出的词向量概念给NLP的发展带来了巨大的提升。而ELMo的主要做法是先训练一个完整的语言模型,再用这个语言模型去处理需要训练的文本(怎么理解?),生成相应的词向量,所以在文中一直强调ELMo的模型对同一个字在不同句子中能生成不同的词向量。

3. ELMo原理介绍

3.1 ELMo的预训练

前面也说过ELMo最重要的一点是就是训练语言模型,语言模型的结构如下:

系统学习NLP(二十七)--EMLo_第1张图片

他们使用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

前向LSTM结构:

p(t_1,t_2,...,t_N) = \prod^N_{k=1}p(t_k|t_1,t_2,...,t_{k-1})

反向LSTM结构:

p(t_1,t_2,...,t_N) = \prod^N_{k=1}p(t_k|t_{k+1},t_{k+2},...,t_{N})

最大似然函数:

\sum_{k=1}^N(logp(t_k|t_1,t_2,...,t_{k-1}) + logp(t_k|t_{k+1},t_{k+2},...,t_{N}))

实际的BiLSTM是这样的:

系统学习NLP(二十七)--EMLo_第2张图片

 由上面EMLo语言模型结构可以看出,实际上,有两层BiLSTM。

初始输入的词向量,作者推荐使用字符卷积网络来生成。当然为了加速训练,也可以在输入时直接使用word2vec或glove等传统词向量。

3.2 使用语言模型

在预训练好这个语言模型之后,ELMo就是根据公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个加权求和最简单的也可以使用最高层的表示来作为ELMo。然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。

4. 总结

大家有想过为什么ELMo的效果会比word2vec的效果好?我个人认为有一下几点:

  1. ELMo的假设前提一个词的词向量不应该是固定的,所以在一词多意方面ELMo的效果一定比word2vec要好。
  2. word2vec的学习词向量的过程是通过中心词的上下窗口去学习,学习的范围太小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,而后再通过语言模型生成的词向量就相当于基于整个语料库学习的词向量,更加准确代表一个词的意思。
  3. ELMo还有一个优势,就是它建立语言模型的时候,可以运用非任务的超大语料库去学习,一旦学习好了,可以平行的运用到相似问题。
  4. 个人补充:其实,感觉这里还有一点,word2vec只是学习了固定小窗口范围的中心词与附近词的空间关系,但没有强调语法及语义关系,而BiLSTM更能学习到这种语法、语义关系,其实说白了,就是把word2vec中的简单线性求和,用更复杂的BiLSTM来代替,同时堆叠了2层。

你可能感兴趣的:(自然语言)