CS224N(13)-词向量的上下文表征及预训练

2019-04-30  本文已影响0人  Evermemo

Contextual Word Representations and Pretraining

一、Word Representations

在2018年之前,我们使用的词向量表征技术主要有三个:Word2Vec、Glove、FastText。但是这三个方法都普遍存在在一些问题,就是无法解决一次多义的问题,即对于同一个词无论上下文的单词是否相同,训练出来的词向量都是一样的。

通常我们训练词向量的时候,首先会初始化所有的词向量,并且在训练过程中不断地改变这些向量的值,需要注意的是训练的目标是我们自己定义的任务,而词向量仅仅是副产物而已。

当我们手中的语料不足时训练出来的词向量效果不会很理想,这是用通常会使用他人已经训练好的词向量,并且以预训练的词向量来作为初始值,在训练过程中冻结或者微调。

我们训练好的词向量是不可能涵盖所有词的(这里主要有两个原因,一是训练语料中本来就不存在这些词,二是这些词在训练语料中出现次数过少),这就会存在一个未登录词的问题,遇到这个问题的时候我们怎么处理呢?

首先,最简单和最普遍的解决方法就是将所有未登录的词映射为<UNK>,并且为它训练一个词向量。但是这种方法存在缺点,它把这些未登录词都视为相同,不能区分它们的区别。

为了解决上面的方法存在的问题,人们开始考虑训练字符集别的词向量。
除此之外还有一些其他的方法:

1.如果测试时的<unk>单词出现在未受监督的单词嵌入中,请使用测试时的向量。
2.对于其他单词,只需给它们分配一个随机向量,将它们添加到词汇表中即可。
3.将事物折叠成单词类(如未知数字、大写的事物等),并为每个类设置一个<unk class>

二、ELMO

下面我们来看下这个神经网络:


在一个NLM中,我们快速地通过LSTM层获得单词向量(可能只在语料库上训练)。这些LSTM层被训练来预测下一个单词。但是这些语言模型在每个位置都产生了上下文特定的单词表示!

下面来介绍一些经典的模型:

1、Peters et al. (2017): TagLM – “Pre-ELMo”

论文地址:https://arxiv.org/pdf/1705.00108.pdf
核心思想:通过上下文中获取单词的含义,但只在task-labeled的小任务(例如,NER)上使用RNN来进行训练。

算法的核心步骤如下:

1.预训练词向量和语言模型
2.在输入序列中准备好单词嵌入和语言模型嵌入。
3.在序列标记模型中同时使用单词嵌入和语言模型嵌入。

该模型结构图如下:


论文得出的结论如下:

1、通过对语言模型观察我们得出:使用有监督数据集来训练的语言模型效果甚微,使用双向语言模型仅对向前有利,网络结构越复杂效果越好。
2、通过对任务特定BILSTM观察可知:仅使用lm嵌入来预测并不好,仅在标签数据上使用bilstm进行标记

2、Also in the air: McCann et al. 2017: CoVe

论文地址:https://arxiv.org/pdf/1708.00107.pdf

网络结构示意图如下:


核心思想是使用经过训练的序列模型为其他NLP模型提供上下文。
使用两层的LSTM来为seq2seq+attention编码器的提供双下文
结果:产生的COVE向量在各种任务上都优于Glove向量。
但是,结果并不像其他幻灯片中描述的简单NLM那样强大,因此最后被舍弃。

3、Peters et al. (2018): ELMo: Embeddings from Language

Models
ELMO是第一个使用双向语言模型来获得词向量的方法。
论文名称及地址:
Deep contextualized word representations. NAACL 2018.
https://arxiv.org/abs/1802.05365

网络结构图:


ELMO是词向量或上下文词向量的突破性算法:它使用长上下文而非上下文窗口学习词向量(此处,整个句子可能更长),使用双向的深层NLM进行训练并使用其所有层进行预测。

我们来简要介绍下这个模型:首先,它训练了一个双向的语言模型,其次,其性能很好并且模型不大:使用2个bilstm层,使用字符级的CNN建立初始单词表示(2048 char n-gram过滤器和2个HighWay层,512 dim投影),使用4096 dim hidden/cell lstm状态,512dim投影到下一个输入,使用残差链接,连接token输入和输出(SoftMax)的参数,并将这些参数连接在正向和反向语言模型之间。

ELMO用于学习特定任务的双向语言模型表示的组合,这是首次仅使用LSTM堆栈顶层的模型,ELMO的任务可以简单表示为:


\gamma^{task}:根据任务衡量ELMO的总体效用;
s^{task}:Softmax归一化混合物模型权重

在使用双向语言模型获得词向量后,我们在下游任务中使用词向量时,冻结有监督模型中的ELMO部分,并且将EMLO的权重根据不同的任务来连接不同的模型中。

模型中的两个bilstm nlm层具有不同的用途/含义,

1、较低层学习的是较低级别的语法等。
2、高层次学习的是语义。

三、ULMfit

论文名称及地址:
Howard and Ruder (2018) Universal Language Model Fine-tuning for Text Classification.
https://arxiv.org/pdf/1801.06146.pdf

ULMfit主要是使用迁移学习来进行文本分类:
迁移学习示意图:


算法的核心思想:

1.在大的通用域语料库上训练语言模型
2.在目标任务数据上调整语言模型
3.作为目标任务的分类器进行微调

模型结构图如下:


UMLfit使用大小合理的“1-gpu”语言模型,由于是利用别人预训练好的模型进行迁移学习,因此模型通常不大。
在语言模型微调过程中非常小心,每层采用不同的学习率,即倾斜三角形学习率(STLR)策略,开始学习率逐渐增大大,后面逐渐变小。
在学习分类器时逐步解冻并且采用STLR策略,分类时使用串联的方法[h_T,maxpool(h),meanpool(h)]

近年预训练语言模型发展历程:


四、transformer:

transformer的出现主要是为了利用纯attention来解决RNN系列网络无法并行的问题。

transformer网络概况:


我们从图中可以看到:它是一个没有使用循环神经网络的Seq2Seq编码器解码器模型。最初应用于使用并行语料库进行机器翻译并预测每个单词的翻译。
最终的成本/误差函数是SoftMax分类器顶部的标准交叉熵误差。

如果我们要详细地了解transformer,可以参考下面地资源:
http://nlp.seas.harvard.edu/2018/04/03/attention.html
这是一个使用pytorch在jupyter notebook上来解释transformer的教程。

接下来我们首先了解transformer中的attention部分。

1、attention:

inputs:一个查询q和一组键值(k-v)对。
Query, keys, values, and output都是向量。
输出是值的加权和,其中每个值的权重由查询的内部乘积和相应的键计算,查询和键具有相同的维数d_k值d_v
输出公式如下:

当我们遇到多个查询时,我们将它们使用堆栈的方法组成矩阵Q,那么上面这个公式就变为如下形式:


但是这个公式存在一个缺点:
当d_k变大时,q^{t}k的方差会增加,SoftMax中的一些值会变大,SoftMax图形会变得非常尖锐,进而导致它的梯度变小。
因此这里进行了一个缩放处理:

示意图如下:


2、self-attention

接下来介绍一下self-attention,self-attention有什么特点呢?

1.输入词向量是查询、键和值。
2.词向量本身相互进行选择。
3.字向量stack=Q=K=V

1.Encoder self-attention

2.Decoder self-attention

缺点在于只有一种词的相互作用方式,下面我们来介绍一下Multi-head attention

3、Multi-head attention

其大概步骤如下:

1.首先通过W矩阵将q,k,v映射到h=8的低维空间
2.然后连接输出并通过线性层传输

其计算公式如下:


示意图如下:


与CNN和传统的Attention相比,Multi-head attention还是有很多特性的。
下面以这句话为例子:
The cat stuck out its tongue and licked its owner
当使用CNN处理这段话时,体现的是相对位置的不同线性变换,其示意图如下:

当使用普通的Attention时,体现的是权重的平均:


当使用Multi-Attention时,在输入和输出上具有不同线性变换的并行行Attention层:


4、transformer block

1.encoder

encoder结构部分的示意图如下:


在transformer中,每个块有两层,每层由一个Multihead attention和一个两层的采用ReLU激活函数的前馈神经网络组成。

其结构可以由下图表示:


这两个步骤中的每一个还具有:
Residual (short-circuit) connection 和 LayerNorm
LayerNorm(x + Sublayer(x))
layerNorm将输入更改为每个层和每个训练点的平均值0和方差1(并添加两个以上参数),公式表示如下:


在transformer中,encoder部分的每个块(共6个)中, Q=K=V且Q、K、V都来自上一层。并且实际上词向量的表示是字节对编码,除此之外,还添加了位置编码,因此不同位置的相同单词具有不同的整体表示。
positional encoding的计算公式如下:


2.decoder

结构示意图如下:


相对于encoder部分decoder对子层进行了一定的更改,
1.使用self-attention对先前生成的输出进行masked decoder


2.Encoder-Decoder Attention,查询来自前一个解码器层,键和值来自编码器的输出。


transformer的相关细节如下:

1.字节对编码
2.检查点平均
3.学习率变化的Adam优化器
4.在每一层训练过程中仅在在添加参擦连接之前使用dropout
5.标签平滑
6.使用带有beam search和长度惩罚的自动回归解码

五、BERT: Devlin, Chang, Lee, Toutanova (2018)

BERT (Bidirectional Encoder Representations from Transformers):
Pre-training of Deep Bidirectional Transformers for Language
Understanding

ELMO、GPT、BERT结构对比图:


BERT主要解决的是传统语言模型只使用左上下文或右上下文,但语言理解是双向的这一问题。图例如下:


BERT在工程上采用的技巧是:

1.在训练过程中随机mask掉15%的token,而不是把像cbow一样把每个词都预测一遍。最终的损失函数只计算被mask掉那个token。
Mask如何做也是有技巧的,如果一直用标记[MASK]代替(在实际预测时是碰不到这个标记的)会影响模型,所以随机mask的时候10%的单词会被替代成其他单词,10%的单词不替换,剩下80%才被替换为MASK。要注意的是Masked LM预训练阶段模型是不知道真正被mask的是哪个词,所以模型每个词都要关注。

2.在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。


BERT sentence pair encoding
BERT中每个输入向量由下面几个组成:


token嵌入是单词片段
学习分段嵌入来表示每个句子
位置嵌入与其他Transformer架构是一样的

BERT model fine tuning
使用BERT训练好模型以后,我们在下游任务中使用它的时候,只需要根据当前的任务对它进行微调即可。


transformer在图形和语音方面的应用

1.transformer在图像方面的应用

总体结构图如下:

image transformer layer:

2.transformer在语音方面的应用

在语言方面,采用的是Multihead Attention和convolution的组合结构relative attention,对于一段音频来说可得到下面的表示:


传统anttention观察的部分:


relative anttention观察的部分:


上一篇下一篇

猜你喜欢

热点阅读