@songying
2019-04-01T17:01:51.000000Z
字数 2996
阅读 986
博客文章
现在再写 ELMO 相关文章有点炒冷饭的意思,毕竟 Bert 一出, 意味着在Embedding领域,预训练语言模型才是正确的道路。但另一方面,ELMO 这篇文章依旧有着很好的参考价值,对于滤清整个Embedding的发展有着很好的帮助,推荐阅读原论文。
本文不与 Bert 进行对比,而是与之前的 Glove 等词向量做比较,来解释为何 ELMO 能够获得更好的结果。
我们回想在 ELMO 之前的 Word2Vec 时代, 我们获得的词向量是上下文无关的,这使得我们的词向量在解决歧义问题上捉襟见肘。另一方面,词向量是采用单层神经网络训练得到的,这意味着词向量本身的表示抽象程度并不高, 对比CV中的卷积理论, 越深层的网络越能把握数据的深层抽象特征, 而对于语言这么抽象的东西, 仅仅采用单层网络来做明显是远远不够的。
为了解决词的上下文信息问题,我们通常采用 双向LSTM 或 Transformer 来做上下文表示层来获取词的上下文表示, ELMO 就是利用了这种思想,将这种上下文表示信息融入到Embedding 中,那不就能够获得更好的表示了吗。
此外,为了弥补词向量对于OV词以及时态,正负数等词的不足, char-level 向量被用来做词向量的信息补偿,将word-level 与char-level 结合起来的确能够获得更好的效果。 结合的方式多种多样, 其中, Highway Networks 是一种很常见且很高效的方式。而对于 char-level 向量来说,训练的方式有多种,如RNN, CNN等。
与传统的语言模型相同, 双向语言模型的目的依旧是获得各层的表示来作为词的向量表示, 先来原理,再谈谈我的看法。
首先, 双向语言模型的输入是 char-level 的, 在原论文中是通过字符卷积得到的最初的词向量表示 , 然后再将 char-level 词向量 feed 入L层的双向LSTM中进行训练。
对于双向语言模型来说,其在损失函数方面与传统的有所不同, 其考虑到了前向语言模型的计算以及后向语言模型的计算。
那么其损失函数就是简单的求二者的 log 和:
唯一疑惑的一点是, 这里为何采用 char-level 来训练,是越细粒度的越能够把握信息吗? 如果采用 word-level 来训练,是否还能获得这么大的提升。
另一方面, 去年有看到阿里的一篇文章以 word2Vec + ELMO 能够获得比单一的ELMO更好的效果, 如果采用ELMO的方法训练一个Word 版本,然后二者结合,是否能够产生更好的效果。
当然, 想法终究是想法, 在 Bert 之后, 感觉 Embedding 未来会走上预训练语言模型的道路上, 所以, ELMO 这种路子怕是会沉寂一段时间,甚至消亡, 毕竟, 采用预训练要比词向量的方式,其泛化能力要强的多, 参数上就差着量级呢 。
## ELMO
ELMO 经过 L 层的双向语言模型, 然后将字符级表示 , 每层的隐层输出 组合起来, 形成一个2L + 1 个向量:
使用 最简单的方式就是仅仅采用最顶层的输出作为词的表示,即将最后一层的向量矩阵 拿出来当 word2Vec 的用,也能获得比较好的结果,这意味着, 深层的网络更能把握语言的抽象信息, 对语义的表示也更好。
那么对于第 个词,其最终的表示为:
值得一提的是, 缩放因子 是考虑到双向语言模型中的每一层的输出具有不同的分布,其某种程度上相当于在 Weighting 前对每一层的向量做 Layer Normalization。 论文中有提到,如果将每层向量提前做Normalization, 也能够有所帮助。
对比ELMO, 其参数量要少很多,对于一些资源受限的设备,不适合上 Bert 的, ELMO 也是不错的选择, 论文中提到, 使用ELMO 有两种方式:
论文中还提到, 适当的 Dropout 或者在损失中加入L2正则是有帮助的。
虽然说 ELMO 的光芒完全被 Bert 掩盖,但这并不意味着这篇文章不够优秀, 只能说, 贫穷限制了我们的想象力。 对于ELMO 的训练来说,大多数的实验室还是有足够的资源搞定的,但对于 Bert, 有资源搞一搞Bert的实验室实在是凤毛麟角。
我个人认为, 在 Embedding 领域,目前已经没有小实验室参与的资格了,甚至很多大实验室也只能望洋兴叹, 所以,对于初入 NLP 的新人来说, 文章,看看就好,毕竟的确经典,但实践就未必需要了,往往只是浪费时间,感动自己。 对,我说的就是我,哈哈哈哈。