今天学习的是 AllenNLP 和华盛顿大学 2018 年的论文《Deep contextualized word representations》,是 NAACL 2018 best paper。

这篇论文提出的 ELMo 模型是 2013 年以来 Embedding 领域非常精彩的转折点,并在 2018 年及以后的很长一段时间里掀起了迁移学习在 NLP 领域的风潮。

ELMo 是一种基于语境的深度词表示模型(Word Representation Model),它可以捕获单词的复杂特征(词性句法),也可以解决同一个单词在不同语境下的不同表示(语义)。

ELMo 本身思想不难,但是很多细节在论文中都没有给出,而是给出其他论文的引用,大大增加了阅读难度。翻阅了很多博客但是写得好的没几篇,大部分博客都只是介绍了 ELMo 的多层双向 LSTM 结构,而忽视其预训练方式和使用方式。

本文在书写过程中尽量涵盖一些我认为很重要的一些细节,也希望抛砖引玉得到大佬们更详细的见解。

1. Introduction

以 Word2Vec 和 GloVe 为代表的词表示模型通过训练为每个单词训练出固定大小的词向量,这在以往的 NLP 任务中都取得了不错的效果,但是他们都存在两个问题:

  1. 没法处理复杂的单词用法,即语法问题;
  2. 没办法结合语境给出正确词向量,即一词多义;

为了解决这个问题,作者提出了一个新的深层语境词表示模型——ELMo。

区别于传统模型生成的固定单词映射表的形式(为每个单词生成一个固定的词向量),ELMo使用了预训练的语言模型(Language Model),模型会扫面句子结构,并更新内部状态,从而为句子中的每个单词都生成一个基于当前的句子的词向量(Embedding)。这也是就是 ELMo 取名的由来:Embeddings from Language Models。

此外,ELMo 采用字符级的多层 BI-LM 模型作为语言模型,高层的 LSTM 能够捕获基于语境的词特征(例如主题情感),而低层的 LSTM 可以学到语法层次的信息(例如词性句法),前者可以处理一词多义,后者可以被用作词性标注,作者通过线性组合多层 LSTM 的内部状态来丰富单词的表示。

2. ELMo

ELMo 是一种称为 Bi-LM 的特殊类型的语言模型,它是两个方向上的 LM 的组合,如下图所示:

ELMo 利用正向反向扫描句子计算单词的词向量,并通过级联的方式产生一个中间向量(下面会给出具体的级联方式)。通过这种方式得到的词向量可以捕获到当前句子的结构和该单词的使用方式。

值得注意是,ELMo 使用的 Bi-LM 与 Bi-LSTM 不同,虽然长得相似,但是 Bi-LM 是两个 LM 模型的串联,一个向前,一个向后;而 Bi-LSTM 不仅仅是两个 LSTM 串联,Bi-LSTM 模型中来自两个方向的内部状态在被送到下层时进行级联(注意下图的 out 部分,在 out 中进行级联),而在 Bi-LM 中,两个方向的内部状态仅从两个独立训练的 LM 中进行级联。

2.1 Bi-LM

设一个序列有 N 个 token ( t 1 , t 2 , . . . , t N ) (t_1,t_2,...,t_N) (t1,t2,...,tN) (这里说 token 是为了兼容字符和单词,EMLo 使用的是字符级别的 Embedding)

对于一个前向语言模型来说,是基于先前的序列来预测当前 token:
p ( t 1 , t 2 , . . . , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , . . . , t k − 1 ) p (t_1 ,t_2 ,...,t_N )=\prod_{k=1}^{N}{p( t_k|t_1 ,t_2 ,...,t_{k-1} )} \\ p(t1,t2,...,tN)=k=1Np(tkt1,t2,...,tk1)
而对于一个后向语言模型来说,是基于后面的序列来预测当前 token:
p ( t 1 , t 2 , . . . , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , . . . , t N ) p (t_1 ,t_2 ,...,t_N )=\prod_{k=1}^{N}{p( t_k|t_{k+1} ,t_{k+2} ,...,t_{N} )}\\ p(t1,t2,...,tN)=k=1Np(tktk+1,tk+2,...,tN)
可以用 h k , j → \overrightarrow{h_{k,j}} hk,j

h k , j ← \overleftarrow{h_{k,j}} hk,j

分别表示前向和后向语言模型。

ELMo 用的是多层双向的 LSTM,所以我们联合前向模型和后向模型给出对数似然估计:
∑ k = 1 N ( log ⁡ p ( t k ∣ t 1 , . . . , t k − 1 ; Θ x , Θ → L S T M , Θ s ) + log ⁡ p ( t k ∣ t k + 1 , . . . , t N ; Θ x , Θ ← L S T M , Θ s ) ) \sum_{k=1}^{N}(\log p(t_k | t_1,...,t_{k-1}; \Theta_x, \overrightarrow{\Theta}_{LSTM},\Theta_s) + \log p(t_k | t_{k+1},...,t_{N}; \Theta_x, \overleftarrow{\Theta}_{LSTM},\Theta_s)) \\ k=1N(logp(tkt1,...,tk1;Θx,Θ

LSTM,Θs)+logp(tktk+1,...,tN;Θx,Θ

LSTM
,Θs))

其中, Θ x \Theta_x Θx 表示 token 的向量, Θ s \Theta_s Θs 表示 Softmax 层对的参数, Θ → L S T M \overrightarrow{\Theta}_{LSTM} Θ

LSTM
Θ ← L S T M \overleftarrow{\Theta}_{LSTM} Θ

LSTM
表示前向和后向的 LSTM 的参数。

我们刚说 ELMo 通过级联的方式给出中间向量(这边要注意两个地方:一个是级联,一个是中间向量),现在给出符号定义:

对每一个 token t k t_k tk 来说,一个 L 层的 ELMo 的 2L + 1 个表征:
R k = { x k L M , h k , j → , h k , j ← ∣ j = 1 , . . , L } = { h k , j ∣ j = 0 , . . . , L } R_k=\{x_k^{LM},\overrightarrow{h_{k,j}},\overleftarrow{h_{k,j}} | j=1,..,L\} \\ =\{h_{k,j}| j=0,...,L\}\\ Rk={xkLM,hk,j

,hk,j

j=1,..,L}={hk,jj=0,...,L}
其中, h k , 0 h_{k,0} hk,0 表示输入层, h k , j = [ h k , j → ; h k , j ← ] h_{k,j} = [\overrightarrow{h_{k,j}}; \overleftarrow{h_{k,j}}] hk,j=[hk,j

;hk,j

]
。(之所以是 2L + 1 是因为把输入层加了进来)

对于下游任务来说,ELMo 会将所有的表征加权合并为一个中间向量
E L M o k = E ( R k ; Θ ) = γ ∑ j = 0 L s j h k , j L M ELMo_k=E(R_k;\Theta) = \gamma\sum_{j=0}^{L}s_jh_{k,j}^{LM} \\ ELMok=E(Rk;Θ)=γj=0Lsjhk,jLM
其中, s s s 是 Softmax 的结果,用作权重; γ \gamma γ 是常量参数,允许模型缩放整个 ELMo 向量,考虑到各个 Bi-LSTM 层分布不同,某些情况下对网络的 Layer Normalization 会有帮助。

2.2 Supervised NLP task

我们来看下 ELMo 在有监督学习中应用,这里假设 ELMo 模型已经完成预训练。

对于给定的一个监督学习 NLP 任务,我们只需为每个句子中的单词记录下 ELMo 各层的词表征,然后用端到端的任务来学习这些表示的线性组合(学习向量的权重)。

对于大多数 NLP 任务而言,靠近输入端的结构所含信息基本一致(例如词法句法,想象下 CV 浅层网络的可视化都是一些线条),所以这就允许我们直接把训练好的 ELMo 加到现有的 NLP 的监督任务模型中(因为底层结构相似,所以直接用 ELMo 提取上下文的浅层信息也可以)。通常来说,会使用预训练的 Word Embedding(或者是字符级别的 Embedding)来为每个位置生成一个上下文无关的词表示 $x_k $,然后拼接 EMLo 后会生成一个上下文相关的词表示(即,通过 ELMo 提取单词及周围的上下文信息,然后拼接原本的单词向量)。

为了将 ELMo 加到监督学习的模型中,我们有两种拼接方式:

  1. 固定 BiLM 的权重,并用 x k x_k xk 拼接 ELMo 的向量 E L M o k ELMo_k ELMok ,使用拼接后的向量 [ x k ; E L M o k ] [x_k;ELMo_k] [xk;ELMok] 传递给下游任务;
  2. 或者利用模型的隐藏输出层,比如 RNN 的 h k h_k hk 来和 E L M O k ELMO_k ELMOk 拼接 [ h k ; E L M o k ] [h_k;ELMo_k] [hk;ELMok]

最后,对 ELMo 适当加入一些 Dropout,或者在某些情况下在损失函数中加入 λ ∣ ∣ w ∣ ∣ 2 \lambda||w||^2 λw2 ,都有可能带来效果提升。

2.3 Pre-trained

预训练的架构采用类似下图 c 的架构,下图来自《Exploring the Limits of Language Modeling》。

简单解释下这张图,a 是普通的基于 LSTM 的语言模型,b 是用字符级别的 CNN 来代替原本的输入和 Softmax 层,c 是用 LSTM 层代替 CNN Softmax 层并预测下一个单词。(这里的 CNN Softmax 层区别于 Word2Vec 中的 Softmax,并不是直接预测词汇表,而是计算 z w = h T e w z_w = h^Te_w zw=hTew 的 Logistic 值,其中 h 为单词上下文向量, e w = C N N ( c h a r s w ) e_w=CNN(char \; s_w) ew=CNN(charsw)

作者在论文中指出: ELMo 使用 CNN-BIG-LSTM 的架构进行预训练(这里的 BIG 只是想说多很多 LSTM),并且为了平衡 LM 的复杂度、模型大小和下游任务的计算需求,同时保持纯粹基于字符的输入表示,ELMo 只使用了两层的 LSTM 层,每层 4096 个隐藏单元和 512 维的词向量大小,以及跨一层的残差连接。

而在提取静态字符时,使用两层具有 2048 个卷积过滤器的 highway layer 和一个含有 512 个隐藏单元的 linear projection layer。

这里的 highway layer 由《Training Very Deep Networks》论文中给出,可以简单理解为该网络层只处理一部分输入,而另外一部分直接通过。所以相比于传统的网络,HighwayNet 可以有更深的网络,而试验结果也表明其更容易训练。

相比其他模型只提供一层 Representation 而言,作者提供了三层 Representations:单词原始的 Embedding,第一层双向 LSTM 中对应单词位置的 Embedding (包含句法信息)和第二层双向 LSTM 中对应单词位置的 Embedding(包含语义信息)。

下面这张图看的可能更清楚一点。

在训练了 10 个 epochs 后,前向和后向的平均困惑度(perplexities)分别是 39.7,而 CNN-BIG-LSTM 的困惑度为 30.0。总体看前向和后向困惑度相当,后向稍微低一些。

困惑度(perplexities):如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个。

显然,困惑度越小越好。

完成预训练后可以得到训练好的 Bi-LM 模型和单词的 Embedding 向量。对于下游任务来说可以对 Bi-LM 进行微调,也可以直接使用。

3. Experiments

简单看下实验,下图显示了不同任务下,ELMo 相对 baseline 的提升程度:

正则化系数的影响:

模型训练效率:

4. Conclusion

总结:ELMo 采用预训练的方式得到原始 Embedding 向量和双层 Bi-LSTM 模型,同时 ELMo 会为每个单词提供三个 Embedding 向量并学习具体任务下线性组合后的中间向量,与原始向量拼接后即可为下游任务提供基于语境的 Word Embedding。

第一次看 ELMo 时的想法是:为什么要用 LSTM 而不用类似 Transformer 的结构?毕竟 Transformer 在发表于 2017 年,早于 ELMo;

其次,ELMo 采用的并不是真正的双向 LSTM,而是两个独立的 LSTM 分别训练,并且只是在 Loss Function 中通过简单相加进行约束,只能一定程度上学习到单词两边句子的特征。

当然,虽然这会在 BERT 一文中给出解答。

这里有一个好玩的 Tip,ELMO 是芝麻街里的人物,而 BERT 也是芝麻街里的人物。

5. Reference

  1. 《Deep contextualized word representations》
  2. 《Exploring the Limits of Language Modeling》
  3. 《Training Very Deep Networks》
  4. 《A Review of Deep Contextualized Word Representations (Peters+, 2018)》
  5. 《The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)》
  6. 《NAACL2018 一种新的embedding方法–原理与实验 Deep contextualized word representations (ELMo)》
  7. 《Improving a Sentiment Analyzer using ELMo — Word Embeddings on Steroids》

关注公众号跟踪最新内容:阿泽的学习笔记

【PTM】ELMo:通过预训练语言模型生成词向量相关推荐

  1. 在Keras的Embedding层中使用预训练的word2vec词向量

    文章目录 1 准备工作 1.1 什么是词向量? 1.2 获取词向量 2 转化词向量为keras所需格式 2.1 获取所有词语word和词向量 2.2 构造"词语-词向量"字典 2. ...

  2. 《自然语言处理:基于预训练模型的方法》第七章 预训练语言模型

    预训练模型并不是自然语言处理领域的"首创"技术. 在计算机视觉领域,通常会使用ImageNet进行一次预训练,让模型从海量图像中充分学习如何从图像中提取特征.然后,会根据具体的任务 ...

  3. 预训练语言模型整理(ELMo/GPT/BERT...)

    预训练语言模型整理(ELMo/GPT/BERT...)简介 预训练任务简介# 自回归语言模型# 自编码语言模型 预训练模型的简介与对比 ELMo 细节# ELMo的下游使用# GPT/GPT2# GP ...

  4. EMNLP 2021 | 大道至简:微软提出可生成高质量文本表示的预训练语言模型

    ©作者 | 常馨 学校 | 北京邮电大学硕士生 研究方向 | NLP.信息检索 Abstract 基于自动编码器的语言模型在 Dense Retrieval(DR)中受到越来越多的关注,因为其训练编码 ...

  5. 论文浅尝 | 探索将预训练语言模型用于事件抽取和事件生成

    论文笔记整理:郝凯龙,南京大学硕士 链接:https://www.aclweb.org/anthology/P19-1522.pdf 动机 传统的 ACE 事件抽取任务依赖于人工标注的数据,耗费大量的 ...

  6. 乐府 ——预训练语言模型在诗词对联生成中的应用

    公众号 系统之神与我同在 背景简介 中文传统诗歌对联生成: 在格律.平仄.押韵方面具有严格的要求 常规的诗歌对联生成模型加入规则对格式进行限制 GPT GPT(包括GPT-2.GPT-3)是由Open ...

  7. 预训练语言模型(四):ELMo模型

    目录 ELMo模型 模型结构 公式 参考一个很全的总结: 预训练语言模型的前世今生 - 从Word Embedding到BERT ELMo也参考了这个: [NLP-13]ELMo模型(Embeddin ...

  8. 赠书 | 一文了解预训练语言模型

    来源 | 博文视点 头图 | 下载于视觉中国 近年来,在深度学习和大数据的支撑下,自然语言处理技术迅猛发展.而预训练语言模型把自然语言处理带入了一个新的阶段,也得到了工业界的广泛关注. 通过大数据预训 ...

  9. 【赠书】如何掌握好自然语言处理中的预训练语言模型?你需要读这本书

    ‍‍ 预训练语言模型属于人工智能领域中自然语言处理领域的一个细分,是自然语言处理领域的重要突破,得到了越来越广泛的关注,相关研究者和从业人员在实际应用的过程中,亟需一本理论翔实.代码细节充分的参考书. ...

最新文章

  1. 红帽linux6.0安装教程,第 14 章 引导安装程序
  2. 求最大公约数的设计与C语言实现
  3. swoole mysql 并发_Swoole4 如何打造高并发的PHP7协程Mysql连接池?
  4. JavaScript之event事件
  5. 2.8 GloVe 词向量
  6. OpenAI公布强化学习新算法,可控制复杂机器人
  7. c语言显示cpuid_ccpuid:CPUID信息模块。范例:显示所有的CPUID信息
  8. iOS蓝牙4.0(BLE)-LightBlue与cc2540开发板通信
  9. 一个Excel题库转Word的小经验
  10. 解决IE浏览器无法显示VUE项目的方法
  11. Oracle 19c 新特性:ANY_VALUE 函数和 LISTAGG 的增强
  12. 【系统集成项目管理工程师】项目资源管理
  13. 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...
  14. 【搬运】电源管理芯片引脚定义
  15. Android Studio 微信分享功能(包括可以分享到朋友圈,分享到朋友)
  16. 有哪些巧妙说服对方的说话技巧
  17. Nginx系列--upstream模块的使用
  18. 给网站加上一键分享功能
  19. 关于三通道彩色图像的存储方式理解
  20. 国际电商网站APP开发-国际电商网站,跨境方案

热门文章

  1. npm install安装npm ERR! enoent undefined ls-remote -h -t ssh://git@github.com/sohee-lee7/Squire.git
  2. 三大电信运营商携号转网数据_携号转网3个月后,联通流失了27.7万户用户,电信净携入43.9万户...
  3. lazarus研究--基础数据类型
  4. c语言转换成php,PHP学习笔记!(转)
  5. C++ 内存池介绍与经典内存池的实现
  6. 哈夫曼树带权路径长度
  7. java 浏览器 安全_使用 IE 浏览器浏览网页时,出于安全方面的考虑,需要禁止执行 Java Script ,可以在 IE 中 ( )。...
  8. 知识蒸馏DEiT算法实战:使用RegNet蒸馏DEiT模型
  9. 《面向对象程序设计——Java语言·翁恺》第3周编程题 查找里程
  10. 推荐15款创建漂亮幻灯片的 jQuery 插件