我们一起读起来!!!了解过往历史文献的方法和不足之处,展望最新的文献和技术。
「标题」:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
「时间」:2018
「被引用次数」:43322(截止目前)
1 遇到问题
在计算机视觉(CV)领域,我们有Backbone网络模型。可以使用迁移学方法,即在已知任务上使用大量数据(如:ImageNet数据集)进行预训练(Pre-training)神经网络模型,然后针对相应的任务进行微调(Fine-Tuning),从而使用训练好的神经网络达到新特定目的的模型。
在这之前,NLP一直没这样的模型通过迁移学习来实现NLP任务。
「问题来了」,NLP的Backbone网络模型与Transformers有什么关系?是如何的预训练Pre-training和Fine-Tuning呢?是如何的Bidirectional(双向地) ?
2 前期提要
1)为什么要进行无监督预训练?
Vaswani et al.采用监督学习来训练用于语言翻译任务的原始 Transformer 模型,这需要成对的「源语言」和「目标语言」句子。
例如,德语到英语的翻译模型需要一个包含许多德语句子和相应英语翻译的训练数据集。收集此类文本数据可能涉及很多工作,但我们要求他们确保机器翻译质量。我们对此无能为力,或者我们可以吗?
我们实际上可以使用无监督学习来利用许多未标记的语料库。然而,在讨论无监督学习之前,让我们先看看监督表示学习的另一个问题。
原始的 Transformer 架构有一个源语言的编码器和一个目标语言的解码器。编码器学习特定于任务的表示,这有助于解码器执行翻译,即从德语句子翻译成英语。模型学习有助于最终目标的表征听起来很合理。
但是有一个问题!
如果我们想让模型执行其他任务,比如问答和语言推理,我们需要修改它的架构并从头开始重新训练它。这很耗时,尤其是对于大型语料库。
人脑会为每个特定任务学习不同的表征吗?似乎并非如此。当孩子们学习一门语言时,他们的目标不是为了完成一项任务。他们会以某种方式理解单词在许多情况下的用法,并学会如何在多种活动中调整和应用它们。
总结我们到目前为止所讨论的内容,问题是我们是否可以训练一个具有许多未标记文本的模型来生成表示并针对不同的任务调整模型,而无需从头开始训练。
答案是肯定的。
2) Transformer 架构
Transformer模型架构是由编码器( Encoder )与解码器( Decoder )组成。
1)每个编码器(左边)由 1个位置编码层(Positional Encoding)与N(= 6)个编码层( Encoder Layer )组成。
2)每个解码器(右边)由1个位置编码层与N个解码层( Decoder Layer )以及1个以全连接层和Sotfmax为激活函数组成。
重点关注:「编码器」
3)NLP常见任务
NLP常见11任务可以分为如下四类:句对分类、单句分类、问答任务、序列标注
2.1)句对分类
输入:语句1 和 语句2
输出:(语句1和语句2之间关系)类别
「案例」
输入:
前提 - 两个女人互相拥抱。
假设 - 两个女人在表达爱意。
输出:
蕴涵
备注:输出类别有蕴涵、矛盾和中立。
2.2)单句分类
输入:语句1
输出:类别
「案例」:某外卖平台收集的用户评论
输入(用户评论):抄手很难吃,慎点,巧手大拌菜推荐,真的不错
输出(评论):正面评论
2.3)问答任务
输入:问题 和 文章
输出:答案在文章中开始和结束
「案例」:问答任务
输入:
文章 - My name is Clara and I live in Berkeley.
问题 - What's my name?
输出:
回答 - Clara
2.4)序列标注
输入:语句1
输出:每一个Token类别
「案例」:NER任务
输入:小明在北京大学的燕园看了中国男篮的一场比赛
输出:B-PER,E-PER,O, B-ORG,I-ORG,I-ORG,E-ORG,O,B-LOC,E-LOC,O,O,B-ORG,I-ORG,I-ORG,E-ORG,O,O,O,O
其中,“小明 ”以PER,“北京大学”以ORG,“燕园”以LOC,“中国男篮”以ORG为类别分别挑了出来。
3 解决方案
1)BERT网络结构
BERT模型 = Transformer - Encoder
BERT-Base(左)和BERT-Large(右)模型结构参数如下:
2) 输入表示
Bert的输入向量 = token embedding + position embedding + segment embedding
为了使 BERT 处理各种下游任务,输入表示能够在一个标记序列中明确表示单个句子和一对句子(例如,)。
使用具有 30,000 个标记词汇的WordPiece 嵌入(Wu 等人,2016),每个序列的第一个标记始终是一个特殊的分类标记 (「[CLS]」)。特殊标记 ( 「[SEP]」 ) 用于分隔。
3)BERT 训练步骤
训练的两个步骤:
「预训练」(Pre-training),模型通过不同的预训练任务在未标记数据上进行训练。
「微调」(Fine-Tuning),首先使用预训练的参数初始化 BERT 模型,然后使用来自下游任务的标记数据对所有参数进行微调。
3.1)无监督预训练(Pre-training)
「任务1」:屏蔽语言模型 Masked Language Model(「MLM」)
MLM任务可以理解为完形填空(Cloze task)。
用 [MASK] 标记替换文本中 15% 的单词,然后该模型预测被 [MASK] 标记替换的原始单词。
除了屏蔽之外,屏蔽还混合了一些东西,以改进模型稍后进行微调的方式,因为 [MASK] 令牌在训练和微调之间造成了不匹配。
在这个模型中,我们在编码器输入的顶部添加了一个分类层,使用全连接和 softmax 层计算输出的概率。
「任务2」:下一句预测Next Sentence Prediction (「NSP」)
在这个NSP任务中,提供两个句子目标是预测第二个句子是否是原始文本中第一个句子的下一个后续句子。
在训练 BERT 期间,我们从原始句子中获取 50% 的数据是下一个后续句子(标记为 isNext),并在 50% 的时间中获取不是原始文本中下一个句子的随机句子(标记为作为NotNext)。
由于这是一个分类任务,所以我们的第一个标记是 [CLS] 标记。
该模型还使用 [SEP] 标记来分隔我们传入模型的两个句子。
汇总以下,
[CLS] — 每个序列的第一个标记。最终隐藏状态是用于分类任务的聚合序列表示。
[SEP] — 分隔符,例如,分隔问题和相关段落。
[MASK] — 隐藏一些输入标记的标记
3.2) 监督微调BERT
预训练的 BERT 模型可以为单个文本或文本对生成表示,这得益于特殊的标记和两种无监督语言建模预训练。
对于每个任务,特定于任务的输入和输出只需插入 BERT,所有参数都经过端到端的微调。
在BERT微调下实现四大类任务功能(以下):
由此,我们也解释是如何的预训练Pre-training和Fine-Tuning的,是如何的Bidirectional (双向)Transformers的。
尤其是通过「无监督预训练目标」和「下游任务特定微调的自注意力机制」。
4)训练细节
发现以下可能范围值适用于所有任务:
批大小:16,32
学习率(Adam):5e-5,3e-5,2e-5
epoch数:2,3,4
未完,下期见。。。
针对人群:
不知道如何「入门算法 「,对于」初学者」这里有完整的学习路径图(历史中「经典」模型文献和论文复现),完成后将成为合格「初级算法工程师」。
不知道「行业解决方案」,对于「算法工程师」这里有具体的行业中落地方案和呈现出商业价值,阅读后提供新的解决方法想法和成为「算法专家」。
蓦然回首,自己从算法(数学)专业学习以及工作已十年有余。
同时希望大家成为算法经历者、分享者和创造者。
领取专属 10元无门槛券
私享最新 技术干货