Transfer Learning in Natural Language Processing¶
Sebastian Ruder: Transfer Learning in Open-Source Natural Language Processing (spaCy IRL 2019)
The State of Transfer Learning in NLP
Transfer Learning in Natural Language Processing Tutorial
Follow along with the tutorial:
- Slides: http://tiny.cc/NAACLTransfer
- Colab: http://tiny.cc/NAACLTransferColab
- Code: http://tiny.cc/NAACLTransferCode
What is transfer learning ?
在许多机器学习和数据挖掘算法中,一个主要的假设是训练和未来的数据必须在相同的特征空间中,并且具有相同的分布。然而,在许多实际应用程序中,这种假设可能不成立。例如,我们有时在一个感兴趣的领域中有一个分类任务,但是我们只在另一个感兴趣的领域中有足够的训练数据,并且后者可能位于不同的特征空间或遵循不同的数据分布。在这种情况下,如果成功地进行知识转移,就可以避免昂贵的数据标记工作,从而大大提高学习性能。近年来,迁移学习作为一种新的学习框架应运而生。本研究的重点是分类和回顾目前迁移学习在分类、回归和聚类问题上的进展。在本研究中,我们讨论了迁移学习与其他相关机器学习技术的关系,如领域适应、多任务学习、样本选择偏差以及协变量偏移。同时,我们也探讨了迁移学习研究中一些潜在的未来问题。
Why transfer learning in NLP ?
- 许多NLP任务共享关于语言的共同知识(例如语言表示、结构相似性)
- 可以跨任务共享的不同层次的含义和结构的表示
- 任务之间可以互通有无——例如语法和语义
- 带注释的数据很少见,尽可能多地利用监督学习
- 经验上看,迁移学习促成了许多有监督的 NLP 任务的 SOTA (如分类、信息提取、问答等)。
Why transfer learning in NLP? (Empirically)
Types of transfer learning in NLP
What this tutorial is about and what it’s not about
- 目标:提供NLP中转移方法的广泛概述,重点介绍截至目前(2019年年中)最成功的经验方法。
- 提供实用的,动手的建议→在教程结束时,每个人都有能力应用最新的进展到文本分类任务
- 这不是什么:全面的(不可能在一个教程中涵盖所有相关的论文!)
- (Bender Rule:本教程主要针对用英语完成的工作,对其他语言的可扩展性取决于数据和资源的可用性。)
1. Introduction¶
Sequential transfer learning 指的是在一个任务/数据集上学习后迁移到其他任务/数据集上。
Pretraining tasks and datasets
- Unlabeled data and self-supervision
- 很容易收集非常大的语料库:维基百科,新闻,网页抓取,社交媒体等。
- 利用分布假设进行训练:“You shall know a word by the company it keeps”(Firth, 1957),通常形式化为训练某种语言模型的变体
- 关注使用有效的算法以利用丰富的数据
- Supervised pretraining
- 在视觉领域很常见,但由于缺乏大型监督数据集,在NLP中较少
- 机器翻译
- NLI用于句子表示
- 任务特定——从一个问答数据集转移到另一个
Target tasks and datasets
- 目标任务通常是监督的,并跨越一系列常见的NLP任务:
- 句子或文档分类(例如情绪)
- 句子对分类(如NLI,解释)
- 单词级别(如序列标注、抽取问答)
- 结构化预测(例如解析)
- 生成(例如对话、总结)
Major themes: LM pretraining
- 许多成功的预训练方法都是基于语言模型的
- 非正式地,语言模型学习 \(P_{\theta}(\text { text }) \text { or } P_{\theta}(\text { text } | \text { some other text })\)
- 不需要人工注释
- 许多语言都有足够的文本来学习高容量模型
- 语言模型是“多才多艺”的——可以学习句子和单词的表示,具有多种目标函数
Major themes: From shallow to deep
Bengio et al 2003: A Neural Probabilistic Language Model
Devlin et al 2019: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Major themes: pretraining vs target task
预训练的选择和目标任务是耦合的
- 句子/文档表示对单词级别的预测没有帮助
- 词向量可以跨上下文聚合,但通常会被其他方法超越
- 在语境词向量中,双向语境非常重要
通常
- 相似的预训练和目标任务 → 最好结果
2. Pretraining¶
LM pretraining¶
word2vec
- 以 CBOW 为例,输入层将目标词语境 c 中的每一个词向量简单求和(当然,也可以求平均)后得到语境向量,然后直接与目标词的输出向量求点积,目标函数也就是要让这个与目标词向量的点积取得最大值,对应的与非目标词的点积尽量取得最小值。
- word2vec 的出现,极大促进了 NLP 的发展,尤其是促进了深度学习在 NLP 中的应用(不过有意思的是,word2vec 算法本身其实并不是一个深度模型,它只有两层全连接),利用预训练好的词向量来初始化网络结构的第一层几乎已经成了标配,尤其是在只有少量监督数据的情况下,如果不拿预训练的 embedding 初始化第一层,几乎可以被认为是在蛮干。
Skip-Thought
-
借鉴 Skip-gram 的思想,Skip-thoughts 直接在句子间进行预测,也就是将 Skip-gram 中以词为基本单位,替换成了以句子为基本单位,具体做法就是选定一个窗口,遍历其中的句子,然后分别利用当前句子去预测和输出它的上一句和下一句。
-
不过和普通框架不一样的是,Skip-thoughts有两个Decoder。在今天看来,这个框架还有很多不完善或者可以改进的地方(作者也在论文中分别提到了这些future works),比如输入的Encoder可以引入attention机制,从而让Decoder的输入不再只是依赖Encoder最后一个时刻的输出;Encoder和Decoder可以利用更深层的结构;Decoder也可以继续扩大,可以预测上下文中更多的句子;RNN也不是唯一的选择,诸如CNN以及2017年谷歌提出的Transformer的结构也可以利用进来,后来果不其然谷歌的BERT便借鉴了这一思路。
- Quick-thoughts 在此基础上进一步改进,将生成任务改为分类任务。具体说来就是把同一个上下文窗口中的句子对标记为正例,把不是出现在同一个上下文窗口中的句子对标记为负例,并将这些句子对输入模型,让模型判断这些句子对是否是同一个上下文窗口中,很明显,这是一个分类任务。可以说,仅仅几个月之后的BERT正是利用的这种思路。而这些方法都和Skip-thoughts一脉相承。
ELMo
- word2vec 最显著的问题是多义词问题,13 年提出后有很多方法试图解决多义词问题,但都成本太高或者太繁琐了。
- 《Deep contextualized word representations》一文提出了 ELMo,基本框架是2-stacked biLSTM + Residual的结构
- 使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构,而这两者后面都有用。
- 对于每一个词,可以根据下面的式子得到它的向量,其中 γ 是一个scale因子,加入这个因子主要是想要将ELMo的向量于具体任务的向量分布拉平到同一个分布水平,这个时候便需要这么一个缩放因子了。另外,\(s_j\) 便是针对每一层的输出向量,利用一个softmax的参数来学习不同层的权值参数,因为不同的任务需要的词语意义的粒度也不一致,一般认为浅层的表征比较倾向于句法,而高层输出的向量比较倾向于语义信息,因此通过一个softmax的结构让任务自动去学习各层之间的权重,自然也是比较合理的做法。
- 此外,ELMo 还使用了《Exploring the Limits of Language Modeling》中提出的 char-based CNN 结构,应用到输入层和输出层上,减少了参数规模,并解决了令人头痛的 OOV 问题。
- ELMo 使用LSTM 而不是 Transformer 作为特征抽取器,而很多研究已经证明了Transformer提取特征的能力是要远强于LSTM的;另外,ELMO采取双向拼接这种融合特征的能力可能比Bert一体化的融合特征方式弱,但是,这只是一种从道理推断产生的怀疑,目前并没有具体实验说明这一点。
- ELMo 代表着基于特征融合的预训练方法,而 GPT 则是基于Fine-tuning的模式的开创者。
GPT
-
GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。下图展示了GPT的预训练过程(按照论文中的说法,GPT中使用的Transformer是只用了Decoder),其实和ELMO是类似的,主要不同在于两点:首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到过它的特征抽取能力要强于RNN,这个选择很明显是很明智的;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:语言模型训练的任务目标是根据单词的上下文去正确预测单词 ,GPT则只采用这个单词的上文来进行预测,而抛开了下文。
-
下游任务怎么使用 GPT 呢?首先,对于不同的下游任务来说,本来你可以任意设计自己的网络结构,现在不行了,你要向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决手头的问题。
-
对于NLP各种花样的不同任务,怎么改造才能靠近GPT的网络结构呢?
-
GPT论文给了一个改造施工图如上,其实也很简单:对于分类问题,不用怎么动,加上一个起始和终结符号即可;对于句子关系判断问题,比如Entailment,两个句子中间再加个分隔符即可;对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。从上图可看出,这种改造还是很方便的,不同任务只需要在输入部分施工即可。
BERT
- Bert 采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。
- BERT最主要的几个特征分别是
- 利用了真双向的Transformer
- 为了利用双向信息,改进了普通语言模型成为完形填空式的Mask-LM(Mask-Language Model)
- 利用Next Sentence Prediction任务学习句子级别信息
- 进一步完善和扩展了GPT中设计的通用任务框架,使得BERT能够支持包括:句子对分类任务、单句子分类任务、阅读理解任务和序列标注任务
预训练阶段
-
因为Encoder中用了Self-attention机制,而这个机制会将每一个词在整个输入序列中进行加权求和得到新的表征,更通俗的说法是每一个词在经过Self-attention之后,其新的表征将会是整个输入序列中所有词(当然也包括它本身)的加权求和。在ELMo与GPT中,它们并没有用上这种交融模式,也就是它们本质上还是一个单向的模型,ELMo稍微好一点,将两个单向模型的信息concat起来,GPT则只用了单向模型,这是因为它没有用上Transformer Encoder,只用了Decdoer的天生基因决定的,其实,很多人就把这种left-to-right的Transformer框架叫做Decoder,因为事实上Decoder就是如此(具体做的时候需要提前把未来待生成的词做好mask,细节上通过上三角矩阵来实现),这也是OpenAI把他们的模型叫做"Generative"的原因所在。
-
Masked-LM 双向Transformer下的语言模型
- 然而在语言模型中,我们通过某个词的上下文语境预测当前词的概率,如果直接把这个套用到Transformer的Encoder中,会发现待预测的输出和序列输入已经糅合在一块了。那么,如何解决Self-attention中带来了表征性能卓越的双向机制,却又同时带来了信息泄露的这一问题?Bert 受到完形填空任务的启发:输入序列依然和普通Transformer保持一致,只不过把挖掉的一个词用"[MASK]"替换 ,Transformer的Encoder部分按正常进行,输出层在被挖掉的词位置,接一个分类层做词典大小上的分类问题,得到被mask掉的词概率大小。
- 直接把普通语言模型中的生成问题(正如GPT中把它当做一个生成问题一样,虽然其本质上也是一个序列生成问题),变为一个简单的分类问题,并且也直接解决了Encoder中多层Self-attention的双向机制带来的泄密问题(单层Self-attention是真双向,但不会带来泄密问题,只有多层累加的Self-attention才会带来泄密问题),使得语言模型中的真双向机制变为现实。
- 不过,BERT针对如何做“[MASK]”,做了一些更深入的研究,它做了如下处理
- 选取语料中所有词的15%进行随机mask
- 选中的词在80%的概率下被真实mask
- 选中的词在10%的概率下不做mask,而被随机替换成其他一个词
- 选中的词在10%的概率下不做mask,仍然保留原来真实的词
- 这使得Transformer编码器不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入标记的分布式上下文表示。
-
Next Sentence Prediction
- 利用和借鉴了Skip-thoughts方法中的句子预测问题,来学习句子级别的语义关系,具体做法则是将两个句子组合成一个序列,当然组合方式会按照下面将要介绍的方式,然后让模型预测这两个句子是否是先后近邻的两个句子,也就是会把"Next Sentence Prediction"问题建模成为一个二分类问题。训练的时候,数据中有50%的情况这两个句子是先后关系,而另外50%的情况下,这两个句子是随机从语料中凑到一起的,也就是不具备先后关系,以此来构造训练数据。句子级别的预测思路和之前介绍的Skip-thoughts基本一致,当然更本质的思想来源还是来自于word2vec中的skip-gram模型。
- 要求模型除了做上述的Masked语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是Bert的一个创新。
- 在预训练阶段,因为有两个任务需要训练:Mask-LM和Next Sentence Prediction,因此BERT的预训练过程实质上是一个Multi-task Learning,具体说来,BERT的损失函数由两部分组成,第一部分是来自于Mask-LM的单词级别的分类任务,另一部分是句子级别的分类任务,通过这两个任务的联合学习,可以使得BERT学习到的表征既有token级别的信息,同时也包含了句子级别的语义信息。具体的损失函数如下
Fine-Tuning 阶段
- 输入层:如果输入只有一个句子的话,则直接在句子的前后添加句子的起始标记位和句子的结束符号,在BERT中,起始标记都用“[CLS]”来表示,结束标记符用"[SEP]"表示,对于两个句子的输入情况,除了起始标记和结束标记之外,两个句子间通过"[SEP]"来进行区分。除了这些之外,BERT还用了两个表示当前是句子A还是句子B的向量来进行表示,对于句子A来说,每一词都会添加一个同样的表示当前句子为句子A的向量,相应的,如果有句子B的话,句子B中的每一个词也都会添加一个表示当前句子为句子B的向量。
NLP 的四大任务:一类是序列标注,这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。第二类是分类任务,比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分类类别即可。第三类任务是句子关系判断,比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,它的特点是给定两个句子,模型判断出两个句子是否具备某种语义关系;第四类是生成式任务,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需要自主生成另外一段文字。
对于种类如此繁多而且各具特点的下游NLP任务,Bert如何改造输入输出部分使得大部分NLP任务都可以使用Bert预训练好的模型参数呢?上图给出示例,对于句子关系类任务,很简单,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。从这里可以看出,上面列出的NLP四大任务里面,除了生成类任务外,Bert其它都覆盖到了,而且改造起来很简单直观。尽管Bert论文没有提,但是稍微动动脑子就可以想到,其实对于机器翻译或者文本摘要,聊天机器人这种生成式任务,同样可以稍作改造即可引入Bert的预训练成果。只需要附着在S2S结构上,encoder部分是个深度Transformer结构,decoder部分也是个深度Transformer结构。根据任务选择不同的预训练数据初始化encoder和decoder即可。这是相当直观的一种改造方法。当然,也可以更简单一点,比如直接在单个Transformer结构上加装隐层产生输出也是可以的。不论如何,从这里可以看出,NLP四大类任务都可以比较方便地改造成Bert能够接受的方式。这其实是Bert的非常大的优点,这意味着它几乎可以做任何NLP的下游任务,具备普适性,这是很强的。
最后,我们再次总结下BERT的几个主要特点:
- Transformer Encoder因为有Self-attention机制,因此BERT自带双向功能
- 因为双向功能以及多层Self-attention机制的影响,使得BERT必须使用Cloze版的语言模型Masked-LM来完成token级别的预训练
- 为了获取比词更高级别的句子级别的语义表征,BERT加入了Next Sentence Prediction来和Masked-LM一起做联合训练
- 为了适配多任务下的迁移学习,BERT设计了更通用的输入层和输出层
然后,我们再来看看BERT的工作都站在了哪些“巨人肩膀”上:
- 针对第一点,双向功能是Transformer Encoder自带的,因此这个“巨人肩膀”是Transformer
- 第二点中Masked-LM的巨人肩膀是语言模型,CBOW以及Cloze问题
- 第三点中Next Sentence Prediction的“巨人肩膀”是Skip-gram,Skip-thoughts和Quick-thoughts等工作
- 第四点中,对输入层和输出层的改造,借鉴了T-DMCA以及GPT的做法
Word vectors¶
为什么要词嵌入?
- 词嵌入是可以学习的参数
- 在不同任务中共享表示
- 低维空间更好计算——难以处理稀疏向量
Unsupervised pretraining: Pre-Neural
Word vector pretraining
Word2vec 与 NNLM 都是语言模型,但不同的是 word2vec 的重点是通过训练语言模型从而得到词向量,因此以词向量为重点对 NNLM 进行了改进优化,并且使用 CBOW 和 Skip-gram 两种方式学习词向量,GloVe 则通过构建共现矩阵,不通过传统的 SVD 进行计算复杂度较高的矩阵分解,而是使用平方误差促使点积尽可能得接近共现概率的对数,因为如果使向量点积等于共现概率的对数,向量差异变成了共现概率的比率即单词 j 出现在单词 i 的上下文中的概率,这一比值蕴含了语义信息。
相比word2vec,GloVe却更加充分的利用了词的共现信息,word2vec中则是直接粗暴的让两个向量的点乘相比其他词的点乘最大,至少在表面上看来似乎是没有用到词的共现信息,不像GloVe这里明确的就是拟合词对的共现频率。
fastText则是利用带有监督标记的文本分类数据完成训练,框架和 CBOW 一致,不过输入数据不再是 bag-of-words 的信息,还加上了 ngram 信息,这就加入了语序信息,而且输出的是当前输入文本的类别。此外还引入subword来处理长词,处理 OOV 问题。
Sentence and document vectors¶
Paragraph vector
PV-DM的全称是Distributed Memory Model of Paragraph Vectors,和CBOW类似,也是通过上下文预测下一个词,不过在输入层的时候,同时也维护了一个文档ID映射到一个向量的look-up table,模型的目的便是将当前文档的向量以及上下文向量联合输入模型,并让模型预测下一个词,训练结束后,对于现有的文档,便可以直接通过查表的方式快速得到该文档的向量,而对于新的一篇文档,那么则需要将已有的look-up table添加相应的列,然后重新走一遍训练流程,只不过此时固定好其他的参数,只调整look-up table,收敛后便可以得到新文档对应的向量了。PV-DBOW的全称则是Distributed Bag of Words version of Paragraph Vector,和Skip-gram类似,通过文档来预测文档内的词,训练的时候,随机采样一些文本片段,然后再从这个片段中采样一个词,让PV-DBOW模型来预测这个词,以此分类任务作为训练方法,说白了,本质上和Skip-gram是一样的。这个方法有个致命的弱点,就是为了获取新文档的向量,还得继续走一遍训练流程,并且由于模型主要是针对文档向量预测词向量的过程进行建模,其实很难去表征词语之间的更丰富的语义结构,所以这两种获取文档向量的方法都未能大规模应用开来。
Skip-Thought Vectors
Autoencoder pretraining
论文提出了2个方法,用无标签数据进行无监督训练的参数来初始化有监督学习的模型:一种是用基础的语言模型,另一种是用seq2seq自编码模型(sequence autoencoder, SA-LSTM),encoder输入为这个WXYZ,decoder输出为依然为WXYZ,和普通的seq2seq模型相比不同的是,这里的encoder和decoder隐层是共享的。有种提前让循环神经网络学会句子的表达,再之后根据标签去学习分类的能力的思想。
Supervised sentence embeddings
也可以有监督训练句子嵌入
-
Paragram-phrase: uses paraphrase database for supervision, best for paraphrase and semantic similarity (Wieting et al.2016)
-
InferSent: bi-LSTM trained on SNLI + MNLI (Conneau et al.2017)
-
GenSen: multitask training(skip-thought, machine translation, NLI, parsing) (Subramanian et al. 2018)
InferSent 是设计一个模型在斯坦福的SNLI(Stanford Natural Language Inference)数据集上训练,尔后将训练好的模型当做特征提取器,以此来获得一个句子的向量表示,再将这个句子的表示应用在新的分类任务上,来评估句子向量的优劣。框架结构如下图所示
这个框架最底层是一个 Encoder,也就是最终要获取的句子向量提取器,然后将得到的句子向量通过一些向量操作后得到句子对的混合语义特征,最后接上全连接层并做 SNLI 上的三分类任务。
Contextual word vectors¶
Motivation
词向量将所有的上下文都压缩到一个单一向量中
Key Idea
不是每个单词学习一个向量,而是学习依赖于上下文的向量。
context2vec
http://u.cs.biu.ac.il/~melamuo/publications/context2vec_conll16.pdf
基于 CBOW 框架,为了捕捉句子语境的本质,使用双向 LSTM 提取特征。
TagLM
- 与上文无关的单词嵌入 + RNN model 得到的 hidden states 作为特征输入
$$ \mathbf{h}{k, l}=\left[\overrightarrow{\mathbf{h}} ; \overleftarrow{\mathbf{h}}{k, 1} ; \mathbf{h}^{L M}\right] $$
- Char CNN / RNN + Token Embedding 作为 bi-LSTM 的输入
- 得到的 hidden states 与 Pre-trained bi-LM(冻结的) 的 hidden states 连接起来输入到第二层的 bi-LSTM 中
Unsupervised Pretraining for Seq2Seq
提出一种通用的提高seq2seq模型的无监督训练方法。seq2seq模型的encoder和decoder的权重用两个预训练语言模型初始化然后微调。
seq2seq模型的缺点:监督学习的语料有限,容易过拟合。本文提出了改善seq2seq效果的无监督训练方法。在微调阶段,训练任务为语言模型任务和seq2seq的联合任务。(开始fune-tuning可能导致灾难性的遗忘:模型在语言模型上的性能急剧下降,可能损害模型的泛化能力。为保证模型不在有监督语料上过拟合,在fine-tuning阶段继续单语言语言模型任务,seq2seq和语言模型任务的损失相加作为最终损失。) 此外还用了残差连接,Encoder 和 Decoder 之间也用了 Attention。
CoVe
CoVe更侧重于如何将现有数据上预训练得到的表征迁移到新任务场景中,而之前的句子级任务中大多数都只把迁移过程当做一个评估他们表征效果的手段,因此观念上有所不同
- 也有使用训练好的序列模型为其他NLP模型提供上下文的想法
- 想法:机器翻译是为了保存意思,所以这也许是个好目标?
- 使用seq2seq + attention NMT system中的Encoder,即 2层 bi-LSTM ,作为上下文提供者
- 所得到的 CoVe 向量在各种任务上都优于 GloVe 向量
- 但是,结果并不像其他更简单的NLM培训那么好,所以似乎被放弃了
- 也许NMT只是比语言建模更难?
- 或许有一天这个想法会回来?
ELMo
-
使用长上下文而不是上下文窗口学习 word token 向量(这里,整个句子可能更长)
-
学习深度Bi-NLM,并在预测中使用它的所有层
-
训练一个双向LM
-
目标是 performant 但LM不要太大
- 使用2个biLSTM层
- 这两个biLSTM NLM层有不同的用途/含义
- 低层更适合低级语法,例如
- 词性标注(part-of-speech tagging)、句法依赖(syntacticdependency)、NER
- 高层更适合更高级别的语义
- 情绪、Semantic role labeling 语义角色标记 、question answering、SNLI
- 目标函数为 \(\sum_{k=1}^{N} \log p\left(t_{k} | t_{1}, \ldots, t_{k-1}\right)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N}\right)\)
- (仅)使用字符CNN构建初始单词表示
- 如下图所示,在输入层和输出层均使用了如下CNN结构,减少了参数规模,解决了 OOV 问题,并且每一个词向量的计算可以预先做好,更能够减轻inference阶段的计算压力。
- 2048 个 char n-gram filters 和 2 个 highway layers,512 维的 projection
- 4096 dim hidden/cell LSTM状态,使用 512 dim的对下一个输入的投影
- 使用残差连接
- 绑定 token 的输入和输出的参数(softmax),并将这些参数绑定到正向和反向LMs之间
- 使用2个biLSTM层
-
ELMo学习biLM表示的特定任务组合
-
这是一个创新,TagLM 中仅仅使用堆叠LSTM的顶层,ELMo 认为BiLSTM所有层都是有用的
- \(\gamma^{t a s k}\) 衡量ELMo对任务的总体有用性,是为特定任务学习的全局比例因子
- \(\mathbf{s}^{t a s k}\) 是 softmax 归一化的混合模型权重,是 BiLSTM 的加权平均值的权重,对不同的任务是不同的,因为不同的任务对不同层的 BiLSTM 的
ULMFit
-
在大型通用领域的无监督语料库上使用 biLM 训练
-
在目标任务数据上调整 LM
-
对特定任务将分类器进行微调
-
使用合理大小的“1 GPU”语言模型,并不是真的很大
-
在LM调优中要注意很多
-
ULMFit的预训练和finetune过程主要可以分为三个阶段,分别是在大规模语料集上(比如Wikitext 103,有103million个词)先预训练,然后再将预训练好的模型在具体任务的数据上重新利用语言模型来finetune一下(这是第一次finetune,叫做LM finetune),尔后再根据具体任务设计的一个模型上,将预训练好的模型当做这个任务模型的多层,再一次finetune(这是第二次finetune,如果是分类问题的话可以叫做Classifier finetune)
-
AWD-LSTM
- \(w_{k+1}=w_{k}-\gamma_{k} \nabla f\left(w_{k}\right), w=\frac{1}{K-T+1} \sum_{i=T}^{K} w_{i}\)
- 其中T是一个阈值,而K则是总共的迭代次数,这个式子的意思就是把迭代到第T次之后,对该参数在其后的第T轮到最后一轮之间的所有值求平均,从而得到最后模型的该参数值,而相应的,普通的SGD则是直接取 \(w = w_K\) 作为最后模型的参数值。
- 并且在每个时间步之间都是用一个全连接层,并且使用DropConnect的方法随机drop掉一些连接减少一些过拟合的风险
-
微调技巧
-
discriminative fine-tuning
-
针对不同的层在训练更新参数的时候,赋予不同的学习率。这里的出发点是,一般来说,对于NLP的深度学习模型来说,不同层的表征有不同的物理含义,比如浅层偏句法信息,高层偏语义信息,因此对于不同层的学习率不同,自然就是比较合理的了。具体来说,公式如下 \(\theta_{t}^{l}=\theta_{t-1}^{l}+\eta^{l} \nabla_{\theta^{l}} J(\theta)\) ,这里的 \(n^l\) 便是不同的层 \(l\) 有不同的学习率,原文也给出了具体的选择:先指定最后一层的学习率,然后根据下式得到前面层的学习率,基本思想是让浅层的学习率要更小一些。 \(\eta^{l-1}=\frac{\eta^{l}}{2.6}\)
-
slanted triangular learning rates
- 在finetune的第一阶段,希望能够先稳定住原来已经在大规模语料集上已经预训练好的参数,所以选择一个比较小的finetune学习率;尔后希望能够逐步加大学习率,使得学习过程能够尽量快速;最后,当训练接近尾声时,逐步减小学习率,这样让模型逐渐平稳收敛(这个思想大概借鉴了2017年谷歌提出Transformer时用到的warm up的学习率调节方法,这个方法也是在训练的时候先将学习率逐步增大,尔后再逐步减小)。因此,这样一个三段论式的学习过程,用图表示如下:
-
gradual unfreezing
- 主要思想是把预训练的模型在新任务上finetune时,逐层解冻模型,也就是先finetune最后一层,然后再解冻倒数第二层,把倒数第二层和最后一层一起finetune,然后再解冻第三层,以此类推,逐层往浅层推进,最终finetune整个模型或者终止到某个中间层。这样做的目的也是为了finetune的过程能够更平稳。
-
-
因为ULMFiT中包含了两次finetune,即在新任务上用语言模型finetune和在新任务上finetune训练一个最终的task-specifi-model(比如分类器),而论文中主要把discriminative fine-tuning, slanted triangular learning rates这两个技巧用在了语言模型的finetune阶段,把最后一个gradual unfreezing的技巧应用在最终task-specifi-model的finetune阶段。
-
-
使用大型的预训练语言模型是一种提高性能的非常有效的方法
GPT
GPT采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。上图展示了GPT的预训练过程,其实和ELMO是类似的,主要不同在于两点:首先,特征抽取采用Transformer;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:只使用单词的上文进行预测,而抛开了下文。
GPT论文给了一个改造施工图如上,其实也很简单:对于分类问题,不用怎么动,加上一个起始和终结符号即可;对于句子关系判断问题,比如Entailment,两个句子中间再加个分隔符即可;对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。从上图可看出,这种改造还是很方便的,不同任务只需要在输入部分施工即可。
BERT
- 利用了真双向的Transformer
- 为了利用双向信息,改进了普通语言模型成为完形填空式的Mask-LM(Mask-Language Model)
- 利用Next Sentence Prediction任务学习句子级别信息
- 进一步完善和扩展了GPT中设计的通用任务框架,使得BERT能够支持包括:句子对分类任务、单句子分类任务、阅读理解任务和序列标注任务
Why does language modeling work so well?
- 语言建模是一项非常困难的任务,即使对人类来说也是如此。
- 预期语言模型将任何可能的上下文压缩到一个向量中,该向量概括了可能的完成后的句子。
- “They walked down the street to ???”
- 为了有机会解决这个任务,模型必须学习语法、语义、对世界事实编码等等。
- 给定足够的数据、一个巨大的模型和足够的计算,就可以完成一项合理的工作!
- 从经验上看,语言模型比翻译,自编码更有效:“Language Modeling Teaches You More Syntax than Translation Does” (Zhang et al. 2018)
Interesting properties of pretraining¶
Pretraining reduces need for annotated data
Scaling up pretraining
- 上图为 GloVe 中增加语料库规模对模型准确度的影响。
- 数据集越大越好,并且维基百科数据集比新闻文本数据集要好
- 因为维基百科就是在解释概念以及他们之间的相互关联,更多的说明性文本显示了事物之间的所有联系
- 而新闻并不去解释,而只是去阐述一些事件
Cross-lingual pretraining¶
- Much work on training cross-lingual word embeddings(Overview: Ruder et al. (2017))
- Idea: train each language separately, then align.
- Recent work aligning ELMo: Schuster et al., (NAACL 2019)
- ACL 2019 Tutorial on Unsupervised Cross-lingual Representation Learning
Cross-lingual Polyglot Pretraining
关键思想:通过在多种语言上训练一个模型,实现跨语言的词汇表和表示。
优点:易于实现,可单独进行跨语言预培训
缺点:低资源语言导致其表示学习的不够好
- LASER:Use parallel data for sentence representations(Artetxe & Schwenk, 2018)
- Multilingual BERT: BERT trained jointly on 100 languages
- Rosita:Polyglot contextual representations(Mulcaire et al., NAACL 2019)
- XLM: Cross lingualLM (Lample & Conneau, 2019)
Hands-on #1: Pretraining a Transformer Language Model¶
两个 mask
padding_mask
masks the padding tokens. It is specific to each sample in the batch:
attn_mask
is the same for all samples in the batch. It masks the previous tokens for causal transformers:
3. What is in a Representation?¶
Why care about what is in a representation?
- 带有下游任务的外部评估
- 复杂多样,随特定任务而不同
- 知道语言的表示
- 泛化到其他任务的新的输入
- 作为可能改进预训练工作的中间
- 可解释!
- 我们得到结果的原因是否正确?
- 发现偏见……
What to analyze?
Analysis Method 1: Visualization
Hold the embeddings / network activations static or frozen
- Plotting embeddings in a lower dimensional (2D/3D) space
- t-SNE van der Maaten & Hinton, 2008
- PCA projections
- Visualizing word analogies Mikolov et al. 2013
- 空间关联
- \(w_{king} - w_{man} + w_{woman} \approx w_{queen}\)
- High-level view of lexical semantics
- Only a limited number of examples
- Connection to other tasks is unclear Goldberg, 2017
- 神经元激活值与特征/标签相关
- 表示对可识别特征的学习
- 如何选择哪个神经元?
- 可解释 != 重要(Morcos et al., 2018)
- 流行于机器翻译,或其他seq2seq架构:
- 源和目标字之间的对齐。
- 长距离词-词依赖(句内注意)
- 结构上的亮点
- 拥有复杂的注意力机制可能是一件好事!
- 分层的
- 解释可能很棘手
- 只有几个例子?
- Robust corpus-wide trends? Next !
Analysis Method 2: Behavioral Probes
- RNN-based语言模型
- 主谓关系中的数字一致性
- 自然的、不自然的或不合语法的句子
- 对输出困惑度进行评估
- RNNs优于其他非神经Baseline
- 当显式地使用语法训练时,性能会提高(Kuncoro等,2018)。
- Probe:可能易受共现偏差的影响
- “dogs in the neighborhood bark(s)”
- 以前的句子可能和原来的太不一样了…
Analysis Method 3: Classifier Probes
Hold the embeddings / network activations static and train a simple supervised model on top
Probing Surface-level Features
- 给定一个句子,预测属性如
- 长度
- 这个句子里有一个单词吗
- 给出句子中的单词预测属性,例如:
- 以前见过的词,与语言模型形成对比
- 词在句子中的位置
- 检查记忆的能力
- 训练有素的、更丰富的体系结构往往运行得更好
- 在语言数据上训练能记忆的更好
Probing Morphology, Syntax, Semantics
- 形态
- 词级别的语法
- POS tags, CCG supertags
- Constituent parent, grandparent
- 部分语法
- 依赖关系
- 部分语义
- 实体关系
- 指称相同
- 角色
Probing classifier findings
-
Contextualized > non-contextualized
- 尤其是在句法任务上
- 语义任务的更紧密性能
- 双向上下文很重要
-
BERT (large) almost always gets the highest performance
- Grain of salt: 不同的上下文表示在不同的数据上训练,使用不同的架构……
Probing: Layers of the network
- RNN层:通用语言属性
- 最低层:形态学
- 中间层:语法
- 最高层次:特定于任务的语义
- Transformer 层:
- 不同任务的不同趋势;middle-heavy
- 参见Tenney et. al., 2019
Probing: Pretraining Objectives
-
语言建模优于其他非监督和监督目标。
- 机器翻译
- 依赖性解析
- Skip-thought
-
低资源设置(训练数据的大小)可能导致相反的趋势。
What have we learnt so far?
- 表征是对某些语言现象的预测:
- 翻译中的对齐,句法层次
- 有语法和没有语法的预训练:
- 有语法的预训练具有更好的性能
- 但是如果没有语法,至少还是会学到些语法概念 (Williams et al. 2018)
- 网络架构决定了表示中的内容
- 句法与Bert Transformer (Tenney et al., 2019; Goldberg, 2019)
- 跨架构的不同层次趋势
Open questions about probes
- 一个好的探测器应该寻找什么信息?
- 探索一个探测器
- 探测性能告诉我们什么?
- 很难综合各种基线的结果…
- 它本身会带来一些复杂性吗
- 线性或非线性分类。
- 行为:输入句子的设计
- 我们应该使用探针作为评估指标吗?
- 可能会破坏目的…
Analysis Method 4: Model Alterations
- 逐步删除或屏蔽网络组件
- 词嵌入维度
- 隐藏单位
- 输入-单词/短语
So, what is in a representation?
- 这要看你怎么看了!
- 可视化:
- 鸟瞰
- 很少的样品——可能会让人想起挑选
- 调查:
- 发现微粒范围内的特定属性
- 可能会引入自己的偏见…
- 网络的替代品:
- 对改进建模很有帮助,
- 可以是特定于任务的
- 可视化:
Interpretability + transferability to downstream tasks is key
4. Adaptation¶
How to adapt the pretrained model
我们可以在几个正交方向上做决定:
- 结构的修改?
- 为了适应,需要对预训练的模型体系结构进行多大的更改
- 优化方案?
- 在适应过程中需要训练哪些重量以及遵循什么时间表
- 更多信号:弱监督、多任务和 Ensembling
- 如何为目标任务获取更多的监控信号
4.1 Architecture¶
两个通用选项:
- 保持预训练模型内部不变
- 在顶部添加分类器,在底部添加嵌入,将输出作为特征
- 修改预先训练的模型内部架构
- 初始化编码器-解码器、特定于任务的修改、适配器
4.1.A – Architecture: Keep model unchanged¶
常规工作流
-
如果对目标任务无效,则删除 预训练的任务头
- 示例:从预训练语言模型中删除softmax分类器
- 不总是需要:一些适应方案重用了预训练的目标/任务,例如用于多任务学习
-
在预训练模型的顶部/底部添加特定于任务的目标层
- 简单:在预训练的模型上添加线性层
- 更复杂的:将模型输出作为单独模型的输入
- 当目标任务需要预先训练的嵌入中不可用的交互时,通常是有益的
4.1.B – Architecture: Modifying model internals¶
各种各样的原因:
- 适应结构上不同的目标任务
- 例如:使用单个输入序列(例如:语言建模)进行预训练,但是适应多个输入序列的任务(例如:翻译、条件生成……)
- 使用预训练的模型权重尽可能初始化结构不同的目标任务模型
- 例如:使用单语LMs初始化MT的编码器和解码器参数
- 特定于任务的修改
- 提供对目标任务有用的预训练模型
- 例如:添加跳过/剩余连接,注意力
- 使用较少的参数进行调整:
- 更少的参数进行微调
- 在模型参数不断增大的情况下,非常有用
- 例如:在预训练模型的层之间添加瓶颈模块(“适配器”)(Rebuffi et al., NIPS 2017;CVPR 2018)
Adapters
- 通常在于现有层平行的基础上使用剩余连接连接
- 每层放置效果最佳(底层效果较小)
- 不同的操作(卷积,自我注意)是可能的
- 特别适合 Transformer 等模块化架构(Houlsby et al., ICML 2019; Stickland and Murray, ICML 2019)
Adapters (Stickland & Murray, ICML 2019)
- 多头的关注(MH;跨层共享)与BERT的self-attention (SA)层并行使用
- 两者都被加在一起,并输入到 Layer-norm (LN)中
Hands-on #2: Adapting our pretrained model¶
Let’s see how a simple fine-tuning scheme can be implemented with our pretrained model:
- Plan
- Start from our Transformer language model
- Adapt the model to a target task:
- keep the model core unchanged, load the pretrained weights
- add a linear layer on top, newly initialized
- use additional embeddings at the bottom, newly initialized
Adaptation task
- 我们选择一个文本分类任务作为下游任务
- TREC-6: The Text REtrieval Conference (TREC) Question Classification (Li et al., COLING 2002)
- TREC consists of open-domain, fact-based questions divided into broad semantic categories contains 5500 labeled training questions & 500 testing questions with 6 labels:
- NUM, LOC, HUM, DESC, ENTY, ABBR
-
例如
-
迁移学习模型适用于这种低资源的任务
First adaptation scheme
- 修改:
- 保持模型内部不变
- 在上面添加一个线性图层
- 在底部添加额外的嵌入(分类标记)
- 计算流程:
- 模型输入:最后带有分类标记的标记化问题
- 提取与分类令牌关联的最后一个隐藏状态
- 通过线性层中的隐藏状态和softmax得到类概率
备注:
- 错误率下降得很快!在一个循环之后,我们已经有了>90%的准确率。
- Fine-tuning 在 Transfer Learning 中是高度数据高效的
- 我们的预训练和微调超参数直接来自于相关模型的文献
- Fine-tuning 往往在精确超参数的选择下是健壮的
让我们用一些关于稳健性和方差的额外词汇来结束这个实践
- 大型预训练模型(如BERT Large)在对小训练集的任务进行微调时,容易导致性能下降。
- 观察到的行为通常是“断断续续的”:要么效果很好,要么根本不管用。
- 理解这种行为的条件和原因(模型、适应方案)是一个开放的研究问题。
4.2 Optimization¶
涉及到优化本身的几个方向:
- 选择我们应该更新的权重
- Feature extraction, fine-tuning, adapters
- 选择如何以及何时更新权重
- From top to bottom, gradual unfreezing, discriminative fine-tuning
- 考虑实事求是的权衡
- Space and time complexity, performance
4.2.A – Optimization: Which weights?¶
主要问题:调整还是不调整(预先训练好的重量)?
- 不改变预先训练的重量
- Feature extraction, adapters
- 改变预训练权重
- fine-tuning
不要碰预先训练好的权重!
Feature extraction:
- (预训练的)权重被冻结
- 线性分类器是在预训练的表示上进行训练的
- 不要只使用顶层的特性!
- 学习层的线性组合
- 或者,在下游模型中使用预先训练的表示作为特性
Adapters:
- 在现有层之间添加的特定于任务的模块
- 只有 adapters 被训练
修改预训练权重!
Fine-tuning:
- 采用预训练的权值作为下游模型参数的初始化
- 整个预训练的体系结构在适应阶段进行培训
Hands-on #3: Using Adapters and freezing¶
Second adaptation scheme: Using Adapters
- Modifications:
- add Adapters inside the backbone model: Linear ⇨ ReLU ⇨ Linear with a skip-connection
- As previously:
- add a linear layer on top
- use an additional embedding (classification token) at the bottom
We will only train the adapters, the added linear layer and the embeddings. The other parameters of the model will be frozen.
4.2.B – Optimization: What schedule?¶
- 我们已经决定要更新哪些权重,但是以什么顺序以及如何更新它们?
- 动机:我们希望避免覆盖有用的预训练信息并最大化积极的知识迁移。
- 相关概念:灾难遗忘(McCloskey&Cohen,1989; French,1999)一个模型忘记了它最初受过训练的任务
指导原则:从上到下更新
- 时间上渐进:冻结
- 强度上渐进:改变学习速度
- 渐进与预训练模型:正则化
Optimization: Freezing
- 主要直觉:在不同分布和任务的数据上同时训练所有层可能导致不稳定的不良解决方案。
- 解决方案:单独训练每一层,使他们有时间适应新的任务和数据。
- 回到早期深度神经网络的分层训练(Hinton et al., 2006; Bengio et al., 2007)
相关实例
- Freezing all but the top layer (Long et al., ICML 2015)
- Chain-thaw (Felbo et al., EMNLP 2017):每次训练一层
- 先训练新增的层
- 再自底向上,每次训练一层(不再训练新增的那一层,其余层以会在不训练时被同时冻结)
- 训练所有层(包括新增层)
- Gradually unfreezing (Howard & Ruder, ACL 2018): 逐层解冻(自顶向下)
- Sequential unfreezing (Chronopoulou et al., NAACL 2019): 超参数控制微调轮数
- 微调 n 轮次新增参数(冻结除了新增层以外的层)
- 微调 k 轮次嵌入层以外的预训练层
- 训练所有层直到收敛
共性:最后对所有参数进行联合训练
Hands-on #4:Using gradual unfreezing¶
逐步解冻类似于我们之前的冻结过程。我们先冻结除新增参数外的所有模型:
然后我们在训练过程中逐渐解冻一个额外的模块,这样我们在最后就可以训练完整的模型了:
Transformer 中的逐步解冻尚未得到详细的研究
- 没有文献提到具体的超参数
残差连接可能会对方法产生影响
- 应该适应 LSTM 超参数
4.2.B – Optimization: Learning rates¶
主要想法:使用更低的学习率来避免覆盖掉有用的信息
在哪里以及在什么时候?
- 低层(捕获一般信息)
- 训练初期(模型仍需适应目标分布)
- 训练后期(模型接近收敛)
相关实例 (Howard & Ruder, ACL 2018)
Lower layers capture general information → Use lower learning rates for lower layers
- Discriminative fine-tuning
- 较低的层捕获一般信息
- 对较低的层次使用较低的学习率
- \(\eta^{(i)}=\eta \times d_{f}^{-i}\)
- Triangular learning rates
- 快速移动到一个合适的区域,然后随着时间慢慢收敛
- 也被称为 “learning rate warm-up”
- 用于 Transformer (Vaswani et al., NIPS 2017) 和 Transformer-based methods (BERT, GPT) 等
- 有利于优化;更容易摆脱次优局部极小值
4.2.B – Optimization: Regularization¶
主要思想:通过使用正则化项 \(\Omega\) 鼓励目标模型参数接近预先训练的模型参数,将灾难性遗忘最小化。
- 简单的方法:将新参数正则化,不要与预训练的参数偏离太多 (Wiese et al., CoNLL 2017)
- 更高级(elastic weight consolidation; EWC)(Kirkpatrick et al., PNAS 2017)
- 基于 Fisher信息矩阵 F ,关注对预训练任务重要的参数
- \(\Omega=\sum_{i} \frac{\lambda}{2} F_{i}\left(\theta_{i}^{\prime}-\theta_{i}\right)^{2}\)
- EWC在持续学习方面有缺点:
- 可能过度约束参数
- 计算成本与任务数量成线性关系(Schwarz et al., ICML 2018)
- 如果任务相似,我们也可以鼓励基于交叉熵的源和目标预测接近,类似于蒸馏:
- \(\Omega=\mathcal{H}\left(\hat{y}, \hat{y}^{\prime}\right)\)
Hands-on #5:Using discriminative learning¶
4.2.C – Optimization: Trade-offs¶
在选择更新哪些权重时,需要权衡以下几个方面:
A. 空间复杂度
- 特定于任务的修改、附加参数、参数重用
B. 时间复杂度
- 训练时间
C. 性能
- 经验法则:如果任务源和目标任务不相似*,使用特征提取(Peters et al., 2019)
- 否则,特征提取和微调常常效果类似(此时用微调更好)
- 在文本相似性任务上对BERT进行微调,效果明显更好
- 适配器实现了与微调相比具有竞争力的性能
- 有趣的是,Transformer 比 LSTMs 更容易微调(对超参数不那么敏感)
*不相似:某些能力(例如句子间关系建模)对目标任务是有益的,但预训练的模型缺乏这些能力能(参见后面的更多内容)
4.3 – Getting more signal¶
目标任务通常是低资源任务。我们经常可以通过组合不同的信号,提高迁移学习的效果:
- 在单个适应任务上微调单个模型
- 基本原理:用一个简单的分类目标对模型进行微调
- 其他数据集和相关任务中收集信号。
- 微调与弱监督,多任务和顺序适应
- 集成模型
- 结合几个微调模型的预测
4.3.A – Getting more signal: Basic fine-tuning¶
微调文本分类任务的简单例子:
- 从模型中提取单个定长向量:
- 第一个/最后一个令牌的隐藏状态,或者是隐藏状态的平均值/最大值
- 使用附加的分类器投影到分类空间
- 用分类目标函数训练
4.3.B – Getting more signal: Related datasets/tasks¶
- 顺序适应 Sequential adaptation
- 对相关数据集和任务进行中间微调
- 与相关任务进行多任务微调
- 如 GLUE 中的 NLI 任务
- 数据集分割
- 当模型在特定的数据片上始终表现不佳时
- 半监督学习
- 使用未标记的数据来提高模型的一致性
4.3.B – Getting more signal: Sequential adaptation¶
在相关高资源数据集进行微调
- 在拥有更多的数据的相关任务对模型进行微调
- 在目标任务上微调数据集
- 对于数据有限并且有类似任务的任务尤其有用(Phang et al., 2018)
- 提高目标任务的样本复杂度(Yogatama et al., 2019)
4.3.B – Getting more signal: Multi-task fine-tuning¶
在相关任务上共同微调模型
- 对于每个优化步骤,取样一个任务和一批数据进行训练
- 通过多任务学习训练多轮
- 只在最后几个阶段对目标任务进行微调
- 语言建模是一个相关的任务!
- 微调语言模型有助于将预训练的参数调整到目标数据集
- 即使没有预训练,也会起到帮助(Rei et al., ACL 2017)
- 可选退火比 \(\lambda\) (Chronopoulou et al., NAACL 2019)
- 作为ULMFiT中的一个单独步骤使用
4.3.B – Getting more signal: Dataset slicing¶
使用仅在数据的特定子集上训练的辅助头
- 分析模型误差
- 使用启发式方法自动识别训练数据的挑战性子集
- 与主头一起联合训练辅助头
See also Massive Multi-task Learning with Snorkel MeTaL
4.3.B – Getting more signal: Semi-supervised learning¶
使用未标记的数据可以使模型预测更加一致
- 主要思想:使对原始输入 x 和扰动输入 x' 的预测之间的距离最小化
- 扰动可以是噪声、掩蔽(Clark et al., EMNLP 2018)、数据增强,例如 back-translation (Xie et al., 2019)
4.3.C – Getting more signal: Ensembling¶
通过集成独立的微调模型达到最先进水平 - 集成模型:使用各种超参数微调模型预测的组合
<img src="imgs/image-20190905003312221.png" alt="image-20190905003312221" style="zoom:50%;" />
- 在不同的任务
- 在不同的数据集分块
- 使用不同的参数(dropout, initializations…)
- 来自预训练模型的变体(例如 cased/uncased )
- 知识蒸馏:在一个更小的模型中提取一组调优模型
- 知识蒸馏:在教师(集成模型)制作的软目标上训练学生模型 \(-\sum_{c} Q(c | X) \log \left(P_{r}(c | X)\right)\)
- 教师标签的相对概率包含教师如何概括的信息
Hands-on #6:Using multi-task learning¶
5. Downstream applications Hands-on examples¶
在本节中,我们将沿两个正交方向探索下游的应用和实际考虑:
- 迁移学习在自然语言处理中的各种应用是什么
- 文档/句子分类、令牌级分类、结构化预测和语言生成
- 如何利用多个框架和库来实现实际应用
- Tensorflow、PyTorch、Keras和第三方库,例如 fast.ai, HuggingFace……
- 句子和文档级分类
- 动手实践:文档级分类(fast.ai)
- 令牌分类
- 实践:问答(谷歌BERT & Tensorflow/TF Hub)
- 语言生成
- 实践:对话生成(OpenAI GPT & HuggingFace/PyTorch Hub)
5.A – Sequence & document level classification¶
使用 fast.ai 库完成文档分类的迁移学习
- 目标任务
- IMDB:一个二元情绪分类数据集,包含用于训练的25k个高度极性的电影评论,用于测试的25k个,以及其他未标记的数据。 http://ai.stanford.edu/~amaas/data/sentiment/
- Fast.ai 特别提供了:
- 一个预先训练的英文模型可供下载
- 一个标准化的数据块API
- 易于访问标准数据集,如IMDB
- fast.ai 基于 PyTorch
fast.ai 为视觉、文本、表格数据和协同过滤提供了许多开箱即用的高级API
库的设计是为了加快实验的速度,例如在互动计算环境中一次导入所有必需的模块,例如:
Fast.ai 包含快速设置迁移学习实验所需的所有高级模块。
- 加载数据集
- 使用语言模型和分类器的 DataBunch
- 使用语言模型损失函数,在 WikiText-103 上预训练的 AWD-LSTM 并在 IMDB 数据集上微调
一旦我们有了微调的语言模型(AWD-LSTM),我们可以创建一个文本分类器,添加一个分类头: - 将RNN的最终输出的最大值与所有中间输出(沿着序列长度)的平均值连接起来的层 - Two blocks of nn.BatchNorm1d ⇨ nn.Dropout ⇨ nn.Linear ⇨ nn.ReLU 的隐藏维度为50 - 分两步微调 - 只训练分类头,同时保持语言模型不变 - 微调整个结构 - Colab: http://tiny.cc/NAACLTransferFastAiColab
5.B – Token level classification: BERT & Tensorflow¶
用于令牌级分类的转移学习:谷歌的BERT in TensorFlow
- 目标任务:
- SQuAD: 回答问题的数据集 https://rajpurkar.github.io/SQuAD-explorer/
- 在本例中,我们将直接使用 Tensorflow checkpoint
- 例如:https://github.com/google-research/bert
- 我们使用通常的Tensorflow工作流:创建包含核心模型和添加/修改元素的模型图
- 加载检查点时要注意变量分配
语言生成迁移学习:OpenAI GPT 和 HuggingFace 库
- 目标任务:
- ConvAI2 -第二届会话智能挑战,用于训练和评估非目标导向对话系统的模型,例如闲聊
- 预训练模型的 HuggingFace 仓库
- 大型预先训练模型 BERT, GPT, GPT-2, Transformer-XL 的仓库
- 提供一个简单的方法来下载、实例化和训练PyTorch中预先训练好的模型
- HuggingFace的模型现在也可以通过PyTorch Hub访问
语言生成任务接近语言建模训练前的目标,但是:
- 语言建模前的训练只需要一个输入:一系列单词
- 在对话框设置中:提供了几种类型的上下文来生成输出序列
- 知识库:角色句
- 对话的历史:至少是用户的最后一句话
- 已生成的输出序列的标记
我们应该如何适应这种模式?
6. Open problems and future directions¶
Shortcomings of pretrained language models
-
概述:语言模型可视为一般的预训练任务;有了足够的数据、计算和容量,LM可以学到很多东西
-
在实践中,许多在文本中表示较少的东西更难学习
- 预先训练好的语言模型并不擅长
- 细粒度语言任务 (Liu et al., NAACL 2019)
- 常识(当你真的让它变得困难 Zellers et al., ACL 2019);自然语言生成(维护长期依赖、关系、一致性等)
- 当微调时,倾向于过度适应表面形成的信息;‘rapid surface learners’
大型的、预先训练的语言模型很难优化。
- 微调通常是不稳定的,并且有很高的方差,特别是在目标数据集非常小的情况下
- Devlin et al. (NAACL 2019) 指出,BERT的大版本(24层)特别容易导致性能退化;多次随机重启有时是必要的,这在(Phang et al., 2018)中也有详细的研究
当前的预训练语言模型非常大。
- 我们真的需要所有这些参数吗?
- 最近的研究表明,BERT中只需要几个注意力头(Voita et al., ACL 2019)
- 需要做更多的工作来理解模型参数
- 修剪和蒸馏是两种处理方法
- 参见:彩票假说(Frankle et al., ICLR 2019)
Pretraining tasks
语言建模目标的不足
- 并不适用于所有模型
- 如果我们需要更多的输入,就需要对这些部件进行预培训
- 例如序列到序列学习中的解码器(Song et al., ICML 2019)
- 从左到右的偏见并不总是最好的
- 考虑更多上下文(如屏蔽)的目标似乎有用(采样效率较低)
- 可能组合不同LM变种(Dong et al., 2019)
- 语义和长期上下文的弱信号与语法和短期单词共存的强信号
- 需要激励机制来促进我们所关心的编码,例如语义
更加多样化的自我监督目标
- 从计算机视觉中获得灵感
- 语言中的自我监督主要基于词的共现(Ando and Zhang, 2005)
- 不同层次意义上的监督
- 论述、文件、句子等。
- 使用其他信号,例如元数据
- 强调语言的不同性质
抽样一个补丁和一个邻居,并预测它们的空间配置(Doersch et al., ICCV 2015)
图片着色 (Zhang et al., ECCV 2016)
专门的预训练任务来教我们的模型缺少的东西
-
制定专门的预训练任务,明确学习这些关系
- 获取背景知识的单词对关系 (Joshi et al., NAACL 2019)
- 范围级表示(Swayamdipta et al., EMNLP 2018)
- 不同的预训练词嵌入是有用的(Kiela et al., EMNLP 2018)
-
其他预训练的任务可以明确地学习推理或理解
- 算术、时间、因果等;话语、叙述、谈话等。
- 预训练的表示可以以稀疏和模块化的方式连接
- 基于语言子结构(Andreas et al., NAACL 2016) 或专家 (Shazeer et al., ICLR 2017)
Need for grounded representations
- 分布式假设的局限性——很难从原始文本中学习特定类型的信息
- 人类报告偏见:不陈述显而易见的(Gordon and Van Durme, AKBC 2013)
- 常识不是写下来的
- 关于命名实体的事实
- 没有其他模式的基础
- 可能的解决方式:
- 吸收其他结构化知识(e.g. knowledge bases like ERNIE, Zhang et al 2019)
- 多模态学习(e.g. with visual representations like VideoBERT, Sun et al. 2019)
- 交互式/human-in-the-loop 的方法(e.g. dialog, Hancock et al. 2018)
Tasks and task similarity
许多任务可以表示为语言建模的变体
- 语言本身可以直接用于指定任务、输入和输出,例如,通过构建QA (McCann et al., 2018)
- 基于对话的学习,不受正向预测的监督 (Weston, NIPS 2016)
- 将NLP任务制定为完形填空预测目标 (Children Book Test, LAMBADA, Winograd, ...)
- 通过提示触发任务行为,例如翻译提示 (Radford, Wu et al. 2019); 使zero-shot适应
- 质疑NLP中的“任务”概念
- 预训练和目标任务(NLI,分类)的直觉相似性与较好的下游性能相关
- 不清楚两个任务在什么时候以及如何相似和相关
- 获得更多理解的方法之一:大规模的迁移实证研究,如 Taskonomy (Zamir et al., CVPR 2018)
- 是否有助于设计更好和更专业的预训练任务
Continual and meta-learning
- 当前迁移学习只进行一次适应。
- 最终,我们希望拥有能够在许多任务中持续保留和积累知识的模型(Yogatama et al., 2019)
- 预训练和适应之间没有区别;只有一个任务流
- 主要的挑战是:灾难性的遗忘
-
不同的研究方法:
- 记忆、正则化、任务特定权重等
-
转移学习的目的:学习一种对许多任务都通用且有用的表示方法
- 客观因素不会刺激适应的易用性(通常不稳定);没有学会如何适应它
- 元学习与迁移学习相结合可以使这一方法更加可行
- 然而,大多数现有的方法都局限于few-shot场景,并且只学习了几个适应步骤
Bias
- 偏见已经被证明普遍存在于单词嵌入和一般的神经模型中
- 大型预训练的模型必然有自己的一套偏见
- 常识和偏见之间的界限很模糊
- 我们需要在适应过程中消除这种偏见
- 一个小的微调模型应该更不易被误用
Conclusion¶
- 主题:语境中的词汇,语言模型预培训,深度模型
- 预训练具有较好的 sample-efficiency ,可按比例放大
- 对某些特性的预测——取决于您如何看待它
- 性能权衡,自顶向下
- 迁移学习易于实现,实用性强
- 仍然存在许多不足和尚未解决的问题
Reference¶
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 - 张俊林的文章 - 知乎
【论文笔记】Semi-supervised Sequence Learning
论文笔记-Unsupervised Pretraining for Sequence to Sequence Learning