ELMo论文解读——原理、结构及应用

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

一、引言

词向量是自然语言处理任务中非常重要的一个部分,词向量的表征能力很大程度上影响了自然语言处理模型的效果。如论文中所述,词向量需要解决两个问题:
(1)词使用的复杂特性,如句法和语法。
(2)如何在具体的语境下使用词,比如多义词的问题。
传统的词向量比如word2vec能够解决第一类问题,但是无法解决第二类问题。比如:“12号地铁线马上就要开通了,以后我们出行就更加方便了。”和“你什么时候方便,我们一起吃个饭。”这两个句子中的“方便”用word2vec学习到的词向量就无法区分,因为word2vec学习的是一个固定的词向量,它只能用同一个词向量来表示一个词不同的语义。 而elmo就能处理这种多义词的问题。

二、elmo模型结构
Elmo主要使用了一个两层双向的LSTM语言模型,常见的有两种表示方式,可结合起来理解,如下:

在这里插入图片描述
在这里插入图片描述
以上图说明,左边输入的是句子的上文,右边输入的是句子的下文。训练好之后以三层内部状态的函数来表示词向量(见下图)。

模型结构:
2层biLSTM,每一层同一方向4096个单元;
biLSTM层向量维度1024维(论文中未提及,从代码中确认);
投影层词向量维度:512维。
从最底层词嵌入层到第一层biLSTM输出层之间还有一个残差链接。

最终模型输入的是128个句子(一批)正反向512维的词向量(不包括句子开始和结束标志,每个句子长度平均为30个词),词向量经过字符卷积得到。

以"I love China very much"为例,如果要预测的T1是love,那么E1处输入的就是"I"和"China".

模型结构之字符卷积:
可参考这篇论文:
https://arxiv.org/abs/1508.06615

1、网络结构
一个输入层、一个卷积层、一个池化层。
2、原始输入
单个词的字符表示
(embedding_dimension, num——character)即(特征维度,字符数量)
图片所示为(4,9)。
elmo中使用的是(16,50),即一个词的最大长度为50,每一个字符用16维表示。
3、卷积
图中,卷积核大小为(4,3)的有4个(每一行代表一个卷积核卷积后得到的结果),大小为(4,2)的有3个,大小为(4,4)的有5个。
elmo中使用的卷积核的个数是2048个,分别是[1, 32], [2, 32], [3, 64], [4, 128], [5, 256], [6, 512], [7, 1024](第一维代表宽度,第二维代表个数)。
4、池化
对每一行进行最大池化,将池化结果拼接起来,形成维度为卷积核个数的词向量。
所以,elmo中的初始词向量是2048维,然后经过线性变化转化为512维。

在这里插入图片描述
模型结构之highway networks:
可参考以下论文:
https://arxiv.org/abs/1505.00387

1、目的
解决深度神经网络中训练困难的问题。

2、原理
使用门控单元,使输入以一定的比例穿过网络,增加网络的灵活性。

3、数学表示
在这里插入图片描述
在这里插入图片描述
其中,x代表网络输入,y代表网络输出,H为非线性激活函数,W_H、W_T、W_C为参数,T是transform gate,C是carry gate,论文中设定C=1-T.

网络结构可参考(截取自字符卷积):

在这里插入图片描述

在elmo的词嵌入和第一层的输出之间还有一层残差连接,有兴趣的可参考:
https://arxiv.org/abs/1512.03385

三、elmo训练

1、准备词典文件和训练文件。
词典文件中每个词占一行,必须包含S(作为句子开始标志,还有一个括号,但加上括号在此处无法显示出来), ‘/S’(作为句子结束标志) 和 UNK(非词典内词的标记)。顺序按照训练数据中词的频率来排。(词典大小793471)
训练文件每一句占一行,不能包含“S”、“/S”字符。

2、将文本里的词转化为字符id
初始化文本中某个句子某个词字母数组:X_char_ids=np.zeros( n_sentences, max_length, self._max_token_length) (默认一个词的最大长度是50,实际上除人为构词外公认的最大长度为45)
初始化字母:code = np.zeros([self.max_word_length])
对词中的每个字母按照UTF-8进行编码:
code[k] = chr_id (k代表该字母在词中的顺序, chr_id使用utf-8对该字母进行编码的结果(0-255))。
然后将该编码转化为16维的矩阵(可通过编码对262*16的字符嵌入矩阵进行索引)
最后将字母拼接成词,再将词拼接成句子。

3、每次输入128个句子,通过softmax层计算下一个词(论文和代码中都未提及使用层序softmax,可能的原因是tensorflow未封装层序softmax),通过计算前向和后向的语言模型的对数似然函数来优化模型:
在这里插入图片描述
四、elmo模型使用

1、将下游任务文本转化成字符数组,输入到已训练好的ELMO模型当中,固定住模型中的权重,进行训练。
2、计算一个最终的Elmo词向量。根据下游任务的文本计算一个新的词向量,再将此词向量应用于任务模型。可直接使用顶层的词向量,但一般使用所有层词向量的线性组合。
在这里插入图片描述
在这里插入图片描述经softmax计算的权重归一化因子,可以看成是对特定任务学习到的三个词向量的权重进行的softmax归一化,每一个特定任务的归一化因子是相同的,即在任务训练集上得到的归一化因子可应用于测试集。
在这里插入图片描述缩放因子,在具体的任务模型中学习到,调整的是elmo学习到的词向量占特定任务中词向量的权重。
以上两个参数在elmo模型训练好之后还需要在下游模型进行训练,相当于在下游模型中增加了两个参数。

3、再将此词向量运用于下游任务中(在测试集上观察改善效果)。既可用于输入层、也可用于输出层。

elmo的主要思想:先在一个大型的预料库上面进行训练,用模型的内部状态来表征一个词的向量,此时内部状态混合了所有的语义;然后将下游任务的文本输入模型,此时的词具备了具体的上下文语境,再用内部状态的线性组合来表征词,这种线性组合是在任务模型上进行训练得到的。

猜你喜欢

转载自blog.csdn.net/weixin_44081621/article/details/86649821
今日推荐