预训练模型一:ELMO

词向量-ELMo介绍

Deep contextualized word representations获得了NAACL 2018的outstanding paper award,其方法有很大的启发意义,本文则是对其做了一个简要梳理。

Motivation

  • 预训练的word representation在NLP任务中表现出了很好的性能,已经是很多NLP任务不可或缺的一部分,论文作者认为一个好的word representation需要能建模以下两部分信息:
    • 单词的特征,如语义,语法
    • 单词在不同语境下的变化,即一词多义
  • 之前很多工作的word representation是固定的,如word2vec/glove等word representation对于一个词,其向量是固定的,无法很好的处理一词多义的情况

例如:
在这里插入图片描述
"bank"在不同的句子中有着不同的语义,所以需要我们对每个token都要赋予一个reprsentation vector。

Introduction

基于上述原因,论文作者提出了Deep contextualized word representation来解决这个问题,算法大致过程如下:

  • 在大规模语料中利用bidirectional LSTM模型训练语言模型(language model,非监督学习),ELMo(Embedding from language model)也由此得名。从而对于同一个type"bank",学习到了不同的token表示。
  • 为了应用到下游任务,利用下游任务的语料库(无需label)对预训练的语言模型进行微调(Fine-Tuning)或者固定ELMO的权重(Feature-based method),然后再利用下游任务有标注的数据进行supervised learning。

简单来说,ELMo模型是从深层的双向语言模型(deep bidirectional language model)中的内部状态(internal state)学习而来的

相较于之前的工作,ELMo的特点有:

  • Embedding是“deep”的,这体现在ELMo是biLM(bi-Language model)内部所有层的综合,这样可以有充分的信息来建模word representation:
    • Higher-level LSTM states可以捕获上下文相关的语义信息,不用修改就可以用来做词义消歧
    • Lower-level LSTMstates 可以捕获语法相关的信息,可以用作词性标注任务
      ELMo综合了上述信息,而之前的工作只利用了top LSTM layer的信息
  • 其词向量是动态的,即根据当前上下文环境来产生当前词向量,而不是一个固定的外部词向量

以这种方式组合内部状态可以实现非常丰富的单词表示。通过使用内在评估,我们表明,更高层次的LSTM状态捕获了单词意义的上下文相关方面(例如,它们可以在不需要修改的情况下被用来很好地执行有监督的词义消歧任务),而更低级的状态模型中的语法方面(例如,它们可以用于进行词性标记)。同时暴露所有这些信号是高度有益的,允许学习到的模型选择对每个结束任务最有用的半监督类型
在这里插入图片描述

Bidirectional language model

语言模型的双向体现在对句子的建模:给定一个N个token的句子,\(\left(t_{1}, t_{2}, \ldots, t_{N}\right)\)

  • 前向语言模型:从历史信息预测下一个词,即从给定的历史信息\(\left(t_{1}, \ldots, t_{k-1}\right)\)建模下一个token \(t_k\)的概率

    \[p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right) \]

    对于一个L层的LSTM,设其输入是\(x_k^{LM}\)​ (token embedding),每一层都会输出一个context-dependent representation \(\overrightarrow {h}_{k, j}^{L M}\)​,LSTM的最后一层输出为\(\overrightarrow {h}_{k, L}^{L M}\)​,该输出会在Softmax layer被用来预测下一个token \(t_{k+1}\)

  • 后向语言模型:从未来信息预测上一个词,即从给定的未来\(\left(t_{k+1}, \ldots, t_{N}\right)\)建模上一个token \(t_k\)的概率

    \[p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{k+1}, t_{k+2}, \ldots, t_{N}\right) \]

    同样地,对于一个L层的LSTM,设其输入是\(x_k^{LM}\)​ (token embedding),每一层都会输出一个context-dependent representation \(\overleftarrow {h}_{k, j}^{LM}\),LSTM的最后一层输出为\(\overleftarrow {h}_{k, L}^{L M}\),该输出会在Softmax layer被用来预测上一个token \(t_{k-1}\)

双向语言模型是前向、后向的一个综合,通过两个方向的对数极大似然估计来完成:

\[\begin{array}{l}{\sum_{k=1}^{N}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \Theta_{x}, \vec{\Theta}_{L S T M}, \Theta_{s}\right)\right.}\\{\left.\quad+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow \Theta_{L S T M}, \Theta_{s}\right)\right.} \end{array} \]

其中:

  • \(\Theta_{x}\)是token embedding
  • \(\Theta_{s}\)代表softmax layer的参数

biLM利用了biLSTM,biLSTM在前向和后向两个方向上共享了部分权重

ELMo

对于一个token,ELMo会计算2L+12L+1个representation(输入的一个token embedding和前向、后向的2L个representation):

\[\begin{aligned} \pmb R_k&=\{x_k,\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \overleftarrow{\mathbf{h}}_{k, j}^{L M} |j=1,2,...,L\} \\ &=\{h_{k,j}|j=0,1,...,L\} \end{aligned} \]

其中:

  • \(\mathbf{h}_{k, 0}^{L M}\)是token layer
  • \(\mathbf{h}_{k, j}^{L M}=\left[\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \overleftarrow{\mathbf{h}}_{k, j}^{L M}\right],\) 代表biLSTM layer

在下游任务中,ELMo将\(R\)的所有层压缩成一个向量\(\mathbf{E L M o k}=E\left(R_{k} ; \Theta_{e}\right)\)(在最简单的情况下,也可以只使用最后一层\(E\left(R_{k}\right)=\mathbf{h}_{k, L}^{L M}\)

\[\mathbf{E L M o}_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k, j}^{L M} \]

其中:

  • \(s_{task}\)是softmax正则化权重参数
  • \(\gamma^{\text {task}}\)是一个标量,可以让下游任务来放缩ELMo向量

从上述计算过程可以看出,ELMo是biLM多层输出的线性组合。

大致图解:
在这里插入图片描述
论文中结果:
在这里插入图片描述
总之,这些实验证实了biLM中的不同层代表了不同类型的信息,并解释了为什么包括所有biLM层对于下游任务的最高性能很重要。

在supervised NLP tasks中使用ELMo

给定一个\(N\)个token的句子,\(\left(t_{1}, t_{2}, \ldots, t_{N}\right)\),supervised NLP model处理的标准过程的输入是context-independent token词向量\(x_k\)(例如,One-Hot Encoding),加入ElMo有两种方式:

  1. 直接将ELMo词向量\(ELMo_k\)​和普通词向量\(x_k\)拼接得到\(\left[\mathbf{x}_{k} ; \mathbf{E L M o}_{k}^{t a s k}\right]\)作为model输入
  2. 将ELMo词向量\(ELMo_k\)和隐藏层输出\(h_k\)进行拼接得到\(\left[\mathbf{h}_{k} ; \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}\right]\)

Result

在这里插入图片描述
此外,ELMo增强的模型比没有ELMo的模型更有效地使用更小的训练集。图1比较了有和没有ELMo的基线模型的性能,因为整个训练集的百分比从0.1%到100%不等。对于较小的训练集,使用ELMo的改进是最大的,并且显著减少了达到给定性能水平所需的训练数据量。在SRL的情况下,具有1%训练集的ELMo模型与具有10%训练集的基线模型具有大约相同的F1。

如何在代码中使用ELMo

使用ELMo预训练模型

pip install allennlp

代码太多,还未完全看完......

Reference

[1]Deep contextualized word representations
[2]李宏毅.深度学习
[3]ELMO介绍

posted @ 2022-02-02 22:46  为红颜  阅读(682)  评论(0编辑  收藏  举报