一.简介
ELMo是Embeddings from Language Models的缩写,意思就是语言模型得到的(句子)Embedding。另外Elmo是美国儿童教育电视节目芝麻街(Sesame Street)里的小怪兽的名字。原始论文是Deep contextualized word representations,这个标题是很合适的,也就是用深度的Transformer模型来学习上下文相关的词表示。
这篇论文的想法其实非常非常简单,但是取得了非常好的效果。它的思路是用深度的双向RNN(LSTM)在大量未标注数据上训练语言模型,如下图所示。然后在实际的任务中,对于输入的句子,我们使用这个语言模型来对它处理,得到输出的向量,因此这可以看成是一种特征提取。但是和普通的Word2Vec或者GloVe的pretraining不同,ELMo得到的Embedding是有上下文的。比如我们使用Word2Vec也可以得到词”bank”的Embedding,我们可以认为这个Embedding包含了bank的语义。但是bank有很多意思,可以是银行也可以是水边,使用普通的Word2Vec作为Pretraining的Embedding,只能同时把这两种语义都编码进向量里,然后靠后面的模型比如RNN来根据上下文选择合适的语义——比如上下文有money,那么它更可能是银行;而如果上下文是river,那么更可能是水边的意思。但是RNN要学到这种上下文的关系,需要这个任务有大量相关的标注数据,这在很多时候是没有的。而ELMo的特征提取可以看成是上下文相关的,如果输入句子有money,那么它就(或者我们期望)应该能知道bank更可能的语义,从而帮我们选择更加合适的编码。
二.原理
要了解ELMo,首先要熟悉前向 LSTM 语言模型基础,所以下面先着重讲一下前向 LSTM 语言模型基础。
前向 LSTM 语言模型基础。
给定一串长度为N的词条 () ,前向语言模型通过对给定历史 () 预测进行建模,(值得注意的是,下图不是ELMo的最终图,只是解释 LSTM 语言模型的图),对应的公式如图7。
到了此处,大家可能会迷惑这个网络的输入输出是什么?具体的流程是什么?这个问题很基础又关键。
以“the cat sat on the mat”这句话为例。在某一个时刻(对应于1.1节中的t时刻)时,输入为the,输出cat的概率。过程是这里面包含了几步。
第一步:将the转换成word embedding。所谓word embedding就是一个维的列向量,这个很好理解。那单词怎么转成word embedding的呢?如果大家用过Word2Vec,GloVe就知道,就是简单的查表。在本篇paper中,用的不是Word2vec,GloVe,毕竟2018年了。作者用的是cnn-big-lstm[5]生成的word embedding,其实跟Word2Vec等也差不多,就是提前单独训练好的模型,模型喂入单词就能得到单词的word embedding。总之,在这里一步里,就是简单将单词转换成了的列向量。
第二步:将上一时刻的输出/隐状态及第一步中的word embedding一并送入LSTM,并得到输出及隐状态。其中,隐状态是一个的列向量。在这一步里,LSTM 的输出及隐状态都是 ,是一个维的列向量。
第三步:将 LSTM 的输出,与上下文矩阵相乘,即得到一个列向量,再将该列向量经过softmax归一化。其中,假定数据集有个单词, 是的矩阵, ℎ是的列向量,于是最终结果是的归一化后向量,即从输入单词得到的针对每个单词的概率。
从上面三步,就可以明白这个前向 LSTM 语言模型的工作流程了。其实很多神经网络语言模型都很类似,除了 LSTM,还可以用 RNN 及前馈神经网络,原理都差不多。
ELMo 的双向 LSTM 语言模型
ELMo的整体图如下图。相对于前向lstm的语言模型,有两个改进,第一个是使用了多层LSTM,第二个是增加了后向语言模型(backward LM)。
对于多层 LSTM ,每层的输出都是隐向量 ,在ELMo里,为了区分,前向 LSTM 语言模型的第j层第k时刻的输出向量命名为。
对于后向语言模型,跟前向语言模型类似,除了它是给定后文来预测前文。后向 LSTM 语言模型的公式如下图所示。类似的,我们设定后向 LSTM 的第j层的第k时刻的输出向量命名为。
前向、后向 LSTM 语言模型所要学习的目标函数(注意此处是追求概率最大化的,跟通常的目标函数追求最小化有所不同,要是追求最小化,前面加负号即可)得到所要优化的目标:最大化对数前向和后向的似然概率。
图10中的参数说明, 表示前向 LSTM 的网络参数, 另一个表示反向的 LSTM 的网络参数。两个网络里都出现了和,表示两个网络共享的参数。其中表示映射层的共享,将单词映射为word embedding的共享,就是说同一个单词,映射为同一个word embedding。表示上下文矩阵的参数,这个参数在前向和后向 LSTM 中是相同的。
ELMo
所谓ELMo不过是一些网络层的组合。都有哪些网络层呢?对于每个单词(token),对于 层的双向 LSTM 语言模型,一共有个表征(representations),如下图所示:
其中, 第0层是前文提到的word embedding,也就是 LSTM 的输入。对于其他层的每一层的双向 LSTM 语言模型
。值得注意的是,每一层有一个前向 LSTM 的输出,一个后向 LSTM 的输出,两者就是简单的拼接起来的。也就是如果分别都是维的列向量,拼完之后就是的列向量,就这么简单。
既然ELMo有这么多向量了,那怎么使用呢?最简单的方法就是使用最顶层的 LSTM 输出作为单词的word embedding,即,但是我们有更好的方法使用这些向量。我们对于每层向量,我们加一个权重(一个实数),将每层的向量与权重相乘,然后再乘以一个权重。每层 LSTM 输出,或者每层 LSTM 学到的东西是不一样的,针对每个任务每层的向量重要性也不一样,所以有L层 LSTM,L+1个权重,加上前面的 ,一共有L+2个权重。注意下此处的权重个数,后面会用到。对于训练多个任务时,可以用这个 ,对于一个单独的任务,就不需要这个参数了。
很明显的是,一个单词的word embedding,最简单的办法是使用最顶层的embedding表示这个单词,也就是;次之是使用每层的这个词对应的embedding输出进行加权,这些权重可以训练。
就是我们所说的ELMo向量了。它是多个输出层及输入层,按照一定权重相乘得到的。这个权重怎么来的?针对具体的nlp任务,我们用的时候,需要再次训练去得到的这个权重。最简单的方法,就是权重都设为一样。
论文的作者有预训练好的 ELMo 模型,映射层(单词到word embedding)使用的Jozefowicz的CNN-BIG-LSTM[5],即输入为512维的列向量。同时LSTM的层数L,最终使用的是2,即L=2。每层的LSTM的单元数是4096。每个LSTM的输出也是512维列向量。每层LSTM(含前、向后向两个)的单元个数是4096个(从1.1节可以知公式4m*2 = 4*512*2 = 4096)。也就是每层的单个lstm的输入是512维,输出也是512维。
一旦模型预训练完成,便可以用于nlp其他任务。在一些领域,可以对biLM(双向 LSTM 语言模型)进行微调,对任务的表现会有所提高,这种可以认为是一种迁移学习(transfer learning)。
三.缺点
前文提了这么多 ELMo 的优点,现在说一说缺点。这些缺点笔者是搬运[6]的观点。[6]的观点是站在现在的时间点上(BERT已发布)看的,他的观点如下:
那么站在现在这个时间节点看,ELMo 有什么值得改进的缺点呢?首先,一个非常明显的缺点在特征抽取器选择方面,ELMo 使用了 LSTM 而不是新贵 Transformer,Transformer 是谷歌在 17 年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,很多研究已经证明了 Transformer 提取特征的能力是要远强于 LSTM 的。如果 ELMo 采取 Transformer 作为特征提取器,那么估计 Bert 的反响远不如现在的这种火爆场面。另外一点,ELMo 采取双向拼接这种融合特征的能力可能比 Bert 一体化的融合特征方式弱,但是,这只是一种从道理推断产生的怀疑,目前并没有具体实验说明这一点。
参考:https://zhuanlan.zhihu.com/p/51679783