预训练模型助力NLP

自然语言处理(NLP),目的是使得计算机具备人类的听、说、读、写、译、问、答、搜索、摘要、对话和聊天等能力,并可利用知识和常识进行推理和决策,并支持客服、诊断、法律、教学等场景。自然语言理解,被认为是AI皇冠上的明珠。一旦有突破,则会大幅度推动AI在很多重要场景落地。

过去这五年,对自然语言是一个难忘的五年,它的一个标志就是神经网络全面引入到了自然语言理解。从大规模的语言数据到强有力的算力,加上深度学习,把整个自然语言带到一个新的阶段。

今天我要讲的预训练模型,它使自然语言处理由原来的手工调参、依靠ML专家的阶段,进入到可以大规模、可复制的大工业施展的阶段,令我们这个领域的人感到非常振奋。而且预训练模型从单语言、扩展到多语言、多模态任务。一路锐气正盛,所向披靡。

那么,预训练模型到底是什么,它是怎么应用在很多产品里,未来又有哪些发展机会和挑战呢。下面试图由浅入深地给大家介绍一下。

 

2

预训练模型

下面简要介绍预训练模型的基础技术,包括Transformer、自监督学习、微调。然后详细介绍预训练模型在语言、图像、文档和视频等任务中的进展,

预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型。体现某一个词在一个特定上下文中的语义表征。第二个步骤是微调,针对具体的任务修正网络。训练数据可以是文本、文本-图像对、文本-视频对。预训练模型的训练方法可使用自监督学习技术(如自回归的语言模型和自编码技术)。可训练单语言、多语言和多模态的模型。此类模型可经过微调之后,用于支持分类、序列标记、结构预测和序列生成等各项技术,并构建文摘、机器翻译、图片检索、视频注释等应用。

为什么我们要做预训练模型?原因如下:

首先,预训练模型是一种迁移学习的应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,它隐式地学习到了通用的语法语义知识。

第二,它可以将从开放领域学到的知识迁移到下游任务,以改善低资源任务,对低资源语言处理也非常有利。

第三,预训练模型在几乎所有 NLP 任务中都取得了目前最佳的成果。

最后,这个预训练模型+微调机制具备很好的可扩展性,在支持一个新任务时,只需要利用该任务的标注数据进行微调即可,一般工程师就可以实现。

下面介绍预训练模型的三个关键技术。

 

1、Transformer

它在NLP各个任务中都取得了优异的性能,它是预训练语言模型的核心网络。给定一句话或是一个段落作为输入,首先将输入序列中各个词转换为其对应的词向量,同时加上每一个词的位置向量,体现词在序列的位置。然后将这些词向量输入到多层Transformer网络中,通过自注意力(self-attention)机制来学习词与词之间的关系,编码其上下文信息;再通过一个前馈网络经过非线性变化,输出综合了上下文特征的各个词的向量表示。

每一层Transformer网络主要由Multi-head self-attention层(多头自注意力机制)和前馈网络层两个子层构成。Multi-head self-attention会并行地执行多个不同参数的self-attention,并将各个self-attention的结果拼接作为后续网络的输入,self-attention机制会在后面中做详细介绍。此后,我们得到了蕴含当前上下文信息的各个词的表示,然后网络会将其输入到前馈网络层以计算非线性层次的特征。

在每一层Transformer网络中,会将残差连接(residual connection)把自注意力机制前或者前馈神经网络之前的向量引入进来,以增强自注意力机制或者前馈网络的输出结果向量。并且还做一个layer normalization,也就是通过归一化把同层的各个节点的多维向量映射到一个区间里面,这样各层节点的向量在一个区间里面。这两个操作加入在每个子层后,可更加平滑地训练深层次网络。

Transformer可以用于编码,也可以用于解码。所谓解码就是根据一个句子的输入得到一个预想的结果,比如机器翻译(输入源语言句子,输出目标语言句子),或者阅读理解(输入文档和问题,输出答案)。解码时,已经解码出来的词要做一个自注意力机制,之后和编码得到的隐状态的序列再做一个注意力机制。这样可以做N层。然后通过一个线性层映射到词表的大小的一个向量。每个向量代表一个词表词的输出可能性,经过一个Softmax层得到每个词的输出概率。

接下来详细介绍self-attention机制,以一个head作为示例。假定当前输入包含三个词,给定其输入词向量或是其上一层Transformer网络的输出,将其通过三组线性变换,转换得到三组queries、keys 和 values向量。query和key向量用来计算两两词之间的得分,也就是其依赖关系,这个得分会同其对应的value向量做加权和,以得到每个词综合上下文信息的表示。

给定当前第一个词的query向量,其首先同各个词的key向量通过点积操作得到这两个词的得分,这些得分用来表示这两个词的依赖或是相关程度。这些得分之后会根据query等向量的维度做一定比例的缩放,并将这些得分通过softmax操作做归一化。

之后,各个得分会同其相对应的value向量相乘得到针对第一个词加权的各个value向量,这些加权的value向量最终相加以得到当前第一个词的上下文表示。

在得到第一个词的上下文表示后,给定第二个词的query向量,我们会重复之前的操作,计算当前query向量同各个词key向量的得分,对这些得分做Softmax归一化处理,并将这些得分同其对应的value向量做加权和,以得到其编码上下文信息的表示。

下面是一个最简化的例子以便简单说明自注意力机制。为了简单起见,这里假设Q、K和V的变化都不起作用,也就是不变。

 

输入是The weather is nice today。利用自注意力机制调整每个词的表示。比如The。我们认为它要受到其他所有词的影响。但是影响力可大可小。那么每个词的影响力是通过计算the 与每个词的关联度,然后通过一个softmax归一化得到一个权值。每个词一个权值。这样the的最后表示就是和每个词计算关联度的结果之和。

多头注意力机制就是对一个节点,可以设置几组K、Q和V,分别计算关联度(通过Q和K计算点积)和加权调整的值(通过V和关联度计算)。几组结果可以拼在一起,通过一个线性变换,体现多角度的特征抽取。多头可以是16个头、12个头等。

2、自监督学习

在预训练的模型中,AR(自回归)LM 和 AE(自动编码器)是最常用的自监督学习方法,其中,自回归LM 旨在利用前面的词序列预测下个词的出现概率(语言模型)。自动编码器旨在对损坏的输入句子,比如遮掩了句子某个词、或者打乱了词序等,重建原始数据。通过这些自监督学习手段来学习单词的上下文相关表示。

3、微调

在做具体任务时,微调旨在利用其标注样本对预训练网络的参数进行调整。以我们使用基于BERT(一种流行的预训练模型)为例来判断两个句子是否语义相同。输入是两个句子,经过BERT得到每个句子的对应编码表示,我们可以简单地用预训练模型的第一个隐节点预测分类标记判断两个句子是同义句子的概率,同时需要额外加一个线性层和softmax计算得到分类标签的分布。

预测损失可以反传给 BERT再对网络进行微调。当然也可以针对具体任务设计一个新网络,把预训练的结果作为其输入。

下面介绍预训练模型的历史沿革。

预训练模型的发展虽然这几年才大热,但是我觉得源于早期的词嵌入(word embedding)的工作。比如Word2Vec。它的训练的结果是词的嵌入,是一个静态的表示;此后ULMFiT 是第一个使用RNN基于LM训练的上下文相关的预训练模型;CoVe利用翻译任务来训练编码器-解码器,并使用编码器作为预训练模型;ELMo 使用双向 LSTM合并两个方向的隐状态获得上下文相关表示;GPT采用LM进行训练,它是基于Transformer的单向预训练模型;BERT是基于Transformer的基于掩码的预训练模型;MT-DNN基于BERT增加了一些任务进行多任务训练;MASS使用编码-解码器来训练预训练模型;UNILM尝试同时支持语言理解和生成任务。

把预训练模型用于多语言任务:XLM是一种支持多语言的BERT模型;Unicoder引入若干新的任务改进了 XLM;T5把多种自然语言任务(比如机器翻译、问答),用了更大的数据,在一个网络训练,同时支持这些任务;BART是一种编码-解码器模型,通过还原损坏的句子训练;mBART将 BART理念扩展到多语言。另外还有最新的很多模型恕我这里没有全部列出。此外也扩展到多模态。

 

这是一个更加详细的总结。名称、用途、架构、特点,这里就不详细说明了。

总体来讲,预训练模型发展趋势:

第一,模型越来越大。比如Transformer的层数变化,从12层的Base模型到24层的Large模型。导致模型的参数越来越大,比如GPT 110 M,到GPT-2是1.5 Billion,图灵是17 Billion,而GPT-3达到了惊人的175 Billion。一般而言模型大了,其能力也会越来越强。但是训练代价确实非常大。

第二,预训练方法也在不断增加,从自回归LM,到自动编码的各种方法,以及各种多任务训练等。

第三,还有从语言、多语言到多模态不断演进。

最后就是模型压缩,使之能在实际应用中经济的使用,比如在手机端。这就涉及到知识蒸馏和teacher-student models,把大模型作为teacher,让一个小模型作为student来学习,接近大模型的能力,但是模型的参数减少很多。

预训练模型举例说明:

BERT

这里用BERT举例说明预训练模型训练方法。基于Transformer。其基本模型为 12 层模型,还有一个大型模型为 24 层模型。这里说明几个关键地方。

1. tokenizer,简单地理解为词的切分,比如工具BPE。针对一个数据集合,BPE工具自动获得该数据集的token的集合,取频率最高的前N个token作为词表,其他的token都看作是UNK(unknown word)。

2. 对数据集合的每个数据,通过BPE做tokenize,形成token的序列。

3. 训练时,每个token有一个多维向量表示,比如1 024维。随机初始化。

4. 计算预测的损失。该损失反向传播来调整各层的网络参数。也包括每个token的多维向量表示。

5. 最后训练的结果,包括每个token的多维向量表示、每层的网络参数,以及各个attention model的参数等。

6. 在用预训练模型时,把输入序列tokenize之后,对每个token,从词典中得到多维向量表示。然后根据每层的网络参数,计算输出。

训练任务:BERT使用了掩码语言模型(就是盖住一个单词或者多个单词,然后让模型预测)。损失用来调整网络。

BERT还使用NSP(下一句预测),旨在预测第二句是否是第一句的下一句。