转载自:https://zhuanlan.zhihu.com/p/51679783
2018年3月份,ELMo[1][2]出世,该paper是NAACL18 Best Paper。在之前2013年的word2vec及2014年的GloVe的工作中,每个词对应一个vector,对于多义词无能为力。ELMo的工作对于此,提出了一个较好的解决方案。不同于以往的一个词对应一个向量,是固定的。在ELMo世界里,预训练好的模型不再只是向量对应关系,而是一个训练好的模型。使用时,将一句话或一段话输入模型,模型会根据上线文来推断每个词对应的词向量。这样做之后明显的好处之一就是对于多义词,可以结合前后语境对多义词进行理解。比如apple,可以根据前后文语境理解为公司或水果。
笔者也看了网上的很多资料,感觉很多资料要么含糊其辞,要么蜻蜓点水,并不能让笔者真正明白ELMo到底是怎么一回事,又是怎么工作的。ELMo的原理也不复杂,只是单纯的看此篇paper又缺乏很多nlp的语言模型(LM)知识的话,就不容易理解了。同时,paper不同于教科书,一点一点的来,paper是假设很多背景点到你都明白的情况下写的。本博客中,笔者试图对EMLo论文所做工作做一个较为清晰的解释,同时基于tensorflow hub的ELMo模型进行简单的上手使用。
目前,深度学习有各种网络结构及各种名称,在笔者眼中,不过是一些数学公式起了名字罢了。ok,开始吧
一、 ELMo原理
1.1 RNN及LSTM基础
这里先简单介绍下RNN和LSTM。这些对于后面理解ELMo是很有用的。对于此内容的读者可以跳过此内容。
RNN的网络结构如下图图1,这是一层RNN的结构,这个结构是展开图。RNN是有时序的,每个时序里,都是单元的重复。
RNN有各种问题,比如梯度消失问题,所以下面介绍LSTM。LSTM的结构如下图图3,对于LSTM的输入和输出下图图4。关于LSTM里面的参数及公式,如下图图5。可以结合图4和图5来理解LSTM。LSTM是复杂、高级版的RNN。这里可以参考我以前写的博客。
1.2 前向 LSTM 语言模型基础 & ELMo 的双向LSTM语言模型
这里分为两部分,1.2.1讲述一些 LSTM 语言模型的基础,1.2.2讲述 ELMo 中的 LSTM 模型。
1.2.1 前向 LSTM 语言模型基础
1.2.1 前向 LSTM 语言模型基础
给定一串长度为N的词条 ( t 1 , t 2 , … , t N ) (t_1,t_2,\ldots,t_N) (t1,t2,…,tN) ,前向语言模型通过对给定历史 ( t 1 , t 2 , … , t k − 1 ) (t_1,t_2,\ldots,t_{k-1}) (t1,t2,…,tk−1)预测 t k t_k tk进行建模,图如下图6(值得注意的是,图6不是ELMo的最终图,只是解释 LSTM 语言模型的图),对应的公式如下图图7。
到了此处,大家可能会迷惑这个网络的输入输出是什么?具体的流程是什么?这个问题很基础又关键。
以“the cat sat on the mat”这句话为例。在某一个时刻 k(对应于1.1节中的t时刻)时,输入为the,输出cat的概率。过程是这里面包含了几步。
第一步:将the转换成word embedding。所谓word embedding就是一个 n∗1 维的列向量,这个很好理解。那单词怎么转成word embedding的呢?如果大家用过Word2Vec,GloVe就知道,就是简单的查表。在本篇paper中,用的不是Word2vec,GloVe,毕竟2018年了。作者用的是cnn-big-lstm[5]生成的word embedding,其实跟Word2Vec等也差不多,就是提前单独训练好的模型,模型喂入单词就能得到单词的word embedding。总之,在这里一步里,就是简单将单词转换成了 n∗1 的列向量,而这个列向量,对应于1.1节中的输入 x t x_t xt 。
第二步:将上一时刻的输出/隐状态 h k − 1 h_{k-1} hk−1及第一步中的word embedding一并送入LSTM,并得到输出及隐状态 ℎk 对应于1.1中的 ℎt)。其中,隐状态 h k − 1 h_{k-1} hk−1 是一个 m∗1 的列向量。在1.1中,我们有讲 LSTM 的原理。在这一步里,LSTM 的输出及隐状态都是 ℎt ,是一个 m∗1 维的列向量。请大家务必注意 ℎk ,这个 ℎk 与我们后文提到 ELMo 向量有着直接的关系。
第三步:将 LSTM 的输出 ℎk ,与上下文矩阵 W′ 相乘,即 W′ℎk 得到一个列向量,再将该列向量经过softmax归一化。其中,假定数据集有 V 个单词, W′ 是V∗m 的矩阵, ℎk 是 m∗1 的列向量,于是最终结果是 V∗1 的归一化后向量,即从输入单词得到的针对每个单词的概率。
从上面三步,就可以明白这个前向 LSTM 语言模型的工作流程了。其实很多神经网络语言模型都很类似,除了 LSTM,还可以用 RNN 及前馈神经网络,原理都差不多。
1.2.2 ELMo 的双向 LSTM 语言模型
有了前面1.1节及1.2.1节的基础,ELMo 的双向 LSTM 语言模型就很好解释了。ELMo的整体图如下图图8。相对于上面的图6,有两个改进,第一个是使用了多层LSTM,第二个是增加了后向语言模型(backward LM)。
对于多层 LSTM ,每层的输出都是1.1节中提到的隐向量 h t ℎ_t ht,在ELMo里,为了区分,前向 LSTM 语言模型的第j层第k时刻的输出向量命名为 h k , j L M → \overrightarrow{h_{k,j}^{LM}} hk,jLM。
对于后向语言模型,跟前向语言模型类似,除了它是给定后文来预测前文。后向 LSTM 语言模型的公式如下图图9所示,可以对照着前向语言 LSTM 语言模型的公式(图7所示)来看。还是非常好理解的。类似的,我们设定后向 LSTM 的第j层的第k时刻的输出向量命名为 h k , j L M ← \overleftarrow{h_{k,j}^{LM}} hk,jLM
图7和图9分别是前向、后向 LSTM 语言模型所要学习的目标函数(注意此处是追求概率最大化的,跟通常的目标函数追求最小化有所不同,要是追求最小化,前面加负号即可)。ELMo 使用的双向 LSTM 语言模型,论文中简称biLM。作者将图7和图9的公式结合起来,得到所要优化的目标:最大化对数前向和后向的似然概率,如下图图10所示。
图10中的参数说明, → Θ L S T M \xrightarrow[\Theta_{LSTM}]{} ΘLSTM表示前向 LSTM 的网络参数, ← Θ L S T M \xleftarrow[\Theta_{LSTM}]{} ΘLSTM表示反向的 LSTM 的网络参数。两个网络里都出现了 Θ x \Theta x Θx 和 Θ s \Theta s Θs ,表示两个网络共享的参数。其中 Θ x \Theta x Θx 表示映射层的共享,即1.2.1节中提到的第一步中,将单词映射为word embedding的共享,就是说同一个单词,映射为同一个word embedding。 Θ s \Theta s Θs 表示1.2.1节中提到的第三步中的上下文矩阵的参数,这个参数在前向和后向 LSTM 中是相同的。
笔者思考一个问题,为何不把L+1个向量一起拼接起来?在nlp通常都是这么做的,使用相加而不是拼接,可能因为维度的原因,并不是十分清楚。
很明显的是,一个单词的word embedding,最简单的办法是使用最顶层的embedding表示这个单词,也就是 h k , j L M {h_{k,j}^{LM}} hk,jLM;次之是使用每层的这个词对应的embedding输出进行加权,这些权重可以训练
总之,看到上图图12,就是我们所说的ELMo向量了。它是多个输出层及输入层,按照一定权重相乘得到的。这个权重怎么来的?针对具体的nlp任务,我们用的时候,需要再次训练去得到的这个权重。最简单的方法,就是权重都设为一样。
1.4 预训练的双向语言模型架构
论文的作者有预训练好的 ELMo 模型,映射层(单词到word embedding)使用的Jozefowicz的CNN-BIG-LSTM[5],即输入为512维的列向量。同时LSTM的层数L,最终使用的是2,即L=2。每层的LSTM的单元数是4096。每个LSTM的输出也是512维列向量。每层LSTM(含前、向后向两个)的单元个数是4096个(从1.1节可以知公式4m2 = 4512*2 = 4096)。也就是每层的单个lstm的输入是512维,输出也是512维。
一旦模型预训练完成,便可以用于nlp其他任务。在一些领域,可以对biLM(双向 LSTM 语言模型)进行微调,对任务的表现会有所提高,这种可以认为是一种迁移学习(transfer learning)。
1.5 ELMo使用方法总结 及 效果展示
对于预训练好的双向 LSTM 语言模型,我们可以送入一段话,然后模型会得到图11的向量,然后我们加上一定的权重(可训练)即可得到图12的ELMo向量。最终将ELMo向量与 x k x_k xk拼接作为单词的特征,用于后续的处理。
对于部分任务,可以对双向 LSTM 语言模型微调,可能有所提升。
1.7 ELMo的缺点
前文提了这么多 ELMo 的优点,现在说一说缺点。这些缺点笔者是搬运[6]的观点。[6]的观点是站在现在的时间点上(BERT已发布)看的,他的观点如下:
前文提了这么多 ELMo 的优点,现在说一说缺点。这些缺点笔者是搬运[6]的观点。[6]的观点是站在现在的时间点上(BERT已发布)看的,他的观点如下:
那么站在现在这个时间节点看,ELMo 有什么值得改进的缺点呢?首先,一个非常明显的缺点在特征抽取器选择方面,ELMo 使用了 LSTM 而不是新贵 Transformer,Transformer 是谷歌在 17 年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,很多研究已经证明了 Transformer 提取特征的能力是要远强于 LSTM 的。如果 ELMo 采取 Transformer 作为特征提取器,那么估计 Bert 的反响远不如现在的这种火爆场面。另外一点,ELMo 采取双向拼接这种融合特征的能力可能比 Bert 一体化的融合特征方式弱,但是,这只是一种从道理推断产生的怀疑,目前并没有具体实验说明这一点。