最近在家听贪心学院的NLP直播课。都是比较基础的内容。放到博客上作为NLP 课程的简单的梳理。
本节课程主要讲解的是词向量和Elmo。核心是Elmo,词向量是基础知识点。
Elmo 是2018年提出的论文 《Deep contextualized word representtations》,在这篇论文中提出了很重要的思想Elmo,Elmo 是一种基于特征的语言模型,用预训练的语言模型,生成更好的特征。
Elmo是一种新型深度语境化词表征,可对词进行复杂特征(如句法和语义)和词在语言语境中的变化进行建模(即对多义词进行建模)。我们的词向量是深度双向语言模型biLM内部状态的函数,在一个大型文本语料库中预训练而成。
Elmo的主要做法是先训练一个完整的语言模型,再用这个语言模型去处理需要训练的文本,生成相应的词向量,所以在文中一直强调Elmo的模型对同一个字的不同句子中能生成不同的词向量。
在讲ELmo之前 我们先回顾一下词向量和语言模型,因为ELmo的提出 就是因为就语言模型的词向量 有一些缺点(主要是无法解决一词多意的问题),所以提出双向-深度-LSTM 的Elmo模型。这里的‘双向’是一个拼接而已,不是真正意义上的双向,所以XLNET 有permutation的改进实现真正的根据上下文内容的双向, 这里的‘深度’ 是横向和纵向的深度,因为深度 每层可以学习到不同的点,并且越深的层学的东西越具体。
1.词向量与语言模型
NLU 文本的量化表示方式
独热编码:能否表示单词之间的相似度? — 不能。因为通过任何一种方式(余弦相似度等)无法计算两两向量的相似度。
所以我们有了 词向量 (分布式表示的词向量)
独热编码: 稀疏向量,并且都是正交的。
词向量:稠密向量,分布式词向量。
类似的单词 都是聚集在一起的。当我们提取出某些词向量时,我们可以通过可视化来呈现出他们的关系。 可视化 T-SNE (sklearn里面有)这是一种降维的算法(针对词向量一般用TSNE),其他降维算法有PCA 等。
语言模型的目标是最大的话 一句话的 概率的。
基于前面几个单词预测下一个单词 这就是语言模型。
语言模型的基础:链式法则,马尔科夫,N元组,平滑方式,困惑度。
Global 方法:全局方法
Local 方法: 局部方法
基于LM的训练:基于语言模型的训练
基于非LM的训练:基于非语言模型的训练
1 Global vs Local
Global: 优势:全局. 缺点:计算量大,有新的文本的时候 需要更新。
Local: Skip Gram
- 基于LM vs 非基于LM
对于Elmo: 语言模型-NNLM-层次表示-HMM-RNN-LSTM-BiLSTM-DeepBiLSTM-ELMO
2.学习不同语境下的语义表示
基于Distributional Hypothesis
– Skip-Gram
句子: 词向量 训练 方法 有 两种
单词: W1 W2 W3 W4 W5
windows = 1
假设已知 w2, 预测出 w1 和 w3
目标函数:Maximize P(w2|w1)P(w1|w2)P(w3|w2)P(w2…)– CBOW:
通过 w1 和 w3 预测 w2
目标函数: Maximize P(w2| w1,w3) P(w3| w2,w4)…Language Model + HMM
– NNLM:
目标函数: Maximize P(w2|w1)P(w3|w2)
上面句子里面的Back 是不同的意思。
理解词向量 在不同语境下的含义 就是我们的目标。所以有了Elmo,Bert 等模型。
正确答案是 ABCD。
A是一种比较直观的 可行方案,每个单词多意,那么可以对应多个词向量。当然方法可行,不过具体执行问题有可能也很懂。
B和C是相关的。example: I back my car, I heart my back. 首先对back计算一个基准向量 H_back 一对一的,如何计算2个back这个句子里面的含义分别是什么? H_back + ▲(基于上下文的偏移)3.基于LSTM 的词向量学习
- 基于LSTM 作为基石
- 深度,层次
LSTM 来源于RNN, 因为RNN有些梯度爆咋的问题,所以提出了LSTM。
目标函数 是一个 语言模型,输出层 通过softmax 获取 期望输出向量,然后 期望输出 和实际值(热独编码) 计算交叉熵,反向传播。
下面是两个独立的 LSTM。不是一个真正的双向LSTM。
为什么不是真正的双向 是因为只是把前向和反向 拼接起来的结果,不是完整意义上的双向。 所以后面Permutation(XLNET) 可以认为是真正的双向4.深度学习中的层次表示以及Deep BI-LSTM
深度 : 可以从纵向和横向上深度。
层次表示 可以看出 每层学出来的结果是不一样的。
这个就是Deep-bi-LSTM基于LM方式来训练。
5.ELMO模型
Elmo 使用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。
语言模型的双向体现在对句子的建模:给定一个N个token的句子, t1,t2,t3...tN t_1,t_2,t_3...t_N" role="presentation">t1,t2,t3...tNt1,t2,t3...tN t_1,t_2,t_3...t_Nt1,t2,t3...tN。前向语言模型:从历史信息预测下一个词,即从给定的历史信息$(t_1,…,t_{k-1}) $ 建模下一个token 预测 tk t_k" role="presentation">tktk t_ktk的概率 (这是前向LSTM)
对于一个L层的LSTM, 设其输入是xkLM x^{LM}_k" role="presentation">xLMkxkLM x^{LM}kxkLM(token embedding)每一层都会输出一个context-dependent representation (h⃗k,jLM \vec{h}^{LM}_{k,j}" role="presentation">h⃗ LMk,jh⃗k,jLM \vec{h}^{LM}{k,j}hk,jLM), LSTM的最后一层输出为(h⃗k,LLM \vec{h}^{LM}_{k,L}" role="presentation">h⃗ LMk,Lh⃗k,LLM \vec{h}^{LM}{k,L}hk,LLM),该输出会在Softmax layer被用来预测下一个token tk+1 t_{k+1}" role="presentation">tk+1tk+1 t_{k+1}tk+1后向语言模型:从未来信息预测上一个词,即从给定的未来(tk+1,...tN t_{k+1},...t_N" role="presentation">tk+1,...tNtk+1,...tN t_{k+1},...t_Ntk+1,...tN)建模上一个token tk t_k" role="presentation">tktk t_ktk的概率(反向LSTM)
对于一个L层的LSTM, 设其输入是xkLM x^{LM}_k" role="presentation">xLMkxkLM x^{LM}kxkLM(token embedding)每一层都会输出一个context-dependent representation 反向的(h⃗k,jLM \vec{h}^{LM}_{k,j}" role="presentation">h⃗ LMk,jh⃗k,jLM \vec{h}^{LM}{k,j}hk,jLM), LSTM的最后一层输出为反向的(h⃗k,LLM \vec{h}^{LM}_{k,L}" role="presentation">h⃗ LMk,Lh⃗k,LLM \vec{h}^{LM}{k,L}hk,LLM),该输出会在Softmax layer被用来预测下一个token tk−1 t_{k-1}" role="presentation">tk−1tk−1 t_{k-1}tk−1
双向语言模型是前向、后向的一个综合,通过两个方向的对数极大似然估计来完成:
其中:- Θx \Theta_{x}" role="presentation">ΘxΘx \Theta_{x}Θx是token embedding
- Θs \Theta_{s}" role="presentation">ΘsΘs \Theta_{s}Θs代表softmax layer的参数
biLM利用了biLSTM,biLSTM在前向和后向两个方向上共享了部分权重
对于一个token,ELMo会计算2L+1 个representation(输入的一个token embedding和前向、后向的2L个representation):
其中:
在下游任务中,ELMo将R的所有层压缩成一个向量ELMok=E(Rk;Θe) ELMo_k=E(R_k;Θe)" role="presentation">ELMok=E(Rk;Θe)ELMok=E(Rk;Θe) ELMo_k=E(R_k;Θe)ELMok=E(Rk;Θe) ,在最简单的情况下,也可以只使用最后一层E(Rk)=hk,LLM E(R_k)=h^{LM}_{k,L}" role="presentation">E(Rk)=hLMk,LE(Rk)=hk,LLM E(R_k)=h^{LM}{k,L}E(Rk)=hk,LLM
其中
可以看出,ELMo是biLM多层输出的线性组合。在监督NLP任务中使用Elmo
在supervised NLP tasks中使用ELMo, 给定N个token的句子,supervised NLP处理的标准过程的输入是context-independent token词向量xk x_k" role="presentation">xkxk x_kxk,加入ElMo有两种方式:
- 直接将ELMo词向量ELMok ELMo_k" role="presentation">ELMokELMok ELMo_kELMok和普通词向量xk x_k" role="presentation">xkxk x_kxk 拼接得到[xk;ELMoktask] [x_k; ELMo_k^{task}]" role="presentation">[xk;ELMotaskk][xk;ELMoktask] [x_k; ELMo_k^{task}][xk;ELMoktask],作为模型的输入。
- 将ELMo词向量ELMok ELMo_k" role="presentation">ELMokELMok ELMo_kELMok 和隐藏层输出hk h_k" role="presentation">hkhk h_khk 进行拼接得到[hk;ELMoktask] [h_k; ELMo_k^{task}]" role="presentation">[hk;ELMotaskk][hk;ELMoktask] [h_k; ELMo_k^{task}][hk;ELMoktask]
(一个单词在语境下的表示 就是所有层的加权平均。
在预训练好这个语言模型之后,ELMo就是根据公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为ELMo。然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。)6.总结
- ELMo的假设前提一个词的词向量不应该是固定的,所以在一词多意方面ELMo的效果一定比word2vec要好。
- word2vec的学习词向量的过程是通过中心词的上下窗口去学习,学习的范围太小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,而后再通过语言模型生成的词向量就相当于基于整个语料库学习的词向量,更加准确代表一个词的意思。
- ELMo还有一个优势,就是它建立语言模型的时候,可以运用非任务的超大语料库去学习,一旦学习好了,可以平行的运用到相似问题。
Bert 是 AutoEncoder 通过上下文来预测中间mask单词,损失函数是ADE的损失函数,不是交叉熵损失。Bert 模型不是基于语言模型的,只是基于ADE。
Elmo 是基于语言模型的。