前面介绍了Bilstm-CRF和NCRF++模型用于命名实体识别,但是这两个模型都是基于标注语料进行训练,由于标注语料一般都比较少,而且标注成本很高,因此,一般训练出来的模型泛化性会相对比较差。近两年,很多模型开始通过在大量未标注的语料上训练语言模型,然后通过Fine-tuning或者Feature-base的形式将训练好的模型迁移到具体的NLP任务中,很好地提高了模型的泛化能力,这里面的代表模型有GPT、BERT、XLNet等,但是这些模型都过于庞大和复杂,因此,在没有足够的算力情况下,很多人都没法模仿。
本文将介绍2018年提出来的一个新模型——CSE(Contextual String Embeddings),该模型同样采用预训练语言模型,然后基于Feature-base的形式将语言模型迁移到具体的标注任务中,比如NER、词性标注等,该模型的结构非常简单,比ELMo还简单,但是其效果却比BERT还要好。
CSE预训练的语言模型非常简单,作者采用的是LSTM的结构,对于一个字符序列 ( x 0 , x 1 , … , x T ) = : x 0 : T \left(\mathbf{x}_{0}, \mathbf{x}_{1}, \dots, \mathbf{x}_{T}\right)=: \mathbf{x}_{0 : T} (x0,x1,…,xT)=:x0:T,在每个时间步,预测下一个字符的条件概率 P ( x t ∣ x 0 , … , x t − 1 ) P\left(\mathbf{x}_{t} | \mathbf{x}_{0}, \ldots, \mathbf{x}_{t-1}\right) P(xt∣x0,…,xt−1),并对每个时间步的预测概率进行累积,即为语言模型的目标函数:
P ( x 0 : T ) = ∏ t = 0 T P ( x t ∣ x 0 : t − 1 ) P\left(\mathbf{x}_{0 : T}\right)=\prod_{t=0}^{T} P\left(\mathbf{x}_{t} | \mathbf{x}_{0 : t-1}\right) P(x0:T)=t=0∏TP(xt∣x0:t−1)
在LSTM中,每个时间步的条件概率 P ( x t ∣ x 0 : t − 1 ) P\left(\mathbf{x}_{t} | \mathbf{x}_{0 : t-1}\right) P(xt∣x0:t−1)可以用其隐藏状态的向量进行近似计算如下:
P ( x t ∣ x 0 : t − 1 ) ≈ ∏ t = 0 T P ( x t ∣ h t ; θ ) P\left(\mathbf{x}_{t} | \mathbf{x}_{0 : t-1}\right) \approx \prod_{t=0}^{T} P\left(\mathbf{x}_{t} | \mathbf{h}_{t} ; \theta\right) P(xt∣x0:t−1)≈t=0∏TP(xt∣ht;θ)
其中, θ \theta θ表示模型中的参数, h t h_t ht表示每个时间步的隐藏状态向量,在LSTM层后面,再接一层带有softmax的全连接层即可得到对应的预测概率:
P ( x t ∣ h t ; V ) = softmax ( V h t + b ) = exp ( V h t + b ) ∥ exp ( V h t + b ) ∥ 1 \begin{aligned} P\left(\mathbf{x}_{t} | \mathbf{h}_{t} ; \mathbf{V}\right) &=\operatorname{softmax}\left(\mathbf{V h}_{t}+\mathbf{b}\right) \\ &=\frac{\exp \left(\mathbf{V h}_{t}+\mathbf{b}\right)}{\left\|\exp \left(\mathbf{V h}_{t}+\mathbf{b}\right)\right\|_{1}} \end{aligned} P(xt∣ht;V)=softmax(Vht+b)=∥exp(Vht+b)∥1exp(Vht+b)
其中, V V V和 b b b分别表示全连接层的权重矩阵和偏置。
作者在实验中其实训练了两个LSTM语言模型,一个前向语言模型和后向语言模型,不过具体是分开训练还是像ELMo模型一样合并训练,作者在论文中没有具体提及,笔者理解的是分开进行训练,后向语言模型的目标函数如下:
P b ( x t ∣ x t + 1 : T ) ≈ ∏ t = 0 T P b ( x t ∣ h t b , θ ) h t b = f h b ( x t + 1 , h t + 1 b , c t + 1 b ; θ ) c t b = f c b ( x t + 1 , h t + 1 b , c t + 1 b ; θ ) \begin{aligned} P^{b}\left(\mathbf{x}_{t} | \mathbf{x}_{t+1 : T}\right) & \approx \prod_{t=0}^{T} P^{b}\left(\mathbf{x}_{t} | \mathbf{h}_{t}^{b}, \theta\right) \\ \mathbf{h}_{t}^{b} &=f_{\mathbf{h}}^{b}\left(\mathbf{x}_{t+1}, \mathbf{h}_{t+1}^{b}, \mathbf{c}_{t+1}^{b} ; \theta\right) \\ \mathbf{c}_{t}^{b} &=f_{\mathbf{c}}^{b}\left(\mathbf{x}_{t+1}, \mathbf{h}_{t+1}^{b}, \mathbf{c}_{t+1}^{b} ; \theta\right) \end{aligned} Pb(xt∣xt+1:T)htbctb≈t=0∏TPb(xt∣htb,θ)=fhb(xt+1,ht+1b,ct+1b;θ)=fcb(xt+1,ht+1b,ct+1b;θ)
为了便于区分,在后文用 h t f : = h t , c t f : = c t \mathbf{h}_{t}^{f} :=\mathbf{h}_{t}, \mathbf{c}_{t}^{f} :=\mathbf{c}_{t} htf:=ht,ctf:=ct表示前向语言模型每个时间步的隐藏状态向量和输出向量。
在预训练完语言模型后,在具体的NLP标注任务,作者将整个语句输入到前向和后向语言模型中,然后对于句子中的每个词汇,作者提取前向语言模型中该词汇最后一个字符后面的隐藏状态向量,因为该隐藏状态向量包含了该词汇和其前文的语义信息,另外,提取后向语言模型中该词汇第一个字符前面的隐藏状态向量,因为该向量包含了该词汇和其后文的语义信息,然后将这两个向量进行拼接作为词汇的向量表示,具体如下所示:
w i C h a r L M : = [ h t i + 1 − 1 f h t i − 1 b ] \mathbf{w}_{i}^{C h a r L M} :=\left[\begin{array}{c}{\mathbf{h}_{t_{i+1}-1}^{f}} \\ {\mathbf{h}_{t_{i}-1}^{b}}\end{array}\right] wiCharLM:=[hti+1−1fhti−1b]
其中, t 0 , t 1 , … , t n t_{0}, t_{1}, \ldots, t_{n} t0,t1,…,tn分别表示句子中每个词汇第一个字符的位置。从上式可知,每个词向量的向量表示不仅包含词汇自身的信息,也包含了其上下文的语义信息,因此,可以解决词汇在不同语境中一词多义的问题。另外,由于CSE的基于字符级别训练的语言模型,因此,也可以解决词汇拼写错误、前缀、后缀等问题。
作者在实验中也发现,将CSE提取到的词汇向量与其他经典的词向量模型比如word2vec、GloVe等得到的词向量进行拼接,再传入到下游的NLP任务中,可以有效提高模型的准确率,如:
W i = [ W i C h a r L M W i G l o V e ] \mathbf{W}_{i}=\left[\begin{array}{c}{\mathbf{W}_{i}^{C h a r} L M} \\ {\mathbf{W}_{i}^{G l o Ve} }\end{array}\right] Wi=[WiCharLMWiGloVe]
其中, W i G l o V e W_{i}^{G l o Ve} WiGloVe表示通过GloVe得到的词向量。
最后,作者在序列标注中采用的模型还是Bilstm-CRF模型,并且发现在几个序列标注任务中都得到最好的成绩,甚至比BERT模型的精度还高。模型的结构图如下图所示:
关于CSE模型的代码实现,作者已经开源其代码,因此,不再重复造轮子了。
可以发现,其实CSE模型跟ELMo模型非常相似,只是ELMo模型在下游NLP任务中采用的是多各层的输出向量进行线性加权,而CSE的做法则更简单,直接对前向和后向语言模型的向量进行拼接,但是CSE的语言模型是基于字符级别的,因此,可以比较灵活地用于词汇的向量表示,这可能也是其效果比较好的原因。CSE与当前主流的BERT、XLNet相比,去效果一点都不差,还更加简单,作者只用了一块GPU训练了5天,效果就可以达到这么好,甚至发现把下游任务中的Bilstm层去掉,都不会对结果造成太多的影响,也就是说,直接采用双向语言模型在字符级别其实就可以学习到每个词汇比较好的向量表示,笔者觉得这种大道至简的方法也许是NLP一种新的出路吧。