1、自然语言表示学习
1.1 什么是自然语言处理(NLP)
自然语言 ≈ \approx ≈人类语言,不同于人工语言(如程序语言);
- 自然语言处理包括语音识别、自然语言理解、自然语言生成、人机交互以及所涉及的中间阶段;
- 是人工智能和计算机科学的子学科;
NLP的领域大致可以分为以下几块:
在当前大数据时代,NLP中的基础技术,如词法分析、句法分析等不会很重视了,随着现在以数据驱动的方式越来越流行,基础技术在很多时候变得不再那么重要了。
1.2 NLP的基础:语言表示
- 语言为离散的符号,不同的词构成句子,表达不同的语义;
- 计算机没有办法直接理解语言,计算机只能从语义层面上对语言进行理解;
如何在计算机中表示语言的语义?
-
知识库规则
词的语义直接在知识库进行表示,并且将不同词的组合通过规则进行限制;
-
分布式表示
通过向量来表示词的语义,也就是词嵌入(embedding),用低维、压缩的稠密向量对词的语义进行表示;
词嵌入方法的优点是可以直接对两个不同词进行计算,比如用两个词之间的 距离来计算两者之间的相似度;词嵌入方法的缺点是很难解释空间中这些点具体代表什么含义;
句子嵌入
有了词嵌入可以进一步做句子嵌入:
- Non-contextual Embeddings:输入的单词序列,映射为其对应的词向量;
- Contextual Encoder:可以是各种深度学习模型,输出为有上下文关联的词向量表示;
- contextual Embeddings:带有上下文关联的词表示;
- Task-Specifc Model:具体的自然语言处理任务;
1.3 自然语言处理任务
在得到字、句子表示之后,自然语言处理任务类型可以划分为:
1.3.1 序列到类别
(1)情感分类
情感分类模型中,模型输入为一个句子“这部电影太糟了”,通过词嵌入模型映射为Embedding之后,送到深度学习模型Encoder之后,输出其对应的情感预测结果;
(2)文本蕴含
比如“北京市中国首都”和“北京是城市”两个句子之间的关系,将两个句子拼接到一起,在两个句子之间加一个分隔符“[SEP]”,将词映射为词向量之后,通过Encoder层之后对其进行预测,得到预测结果;
1.3.2 同步的序列到序列
(1)中文分词
中文分词一般转换为序列标注问题,输出序列中的B表示一个词组的开始,E表示一个词组的结束,S表示单独的一个词,这样可以把单词划分转换为标签问题。
因为标签之间可能存在依赖关系,所以为了获取不同词之间的依赖关系,需要在Encoder上面加一层CRF获取不同词之间的依赖信息。
1.3.3 异步的序列到序列
(1)机器翻译
机器翻译模型的输入端输入“Machine Learning”,经过词嵌入之后传入到Encoder层中得到输入句子的整体表示(向量表示),再把Encoder的输出传输到解码器Decoder中,然后通过自回归语言模型进行解码,最后输出翻译结果“机器学习”;
自回归模型可以简单理解为给定前面的输出,预测当前的输出;比如前面已经输出“机器”,则通过“机器”和Decoder的当前输入预测当前词“学”。
还有一种自编码语言模型,这种方法用作Bert模型中的mask预测中,自编码模型是已知上下文信息。比如已经知道“机器”和“习”,需要预测当前词“学”;
1.4 NLP的语义组合
语言的性质
-
层次性
语言虽然由一个序列进行表示,但是语言具有层次性,比如一个动词短语(VP)可能由一个动词(VV)和一个动词短语组成(VP);一个动词短语(VP)可以由一个介词短语和一个动词短语组成(VP);
-
递归性:语言规则可以递归应用;
-
序列性:语言句子表现出来是一个序列形式;
语义组合
- 句子的语义可以词租车定
- 长程依赖
1.5 NLP模型演变
1.6 NLP中的三大模型
当使用神经网络来处理一个变长的向量序列时,我们通常可以使用以下模型来编码:
- 卷积模型:通过卷积核进行信息读取整理;
- 序列模型:同一层模型之间存在信息传递;
- 全连接图模型: h 1 h_1 h1的上下文表示依赖输入的所有词,这就是全连接,全连接用虚线表示其权重是动态计算的;
1.7 注意力机制:
注意力机制可以分为两步:
- 计算注意力分布
α
\alpha
α
α n = p ( z = n ∣ X , q ) \alpha_{n}=p(z=n \mid \boldsymbol{X}, \boldsymbol{q}) αn=p(z=n∣X,q) = softmax ( s ( x n , q ) ) =\operatorname{softmax}\left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right) =softmax(s(xn,q)) = exp ( s ( x n , q ) ) ∑ j = 1 N exp ( s ( x j , q ) ) =\frac{\exp \left(s\left(\boldsymbol{x}_{n}, \boldsymbol{q}\right)\right)}{\sum_{j=1}^{N} \exp \left(s\left(\boldsymbol{x}_{j}, \boldsymbol{q}\right)\right)} =∑j=1Nexp(s(xj,q))exp(s(xn,q)) - 根据
α
\alpha
α来计算输入信息的加权平均
att ( X , q ) = ∑ n = 1 N α n x n \operatorname{att}(\boldsymbol{X}, \boldsymbol{q})=\sum_{n=1}^{N} \alpha_{n} \boldsymbol{x}_{n} att(X,q)=n=1∑Nαnxn = E z ∼ p ( z ∣ X , q ) [ x z ] =\mathbb{E}_{\boldsymbol{z} \sim p(z \mid \boldsymbol{X}, \boldsymbol{q})}\left[\boldsymbol{x}_{z}\right] =Ez∼p(z∣X,q)[xz]
如上图,有N个输入 [ x 1 , x 2 , . . . , x N ] [x_1,x_2,...,x_N] [x1,x2,...,xN],给定一个查询 q q q,我们希望从输入 [ x 1 , x 2 , . . . , x N ] [x_1,x_2,...,x_N] [x1,x2,...,xN]中选出与查询 q q q最相关的信息。计算查询 q q q与每个输入 x x x的相似度,再通过softmax函数进行归一化处理,变为符合概率分布的形式,将计算得到的概率分布分别于各自的 x x x相乘累加得到最后的输出信息;
1.7.1 自注意力模型
给定序列“The weather is nice today”,假设现在需要知道"The"的上下文表示,"The"有可能需要依赖序列中的非局部信息,因此我们将其与输入的所有词进行链接;为了得到对应每个词的权重,将"The"与其它所有词计算相似度获得对应的权重,最后进行累加得到"The"的上下文向量表示。
以矩阵形式对上面过程进行分析如下:
对于输入
X
X
X,分别使用三个线性变换将其变为
Q
Q
Q,
K
K
K,
V
V
V,其中
Q
Q
Q和
K
K
K用于计算相似度矩阵,表示每个词与其他词的关系,得到相似度矩阵后需要进行缩放点乘softmax处理,图中的
V
V
V用于进行信息的汇总。
这套模型中引入了三套参数,使得模型的学习能力更强;
1.7.3 多头自注意力模型
多头自注意力模型将自注意力模型进行重复叠加操作,得到多组不同的上下文表示,可以理解为在不同空间中的语组关系,将其拼接起来,最后再使用一个参数矩阵
W
W
W将其变换为输入时对应的向量维度。
1.8 Transformer
Transformer:可能是目前为止最适合NLP的模型;
广义的Transformer指一种基于自注意力的全连接神经网络
- 核心组件:自注意力(self-attention)
- 仅仅有自注意力还不够(例如没有考虑位置信息),还包括其它操作:
- 位置编码
- 层归一化
- 直连边
- 逐位的FNN
Transformer的更新方式可以看成图的方式,每一时刻每个位置上都收集到来自其它词的信息
Transformer的完整结构
2、预训练模型
2.1 预训练模型之前
深度学习在自然语言处理中的“困境”
如果要训练一个比较好的NLP模型,需要改变原来的训练方法,即从端到端从零开始学习转变为进行“数据增强”、“迁移学习”、“多任务学习”。
- 数据增强:引入外部知识,比如增加人工的辅助损失函数等;
- 迁移学习:在大语料上把数据训练好,然后再迁移到目标任务中;
- 多任务学习:一个任务的数据可能很少,可以把多个任务的数据拼接到一起进行模型训练;
2.2 为什么要预训练
- 获得通用的语言表示;
- 获得一个好的初始化(Hinton在2006年使用玻尔兹曼机初始化深度神经网络);
- 预训练可以看做一种正则化方法(避免在小数据集上过拟合),由于模型比较复杂,当训练数据较小时很容易导致过拟合;
2.3 预训练任务
预训练带来一个问题,怎么获取大量的预训练语料?主要有以下三种方法:
- 监督学习 —— 机器翻译有大量语料;
- 无监督学习 —— 使用语言模型进行预训练,不需要标签信息;
- 自监督学习 —— 掩码语言模型(masked language model, MLM),掩码语言模型不依赖标注数据,是一种伪监督任务,其目的是学习数据中的可泛化知识;
预训练任务汇总
预训练模型分类体系
2.4 典型模型
2.4.1 Bert
Bert有两个训练任务,第一个任务是预测被mask的单词,第二个任务是句子级任务——句对预测。
上述图片中有两个特殊的地方,在句子输入中添加了[CLS]和[SEP],[SEP]的作用是区分两句话,[CLS]用于捕捉全局信息;
当使用Bert进行分类任务时,直接在Bert上拼接一个分类器就能执行分类任务;
2.4.2 SpanBert
- 预测一个范围内的所有词;
- 去除NSP预训练任务;
2.4.3 StructBert
2.4.4 XLNet
2.4.5 T5
2.4.6 GPT-3
3、预训练模型的扩展
3.1 Knowledge-Enriched PTMs
把知识图谱引进预训练模型中,如上图中,右图中的黄色内圈表示文本的全连接的图结构,在完全的图结构中把知识图谱的结构化信息引进来,这样就丰富了预训练模型的信息,除了可以获得文本的上下文信息,也可以获得知识图谱中的信息。
用类似于Bert的训练方式进行训练,如下所示:
3.2 Multilingual and Language-Specific PTMs
Cross-Lingual Language Understanding(XLU)
跨语言模型训练,例如XLM中句子对的前半句为英语句子,句子对中的后半句为法语句子,只需要在输入的时候给不同的句子加上不同的语言标记,如en或者fr;双语句子对中信息是冗余的,可以充分利用双语语料中的信息预测mask的词;
Cross-Lingual Language Generation(XLG)
用类似于序列到序列的方法建模预训练模型,把训练句子中的一部分进行mask,放进Encoder中进行编码,然后在Decoder中将其预测出来;这个模型不同于Bert,Bert只使用Transformer中的Encoder部分,而MASS使用了整个Transformer结构;
可以看到,在MASS模型中,如果仅仅mask一个词,该模型可以近似看做Bert模型;如果把MASS中的所有词进行mask,这时候可以把MASS模型看做一个标准语言模型;
Language-Specific PTMs
原始Bert在进行中文预训练任务时是mask一个一个字,这样丢失了字与字之间的关联信息,ERNIE通过预测一个词捕捉句子中词的依赖关系,其得到的中文预训练模型效果更好;
VL-Bert
VideoBert
- 将文本和视频对作为BERT的输入,同时Mask词以及图像块
3.3 模型压缩
- 模型剪枝 —— 去掉一些不重要的参数;
- 权重矢量化 —— 使用简单的二值数表示参数;
- 参数共享;
- 知识蒸馏;
- 模块替换;
4、迁移到下游任务
在预训练数据集上训练得到一个模型,将得到的模型迁移到下游任务中,这种是sequential transfer learning;
4.1 选择适当的预训练任务,模型架构和语料库
- 不同的预训练任务有自己的侧重方向,并且对不同的任务产生不同的影响;
- 预训练模型的结构同样对下游任务很重要;举个例子,bert模型对自然语言理解非常友好,但是对生成语言模型不大友好;
- 下游任务的数据分布需要和预训练模型的数据分布大体一致;
4.2 选择合适的预训练模型的神经网络层
4.3 预训练模型的参数是否微调
是否微调依赖于具体的任务,在ELMO中不进行微调效果更好,在Bert中进行微调效果更好;
微调策略
- 多步迁移
有两种方法,如上图,第一种是蓝色线方法,先预训练,接着在单一目标任务上进行微调;第二种方法是红色线方法,先预训练,然后在多任务数据集上进行微调,接着在单一目标任务上进行微调; - 用额外的自适应模块进行微调
4.4 句子分类变为句子对分类
当标签含有语义信息时,将单句(single sentence)分类问题转换为句对(sentence-pair)分类。
4.5 集成Bert
图(a)是将预测结果进行平均;图(b)是将多个Bert的参数进行平均,然后对输入x进行预测;
4.6 Self-Ensembel and Self-Distillation
5、未来展望
5.1 预训练模型的上界
5.2 预训练模型的架构
- transformer已经被证明是一种有效的预训练模型结构,但是计算效率比较复杂,目前大部分预训练模型都不能处理序列长度大于512的文本;
- 为预训练模型寻找更有效的模型架构对于捕获更广泛的上下文信息很重要;
5.3 任务定向的预训练和模型压缩
- 预训练模型与下游任务之间的差异通常在于两个方面:
- 模型架构
- 数据分布
- 较大的差异可能会导致预训练模型的收益微不足道;
- 任务导向型预训练模型;
- 模型压缩
5.4 除了微调之外的知识迁移
- 当前,微调是将预训练模型的知识转移到下游任务的主要方法;
- 参数无效 ;
- 从预训练模型挖掘知识可以更加灵活,例如:
- 特征提取;
- 知识蒸馏;
- 数据增强;
- 将预训练模型作为额外知识;
5.5 预训练模型的可解释性和可靠性
6、fsatNLP
6.1 为什么要做fastNLP
6.2 开源框架fastNLP
7、参考资料
- 演讲PPT链接:《自然语言处理中的预训练模型》
- 邱锡鹏老师个人github
- fastNLP:Github链接
- 预训练模型综述论文:《Pre-trained Models for Natural Language Processing: A Survey》