参考链接
论文链接:https://arxiv.org/pdf/1802.05365v2.pdf
代码链接:https://github.com/allenai/bilm-tf
一、模型架构:ELMo: Embeddings from Language Models
- 与最广泛使用的词嵌入不同,ELMo词嵌入是整个输入句子的函数。这个函数就像是一个神经网络内部状态的线性函数,该网络是一个带有字符卷积层的两层的双向语言模型(biLM),该网络在大规模的预料库被训练。
1、双向语言模型:biLM=Bidirectional language models
- 给定长度为N的序列 ( t 1 , t 2 , … , t N ) (t_1,t_2,…,t_N) (t1,t2,…,tN),则语言模型计算序列的概率,计算公如下: 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 )=∏_{k=1}^{N}p(t_k |t_{k-1},t_{k-2},…,t_N) P(t1,t2,…,tN)=k=1∏Np(tk∣tk−1,tk−2,…,tN)
- 现在最先进的语言模型:通过词向量矩阵或字符级CNN计算一个上下文无关的词向量 x k L M x_k^{LM} xkLM,然后将这些词向量传递给L层的前向LSTM, h → k , j L M \overrightarrow{h}_{k,j}^{LM } hk,jLM表示LSTM第j层在位置k的输出,最后使用 h → k , L L M \overrightarrow{h}_{k,L}^{LM } hk,LLM加上softmax层来预测下一个词 t k + 1 t_{k+1} tk+1
- 反向LSTM语言模型的计算公式如下: P ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , … , t 0 ) P(t_1,t_2,…,t_N )=∏_{k=1}^Np(t_k |t_{k+1},t_{k+2},…,t_0) P(t1,t2,…,tN)=k=1∏Np(tk∣tk+1,tk+2,…,t0) h ← k , j L M \overleftarrow{h}_{k,j}^{LM} hk,jLM表示:LSTM第 j j j层在位置 k k k的输出
- 双向语言模型(biLM)结合上面两个方向LSTM构成,它最大化下面公式: ∑ k = 1 N ( l o g p ( t k │ t 1 , … , t k − 1 ; Θ x , ( Θ → L s t m , Θ s ) + l o g p ( t k │ t k + 1 , … , t N ; Θ x , ( Θ ← L s t m , Θ s ) ) ∑_{k=1}^N(logp(t_k│t_1,…,t_{k-1};Θ_x,(\overrightarrow{Θ}_{Lstm},Θ_s )+logp(t_k│t_{k+1},…,t_{N};Θ_x,(\overleftarrow{Θ}_{Lstm} ,Θ_s ) ) k=1∑N(logp(tk│t1,…,tk−1;Θx,(ΘLstm,Θs)+logp(tk│tk+1,…,tN;Θx,(ΘLstm,Θs))词向量层的参数 Θ x Θ_x Θx和softmax层参数 Θ s Θ_s Θs在前向和后向语言模型中是共享,但前向后向LSTM参数是分开的
2、ELMo模型架构
- ELMo:是一个biLM中间层表示(输出)的一种特殊的组合。
- 对每一个词 t k , L t_k,L tk,L层的biLM都会生成 L + 1 L+1 L+1个表示,+1是词向量层: R k = { x k L M , h → k , j L M , h ← k , j L M │ j = 1 , 2 , … , L } = { h k , j L M │ j = 0 , 1 , . . , L } h k , j L M = [ h → k , j L M , h ← k , j L M ] R_k=\{x_k^{LM},\overrightarrow{h}_{k,j}^{LM}, \overleftarrow{h}_{k,j}^{LM}│j=1,2,…,L\}=\{h_{k,j}^{LM}│j=0,1,..,L\} \\ h_{k,j}^{LM}=[\overrightarrow{h}_{k,j}^{LM}, \overleftarrow{h}_{k,j}^{LM}] Rk={xkLM,hk,jLM,hk,jLM│j=1,2,…,L}={hk,jLM│j=0,1,..,L}hk,jLM=[hk,jLM,hk,jLM]
- 为了兼容下游模型,ELMo线性组合所有层的R为一个向量: E L M o k = E ( R k ; Θ e ) ELMo_k=E(R_k;Θ_e) ELMok=E(Rk;Θe),其中最常用的的合并方式就是只选择最高层: E L M o k = h k , L L M ELMo_k=h_{k,L}^{LM} ELMok=hk,LLM。一般情况: E L M o k t a s k = E ( R k ; Θ e ) = γ t a s k ∑ j = 0 L s j t a s k h k , j L M ELMo_k^{task}=E(R_k;Θ_e )=γ^{task} ∑_{j=0}^Ls_j^{task} h_{k,j}^{LM} ELMoktask=E(Rk;Θe)=γtaskj=0∑Lsjtaskhk,jLM其中: γ t a s k γ^{task} γtask是放缩常量; s j t a s k s_j^{task} sjtask是softmax的正则化权重
3、Using biLMs for supervised NLP tasks
- 给定一个预训练好的biLM模型与一个特殊任务的模型架构,使用biLM来提升目标语言模型是一个简单的过程:
- 首先我们运行biLM模型并为每个词记录所有层的输出
- 然后让目标模型学习一个这些输出的线性组合
- 首先我们固定住biLM的参数权重,目标任务学习一个线性组合: E L M o k t a s k = E ( R k ; Θ e ) = γ t a s k ∑ j = 0 L s j t a s k h k , j L M ELMo_k^{task}=E(R_k;Θ_e )=γ^{task} ∑_{j=0}^Ls_j^{task} h_{k,j}^{LM} ELMoktask=E(Rk;Θe)=γtaskj=0∑Lsjtaskhk,jLM然后将上下文无关的词向量 x k x_{k} xk与 E L M o k t a s k ELMo_k^{task} ELMoktask进行拼接,得到 [ x k , E L M o k t a s k ] [x_k,ELMo_k^{task}] [xk,ELMoktask],再将其输入目标模型架构中去。
- 对于一些任务(如SNLI,SquAD)我们发现:再让目标模型再学习一个biLM输出的线性组合将并将其与目标模型RNN的输出合并 [ h k , E L M o k t a s k ] [h_k,ELMo_k^{task}] [hk,ELMoktask]可改善模型性能。同时我们发现:在ELMo模型中加入适当的dropout以及添加权重的 L 2 ( λ ∣ ( ∣ W ∣ ) ∣ 2 2 ) L2(λ|(|W|)|_2^2) L2(λ∣(∣W∣)∣22)正则到loss中可以提升模型性能。并且这里的 L 2 L2 L2项的系数 λ λ λ越大,越有取各层平均值的意思,越小越可以发挥各个层之间的不同带来的效果。但是并不是说,越小越好。
4、Pre-trained bidirectional language model architecture
- 两层双向LSTM的语言模型如下:
- ELMo需要再两层之间添加残差连接:有助于高层模型的训练:
- 对于一般的语言模型再输入层通常是通过查找embeding矩阵来得到词向量然后输入到模型的最底层。但是再ELMo模型中并不是这样:
- 第一步:我们首先使用字符嵌入(haracter embeddings)表示每个词。
- 第二步:然后将这个词表示输入到一个含有一定过滤器的CNN网络中后再经过一个最大池化层。
- 第三步:再经过2-layer highway network,再输入到模型
- 这样构建上下文无关的原始的词向量的好处:
- 使用字符向量可以让我们了解词级向量可能遗漏的词的形态特征。
- 使用字符向量确保了我们即使对于词汇表以外单词也能形成有效的表示,通过字符的拼接。
- 使用卷积层可以让我们获得构建更强大词向量的n-gram特征。
- highway network layers允许通过输入更平滑的信息。
- 训练好的ELMo然后为特定任务生成词embeding呢
5、理解
- ELMo不是对每个单词使用固定词向量,而是在为句子中的每个单词分配词向量之前查看整个句子的上下文信息,即根据句子的实际情况为词分配词向量。
- ELMo生成的词向量与一般的上下文无关的固定的词向量之间的关系如下图:
- 一般语言模型任务(预测下一个词)如下:
- ELMo实际上更进一步,训练双向LSTM模型:
- ELMo通过以某种方式将隐藏状态和初始词向量组合在一起来提出语境化的词向量,组合的方式是拼接再加权求和。
- ELMo使用预先训练的语言模型来产生词向量,而不是依赖于映射表产生词向量。
- ELMo使用字符级CNN来计算那些被输入到biLM第一层的原始词向量