数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
八、BERT [2018]
语言模型预训练已被证明对改善许多自然语言处理任务是有效的。这些任务包括:
sentence-level
的任务,如自然语言推理natural language inference
和转述paraphrasing
,其目的是通过整体分析来预测句子之间的关系。token-level
的任务,如命名实体识别named entity recognition: NER
和SQuAD
问答question answering: QA
,其中模型需要在token-level
产生细粒度的输出。
目前有两种策略将预训练的
language representation
应用于下游任务:feature-based
和fine-tuning
:feature-based
方法(如ELMo
)使用tasks-specific
架构,其中使用预训练的representation
作为额外的特征。fine-tuning
方法(如GPT
),引入了最小的task-specific
参数,并通过简单地微调pretrained parameter
从而对下游任务进行训练。
在之前的工作中,这两种方法在
pre-training
期间共享相同的目标函数,其中它们使用单向语言模型来学习通用的language representation
。即,
feature-based
方法和fine-tuning
方法采用相同的预训练方式,但是在应用到下游任务阶段才有所差异。论文
《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
认为:目前的技术严重限制了pre-trained representation
的能力,特别是对于微调fine-tuning
方法。主要的限制是:标准的语言模型是单向的,这就限制了在预训练中可以使用的架构。例如,在GPT
中,作者使用了一个从左到右的架构,其中在Transformer
的self-attention layer
中每个token
只能关注前面的token
。- 对于
sentence-level
的任务,这样的限制是次优的。 - 对于
token-level
的任务(如SQuAD
问答任务),当应用基于微调的方法时,这样的限制可能是毁灭性的。因为在这种情况下,从两个方向融合上下文是至关重要的(因为可能需要关注后面的token
而不是前面的,从而找到问题的答案)。
在论文
《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
中,作者通过从Transfromer
中提出Bidirectional Encoder Representation: BERT
来改善基于微调的方法。BERT
通过提出一个新的预训练目标来解决前面提到的单向约束:masked language model: MLM
任务,其灵感来自Cloze
任务(即,完形填空任务)。MLM
从输入中随机掩码一些token
,任务的目标是仅根据上下文来预测被掩码单词的原始vocabulary id
。与从左到右的语言模型预训练不同的是,MLM
目标允许representation
同时融合左侧和右侧的上下文,这使得我们可以预训练一个深度的双向Transformer
。除了MLM
,论文还引入了一个next sentence prediction: NSP
任务来联合预训练text-pair representation
。论文贡献如下:
- 作者证明了双向预训练对
language representation
的重要性。与《Improving language understanding with unsupervised learning》
使用单向语言模型进行预训练不同,BERT
使用MLM
来实现pre-trained deep bidirectional representation
。这也与ELMo
相反,后者使用独立训练的从左到右和从右到左的语言模型的浅层拼接shallow concatenation
。 - 作者表明,预训练的
representation
消除了许多严重工程化的task-specific
架构的需要。BERT
是第一个基于微调的representation model
,它在大量的sentence-level
和token-level
任务上取得了SOTA
的性能,超过了许多具有task-specific
架构的系统。 BERT
推动了11
项NLP
任务的state-of-the-art
。作者还报告了BERT
的大量消融实验,表明BERT
模型的双向特性是唯一最重要的新贡献。
相关工作:
feature-based
方法:几十年来,学习广泛适用的word representation
一直是一个活跃的研究领域,包括非神经方法和神经方法。预训练的word embeddin
被认为是现代NLP
系统的一个组成部分,与从头开始学习的embedding
相比,有很大的改进。这些方法已被推广到更粗的粒度,如
sentence embedding
或paragraph embedding
。与传统的word embedding
一样,这些学到的representation
通常也被用作下游模型的特征。ELMo
沿着不同的维度推广了传统的word embedding
研究。他们提出从语言模型中提取context-sensitive
的特征。当将contextual word embedding
与现有的task-specific
架构相结合时,ELMo
推进了几个主要NLP benchmark
的SOTA
,包括SQuAD
上的问答、情感分析sentiment analysis
和命名实体识别named entity recognition
。fine-tuning
方法:最近从语言模型中进行迁移学习的一个趋势是,在为下游监督任务微调同一模型之前,在语言模型目标上预训练该模型架构。这些方法的优点是,只需要从头开始学习非常少的参数。至少部分由于这一优势,GPT
在GLUE benchmark
的许多sentence-level
任务上取得了当时SOTA
的结果。从监督数据
supervised data
迁移学习:虽然无监督预训练的优势在于几乎有不限量的数据可用,但也有工作表明,可以从具有大型数据集的监督任务中有效地迁移学习,如自然语言推理和机器翻译machine translation
。在NLP
之外,计算机视觉领域的研究也证明了从大型预训练模型进行迁移学习的重要性,其中一个有效的秘方是:对基于ImageNet
预训练的模型进行微调。
8.1 模型
8.1.1 模型架构
BERT
的模型架构是一个多层的、双向的Transformer encoder
,基于《Attention is allyou need》
描述的原始实现。由于最近Transformer
的使用已经变得无处不在,而且我们的实现实际上与原版相同,因此我们将省略对模型架构的详细描述,请读者参考《Attention is allyou need》
以及《The Annotated Transformer》
等优秀出版物。在这项工作中,我们将层数(即
Transformer block
)记做 $ L $ 、hidden size
记做 $ H $ 、self-attention head
数记做 $ A $ 。 在所有情况下,我们将feed-forward/filter size
设为 $ 4H $ ,即, $ H=768 $ 时设为的 $ 3072 $ 、 $ H=1024 $ 时设为4096
。我们主要报告两种模型尺寸的结果:BERT_BASE
: $ L=12 $ , $ H=768 $ , $ A=12 $ ,总的参数规模110M
。BERT_LARGE
: $ L=24 $ , $ H=1024 $ , $ A=16 $ ,总的参数规模340M
。
前馈神经网络是一个双层的全连接网络,输入维度为
$ H $ 、中间层的维度为 $ 4H $ 、输出层的维度为 $ H $ 。BERT_BASE
被选择为具有与GPT
相同的模型大小,以便于比较。然而,关键的是,BERT Transformer
使用的是双向自注意力,而GPT Transformer
使用的是受约束的自注意力(每个token
只能关注其左侧的上下文)。我们注意到,在文献中,双向Transformer
通常被称为Transformer encoder
,而只关注左侧上下文的Transformer
被称为Transformer decoder
(因为它可以用于文本生成)。BERT
、GPT
和ELMo
之间的比较如下图所示。
8.1.2 Input Representation
我们的
input representation
能够在一个token
序列中明确地表示单个文本句子或一对文本句子(如,[Question, Answer]
)。对于一个给定的token
,它的input representation
是由相应的token embedding
、segment emebdding
和position embedding
相加而成的。下图给出了我们的input representation
的直观表示。具体而言:
我们使用具有
30k
个token
的vocabulary
的WordPiece embedding
(《Google’s neural machine translation system: Bridging the gap between human and machine translation》
)。我们用##
指示被拆分的word piece
。我们使用学到的
positional embedding
,最大可以支持长度为512
个token
的序列。每个序列的第一个
token
总是特殊的classification embedding
,即[CLS]
。与这个token
相对应的final hidden state
(即Transformer
的输出)被用作分类任务的aggregate sequence representation
。对于非分类任务,这个向量被忽略。sentence pair
被打包成一个单一的序列。我们以两种方式区分这些句子。首先,我们用一个特殊的
token
(即,[SEP]
)将这两个句子分开。(注意,每个句子的结尾都有一个[SEP]
)其次,我们在第一句的每个
token
上添加一个学到的segment A Embedding
,在第二句的每个token
上添加一个学到的segment B Embedding
。假设
segment
编号为1
和2
,那么segment A embedding
就是segment=1
对应的embedding
,segment B embedding
就是segment=2
对应的embedding
。
对于单个句子的输入,我们只使用
segment A Embedding
。注意,segment A
也称作sentence A
,因为这里一个句子就是一个segment
。进一步地,我们是否可以对句子内部的子句、或者短语也作为更细粒度的
segment
来提供embedding
?
8.1.3 预训练任务
- 与
ELMo
和GPT
不同,我们没有使用传统的从左到右、或从右到左的语言模型来预训练BERT
。相反,我们使用两个新颖的无监督预训练任务对BERT
进行预训练。
a. Task1: Maksed LM
直观而言,我们有理由相信:深度双向模型严格来说比
left-to-right
的模型、或浅层拼接了left-to-right and right-to-left
的模型更强大。不幸的是,标准的conditional language model
只能从左到右或从右到左进行训练,因为双向条件会让每个词在multi-layered context
中间接地 "看到自己" 。为了训练深度双向
representation
,我们采取了一种直接的方法,即随机掩码一定比例的input token
,然后只预测那些被掩码的token
。我们把这个过程称为 "masked LM
"(MLM
),尽管它在文献中经常被称为Cloze task
。在这种情况下,对应于mask token
的final hidden vector
被馈入output softmax
(输出空间为整个vocabulary
),就像在标准语言模型中一样。在我们所有的实验中,对于每个序列我们随机掩码15%
的WordPiece token
。与降噪自编码器不同的是,我们只预测被掩码的单词,而不是重建整个输入。
被掩码的
token
填充以[MASK]
。尽管这确实允许我们获得一个双向的预训练模型,但这种方法有两个缺点:
首先,我们在预训练和微调之间产生了不匹配
mismatch
,因为在微调过程中从来没有看到[MASK]
这个token
。为了缓解这一问题,我们并不总是用实际的
[MASK] token
来替换被掩码的token
。相反,训练数据生成器随机选择15%
的token
(例如,在句子"my dog is hairy"
中它选择了hairy
),然后它将执行以下程序:80%
的情况下用[MASK] token
替换该词,例如,"my dog is hairy" --> "my dog is [MASK]"
。10%
的情况下用一个随机的词来替换这个词,例如,"my dog is hairy" --> "my dog is apple"
。10%
的情况下保持该词不变,例如,"my dog is hairy" --> "my dog is hairy"
。这样做的目的是为了使representation
偏向于实际观察到的单词。
Transformer encoder
不知道哪些单词会被要求预测、哪些单词已经被随机词所取代,所以它被迫保持每个input token
的distributional contextual representation
。此外,由于随机替换只发生在所有token
的1.5%
(即15%
的10%
),这似乎并不损害模型的语言理解能力。似乎论文并没有实验来验证这一点。
其次,每个
batch
中只有15%
的token
被预测,这表明可能需要更多的pre-training step
来使模型收敛。在实验部分,我们证明了MLM
的收敛速度确实比left-to-right
的模型(预测每个token
)稍慢,但是MLM
模型的经验改进empirical improvement
远远超过了增加的训练成本。
b. Task2: Next Sentence Prediction
许多重要的下游任务,如
Question Answering: QA
和Natural Language Inference: NLI
,都是基于对两个文本句子之间关系的理解,而语言建模并没有直接捕获到这一点。为了训练一个能够理解句子关系的模型,我们预训练了一个二元化的next sentence prediction task
,该任务可以从任何单语种的语料库中简单地生成。具体而言,在为每个预训练样本选择句子
A
和句子B
时:50%
的情况下句子B
是紧随句子A
的实际的下一句。50%
的情况下句子B
是语料库中的一个随机句子。
例如:
x Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP] Label = IsNext Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP] Label = NotNext
我们完全随机地选择
NotNext
句子,最终的预训练模型在这个任务中达到了97% ~ 98%
的准确率。尽管该任务很简单,但我们在实验中证明,针对这个任务的预训练对QA
和NLI
都非常有利。实际上后续的论文表明:
NSP
预训练任务是没什么作用甚至是有害的。
8.1.4 预训练程序
预训练程序主要遵循现有的关于语言模型预训练的文献。对于预训练语料库,我们使用
BooksCorpus
(800M
单词)和English Wikipedia
(2500M
单词)的组合。对于Wikipedia
,我们只提取文本段落,忽略了list
、table
、和header
。至关重要的是,我们使用document-level
语料库而不是混洗过的sentence-level
语料库(如Billion Word Benchmark
)从而提取长的连续文本序列。为了生成每个训练输入序列,我们从语料库中采样两个区间
span
的文本,我们称之为 "句子",尽管它们通常比单个句长得多(但也可能更短)。- 第一个句子接受
Segment A Embedding
,第二个句子接受Segment B Embedding
。 50%
的情况下句子B
是紧随句子A
之后的实际的下一句,50%
的情况下句子B
是一个随机的句子。这是用于next sentence prediction
任务。- 这两个句子被采样,使得合并后的长度小于等于
512
个token
。
语言模型的
masking
是在WordPiece tokenization
之后进行的,其中使用15%
的均匀的掩码率masking rate
,并没有对部分word piece
给予特殊考虑。- 第一个句子接受
我们用
batch size = 256
来训练一百万个step
,每个mini-batch
有256 * 512 = 128000
个token
(这里是近似值,精确值为131072
),因此相当于在0.33B
单词的语料库上训练40
个epoch
。- 我们使用
Adam
优化器,学习率为 $ 10^{-4} $ , $ \beta_1=0.9, \beta_2=0.999 $ ,L2
权重衰减为0.01
。学习率在前10000
步进行warmup
,学习率线性衰减。 - 我们在所有
layer
上使用0.1
的dropout rate
。 - 遵循
GPT
,我们使用gelu
激活函数不是标准的relu
。 training loss
是mean masked LM likelihood
和mean next sentence prediction likelihood
之和。
- 我们使用
BERT_BASE
的训练在Pod configuration
的4 Cloud TPUs
上进行(共16
个TPU
芯片)。BERT_LARGE
的训练在16 Cloud TPUs
上进行(共64
个TPU
芯片)。BERT_BASE
和BERT_LARGE
的预训练都需要4
天的时间来完成。
8.1.5 微调程序
对于
sequence-level
分类任务,BERT
的微调是直接的。为了获得输入序列的固定维度的、被池化的representation
,我们采用输入的第一个token
的final hidden state
,这对应于特殊的[CLS]
对应的word embedding
。我们把这个向量表示为 $ \mathbf{\vec c}\in \mathbb R^H $ 。在微调过程中,唯一新增的参数是分类层 $ \mathbf W\in \mathbb R^{K\times H} $ ,其中 $ K $ 是类别标签的数量。标签概率 $ \mathbf{\vec p}\in \mathbb R^K $ 是用标准的softmax
计算的,即 $ \mathbf{\vec p} = \text{softmax}\left(\mathbf{\vec c}\mathbf W^\top\right) $ 。BERT
和 $ \mathbf W $ 的所有参数都是联合微调的,以使ground-truth
标签的对数概率最大化。对于
span-level
和token-level
的预测任务,上述过程必须以task-specific
的方式稍作修改。细节在实验部分给出。对于微调,模型的大部分超参数与预训练时相同,除了
batch size
、learning rate
和训练epoch
的数量。dropout rate
始终保持在0.1
。最佳的超参数值是task-specific
的,但我们发现以下数值范围在所有任务中都能很好地发挥作用:Batch size
为16 、32
;Learning rate (Adam)
为5e-5、3e-5、2e-5
;epoch
数量为3、4
。微调采用更小的
batch size
、更小的学习率、更少的epoch
。我们还观察到:大数据集(例如,
100k+
带标记的训练样本)对超参数选择的敏感性远低于小数据集。微调通常是非常快的,所以简单地对上述超参数进行暴力搜索并选择在验证集上表现最好的模型是合理的。
8.1.6 BERT 和 GPT 的对比
与
BERT
最具可比性的、现有的预训练方法是OpenAI GPT
,它在一个大型文本语料库上训练了一个left-to-right
的Transformer
语言模型。事实上,BERT
中的许多设计决定都是有意选择的,以尽可能地接近GPT
,从而使这两种方法能够得到最低限度的比较。我们工作的核心论点是:我们提出的两个新颖的预训练任务占了经验改进的大部分,但我们确实注意到BERT
和GPT
的训练方式还有几个不同之处:GPT
是在BooksCorpus
(800M
单词)上训练的,而BERT
是在BooksCorpus
和Wikipedia
(2500M
单词)上训练的。通常而言,更大的预训练语料库会带来更好的微调效果。
GPT
使用句子分隔符sentence separator
([SEP]
)和classifier token
([CLS]
),它们仅在微调期间引入;而BERT
在预训练期间学习[SEP]
、[CLS]
和segment A/B embedding
。GPT
被训练了1M
个step
,batch size
为32000
个单词;BERT
被训练了1M
个step
,batch size
为128000
个词。GPT
在所有微调实验中使用相同的学习率5e-5
;BERT
选择了task-specific
的、用于微调的学习率,这个学习率在验证集上表现最好。
为了隔绝
isolate
这些差异的影响,我们在实验部分进行了大量消融实验,证明大部分的改进实际上来自新颖的预训练任务。
8.2 实验
8.2.1 GLUE 数据集
General Language Understanding Evaluation: GLUE
基准是各种自然语言理解natural language understanding
任务的集合。大多数GLUE
数据集已经存在多年,但GLUE
的目的是:- 首先,对这些数据集进行规范的
Train/Dev/Test
的拆分。 - 其次,建立一个
evaluation server
从而缓解评估不一致和测试集过拟合的问题。GLUE
并未提供测试集的标签,用户必须将他们的预测上传到GLUE server
进行评估,并对提交的次数有所限制。
- 首先,对这些数据集进行规范的
GLUE benchmark
包括以下数据集:Multi-Genre Natural Language Inference: MNLI
:是一个大规模、众包式的蕴含分类entailment classification
任务。给定一对句子,任务的目标是:预测第二个句子相对于第一个句子是蕴含关系entailment
、矛盾关系contradiction
还是中性关系neutral
。Quora Question Pairs: QQP
:是一个二元分类任务,任务的目标是确定在Quora
上提出的两个问题是否在语义上等价semantically equivalent
。Question Natural Language Inference: QNLI
:是Stanford Question Answering Dataset
的一个版本,它被转换为一个二元分类任务。正样本是sentence
确实包含正确答案的(question, sentence) pair
,负样本是sentence
中不包含答案的(question, sentence) pair
。Stanford Sentiment Treebank: SST-2
:是一个二元单句分类任务,由从电影评论中提取的句子组成,并具有人类对这些评论的情感的注释annotation
。Corpus of Linguistic Acceptability: CoLA
:是一个二元单句分类任务,任务的目标是预测一个英语句子是否在语言上 "acceptable
"。Semantic Textual Similarity Benchmark: STS-B
:是一个从新闻headlines
和其他来源抽取的sentence pair
的集合。它们被标记为1 ~ 5
分,表示这两个句子在语义上的相似程度。Microsoft Research Paraphrase Corpus: MRPC
:从在线新闻来源中自动提取的sentence pair
组成,并由人类注释该sentence pair
是否具有语义上的等价性。Recognizing Textual Entailment: RTE
:是一个类似于MNLI
的二元蕴含任务,但训练数据少得多。Winograd NLI: WNLI
:是一个小型自然语言推理natural language inference
数据集,源于《The winograd schema challenge》
。GLUE
的网页指出:这个数据集的构建存在问题,而且每一个提交给GLUE
的训练好的系统的表现都比一个简单的baseline
更差。这个简单的baseline
直接预测majority class
,并达到65.1
的准确率。因此,出于对OpenAI GPT
的公平比较,我们排除了这个数据集。对于我们的GLUE submission
,我们总是预测majority class
。即,对于每一个测试样本,预测它的类别为训练集中出现概率最高的那个类别(即
majority class
)。
为了在
GLUE
上进行微调,我们根据前文所述来表示输入序列或sequence pair
,并使用对应于第一个输入token
([CLS]
)的final hidden vector
$ \mathbf{\vec c}\in \mathbb R^H $ 作为aggregate representation
。这在下图(a)
和(b)
中得到了直观的证明。在微调过程中引入的唯一新参数是一个分类层 $ \mathbf W\in \mathbb R^{K\times H} $ ,其中 $ K $ 是类别标签的数量。我们用 $ \mathbf{\vec c} $ 和 $ \mathbf W $ 计算一个标准的分类损失,即 $ \log\left(\text{softmax}\left(\mathbf{\vec c}\mathbf W^\top \right)\right) $ 。因为
GLUE
数据集都是文本分类任务。对于所有的
GLUE
任务,我们使用batch size = 32
以及3
个epoch
。对于每个任务,我们用
5e-5、4e-5、3e-5、2e-5
的学习率进行微调,并选择在验证集上表现最好的一个。此外,对于
BERT_LARGE
,我们发现微调在小数据集上有时是不稳定的(也就是说,一些runs
会产生退化degenerate
的结果),所以我们运行了几个随机重启random restart
,并选择了在验证集上表现最好的模型。通过随机重启,我们使用相同的
pre-trained checkpoint
,但在微调期间进行不同的数据混洗和classifier layer
初始化 。我们注意到,
GLUE
数据集不包括测试集的标签,我们只为每个BERT_BASE
和BERT_LARGE
做一次evaluation server submission
。
从图
(a)
中看到,在微调期间只有一个[SEP]
符号,这与预训练阶段不一致。在预训练阶段每个句子的末尾都添加一个[SEP]
。这种不一致是否影响效果?可以通过实验来评估。实验结果如下表所示:
BERT_BASE
和BERT_LARGE
在所有任务上的表现都大大超过了现有的系统,分别比SOTA
的系统获得了4.4%
和6.7%
的平均精确度提升。请注意,BERT_BASE
和OpenAI GPT
在attention masking
之外的模型架构方面几乎是相同的。对于最大和最广泛报道的
GLUE
任务MNLI
,BERT
(这里是BERT_LARGE
)相比SOTA
获得了4.7%
的绝对提升。在
GLUE
的官方排行榜上,BERT_LARGE
获得了80.4
分;相比之下,排在榜首的系统(即OpenAI GPT
)截至本文撰写之日获得了72.8
分。下图中的
Average
稍有差异,因为这里我们排除了有问题的WNLI
数据集。值得注意的是,
BERT_LARGE
在所有任务中都显著优于BERT_BASE
,即使是那些训练数据非常少的任务。BERT
模型大小的影响将在下面的实验中进行更深入的探讨。
8.2.2 SQuAD v1.1
Standford Question Answering Dataset: SQuAD
是一个由10
万个众包的(question, answer) pair
组成的集合。给定一个问题和来自维基百科中包含答案的段落,任务的目标是预测该段落中的答案文本的区间answer text span
。例如:xxxxxxxxxx
Input Question: Where do water droplets collide with ice crystals to form precipitation? Input Paragraph: ... Precipitation forms as smaller droplets coalesce via collision with other rain drops or ice crystals within a cloud. ... Output Answer: within a cloud这种类型的区间预测任务
span prediction task
与GLUE
的序列分类任务截然不同,但我们能够以一种直接的方式使BERT
在SQuAD
上运行。就像
GLUE
一样,我们将输入的问题和段落表示为一个single packed sequence
,其中question
使用segment A embedding
,段落使用segment B embedding
。在微调过程中学习到的唯一的新参数是一个start vector
$ \mathbf{\vec s}\in \mathbb R^H $ 和一个end vector
$ \mathbf{\vec e}\in \mathbb R^H $ 。令第 $ i $ 个input token
在BERT
中的的final hidden vector
表示为 $ \mathbf{\vec t}_i\in \mathbb R^H $ 。如Figure 3(c)
所示。然后,单词 $ i $ 是answer span
的起点start
的概率被计算为 $ \mathbf{\vec t}_i $ 和 $ \mathbf{\vec s} $ 的内积,然后在当前段落中所有单词之上取softmax
:其中
$ j $ 取值为从段落开始到段落结束。同样的公式用于
answer span
的终点end
,最大得分的span
被用作预测。训练目标是正确的起点位置和终点位置的对数可能性。这里假设起点和终点之间是相互独立的。实际上这种假设通常不成立,终点和起点之间存在关联,如终点的位置大于等于起点。
我们用
5e-5
的学习率和batch size = 32
训练了3
个epoch
。在推理时,由于终点预测并没有考虑以起点为条件,我们增加了终点必须在起点之后的约束条件,但没有使用其他启发式方法。tokenized labeled span
被调整回原始的untokenized input
以进行评估。因为经过了
tonenization
之后,原始的单词被拆分为word piece
,这将影响span
的位置。结果如下表所示。
SQuAD
采用了高度严格的测试程序,提交者必须手动联系SQuAD
的组织者,在一个隐藏的测试集上运行他们的系统,所以我们只提交了我们最好的系统进行测试。下表中显示的结果是我们第一次也是唯一一次向SQuAD
提交的测试结果。我们注意到:
SQuAD
排行榜上的榜首结果没有最新的公开的系统描述,而且在训练他们的系统时允许使用任何公共数据。因此,我们在提交的系统中使用了非常适度的数据增强:在SQuAD
和TriviaQA
上联合训练。我们表现最好的系统相比排行榜上榜首的系统高出
+1.5 F1
(以ensembling
系统的方式 )和+1.7 F1
(以single
系统的方式)。事实上,我们的单一BERT
模型在F1
得分方面优于top ensemble system
。如果我们只对SQuAD
进行微调(不包括TriviaQA
),我们会损失0.1-0.4 F1
,但仍然以很大的优势胜过所有现有系统。BERT ensemble
使用了7
个模型,它们分别使用不同的预训练checkpoint
和fine-tuning seed
。
8.2.3 Named Entity Recognition
为了评估
token tagging
任务的性能,我们在CoNLL 2003
命名实体识别(NER
)数据集上对BERT
进行了微调。这个数据集由20
万个训练单词组成,这些单词被标注为人物Person
、组织Organization
、位置Location
、杂项Miscellaneous
、或其他Other
(非命名实体)。为了进行微调,我们将每个
token
$ i $ 的final hidden representation
$ \mathbf{\vec t}_i\in \mathbb R^H $ 馈入分类层。预测不以周围的预测为条件(即,non-autoregressive
和no CRF
)。为了与
WordPiece tokenization
兼容,我们将每个CoNLL-tokenized input word
馈入我们的WordPiece tokenizer
,并使用与第一个sub-token
对应的hidden state
作为分类器的输入。例如:xxxxxxxxxx
Jim Hen ##son was a puppet ##eer I-PER I-PER X O O O X其中
X
没有预测。Figure 3(d)
中也给出了一个直观的表示。在NER
中使用了cased WordPiece model
(即,保留字母的大小写) ,而在所有其他任务中则使用了uncased model
(即,所有字母转化为小写)。
结果如下表所示。
BERT_LARGE
在CoNLL-2003 NER Test
中优于现有的SOTA
(Cross-View Training with multi-task learning
)达到+0.2
的改进。如果在
BERT
的final hidden representation
之上再接入自回归或CRF
,预期将得到更好的效果。
8.2.4 SWAG
Situations With Adversarial Generations: SWAG
数据集包含11.3
万个sentence-pair completion
的样本,评估了grounded commonsense inference
。给定视频字幕数据集中的一个句子,任务是在四个选项中决定最合理的延续
concatenation
。例如:xxxxxxxxxx
A girl is going across a set of monkey bars. She (i) jumps up across the monkey bars. (ii) struggles onto the bars to grab her head. (iii) gets to the end and stands on a wooden plank. (iv) jumps up and does a back flip.将
BERT
应用于SWAG
数据集类似于GLUE
。对于每个样本,我们构建四个输入序列,每个序列都包含给定句子(句子A
)和一个可能的延续(句子B
)的拼接。我们引入的唯一task-specific
参数是一个向量 $ \mathbf{\vec v}\in \mathbb R^H $ ,它与final aggregate representation
$ \mathbf{\vec c}_i\in \mathbb R^H $ 的内积表示每个选项 $ i $ 的得分。我们计算在四个选项上的softmax
:我们用
2e-5
的学习率和batch size = 16
对模型进行了3
个epoch
的微调。结果如下表所示。BERT_LARGE
比作者的baseline
(即,ESIM+ELMo
系统)要提高27.1%
。
8.2.5 消融研究
- 尽管我们已经展示了极其强大的经验结果,但迄今为止所提出的结果并没有将
BERT
框架的每个方面aspect
的具体贡献分离出来。这里我们对BERT
的一些方面进行了消融实验,以便更好地了解其相对重要性。
a. 预训练任务的效果
我们的核心主张
claim
之一是BERT
的深度双向性deep bidirectionality
,这是由masked LM pre-training
实现的并且是BERT
与以前的工作相比最重要的一个改进。为了证明这一主张,我们评估了两个新模型,它们使用了与BERT_BASE
完全相同的预训练数据、微调方案、以及Transformer
超参数。No NSP
:该模型使用MLM
任务预训练,但是没有NSP
任务。LTR & No NSP
:该模型使用Left-to-Right: LTR
的语言模型来训练,而不是使用MLM
来训练 。在这种情况下,我们预测每一个input word
,不应用任何masking
。在微调时也应用了left-only
约束,因为我们发现:用left-only-context
进行预训练然后用bidirectional context
进行微调总是更糟糕。此外,这个模型没有使用NSP
任务进行预训练。这与
OpenAI GPT
有直接的可比性,但使用了我们更大的训练数据集、我们的input representation
、以及我们的微调方案。BERT
在预训练期间学习[SEP]
、[CLS]
和segment A/B embedding
,而GPT
仅在微调期间学习这些input representation
。
结果如下表所示。
我们首先检查了
NSP
任务带来的影响。可以看到:去掉NSP
对QNLI
、MNLI
和SQuAD
的性能有很大的伤害。这些结果表明,我们的预训练方法对于获得前面介绍的强大的经验结果至关重要。后续的
XLNet
和RoBERTa
都表明:NSP
任务不重要。而且RoBERTa
的作者认为:BERT
得出NSP
任务重要的原因是,BERT
的输入是两个句子的拼接,因此如果此时没有NSP
任务则效果较差。在RoBERTa
中,由于没有NSP
任务,因此预训练样本就是一个完整的、来自单个文件的文档块。接下来,我们通过比较 "
No NSP
"和 "LTR & No NSP
"来评估训练bidirectional representation
的影响。LTR
模型在所有任务上的表现都比MLM
模型更差,在MRPC
和SQuAD
上的下降幅度非常大。- 对于
SQuAD
,直观而言,LTR
模型在span
预测和token
预测方面的表现非常差,因为token-level hidden state
没有右侧的上下文。 - 对于
MRPC
而言,不清楚这种糟糕的表现是由于数据量小还是由于任务的性质,但是我们发现这种糟糕的表现在多次随机重启的full
超参数扫描中是一致的。
- 对于
为了加强
LTR
系统,我们尝试在它上面添加一个随机初始化的BiLSTM
进行微调。这确实大大改善了SQuAD
的结果,但结果仍然比预训练的双向模型差得多。它还损害了其它所有四个GLUE
任务的性能。我们认识到:也可以像
ELMo
那样,单独训练LTR
和RTL
模型,并将每个token
表示为两个模型的拼接。然而:- 首先,这种方法比单一的双向模型要贵两倍。
- 其次,这种方法对像
QA
这样的任务来说是不直观的,因为RTL
模型不能以答案作为条件来回答问题(即,条件概率 $ P(\text{question}\mid \text{answer}) $ 。 - 最后,这种方法严格来说不如深度双向模型
deep bidirectional model
强大,因为深度双向模型可以选择使用left context
或right context
。
b. Model Size 的效果
这里我们探讨了模型大小对微调任务准确性的影响。我们训练了一些具有不同层数、隐单元、以及注意力头的
BERT
模型。除此之外,我们还使用了与前面所述相同的超参数和训练程序。选定的
GLUE
任务的结果如下表所示。在这个表中,我们报告了5
次随机重启微调的平均验证准确率。可以看到:更大的模型在所有四个数据集上都导致了一致的准确性提高,即使是只有
3600
个标记的训练样本的MRPC
。同样令人惊讶的是,我们能够在相对于现有文献已经相当大的模型之上实现如此显著的改进。例如:
《Attention is all you need》
探索的最大的Transformer
是(L=6,H=1024,A=16)
,编码器的参数为100M
。- 而我们在文献中发现的最大的
Transformer
是(L=64,H=512,A=2)
,参数为235M
(《Character-level language modeling with deeper self-attention》
)。 - 相比之下,
BERT_BASE
包含110M
参数,BERT_LARGE
包含340M
参数。
多年以来人们都知道,增加模型规模将导致大型任务(如机器翻译、语言建模)的持续改进,这可以通过下表所示的
held-out
训练数据的LM perplexity
来证明。然而,我们认为这是第一项工作,证明了扩展到极端的model size
也会导致在非常小型的任务上有很大的改进,只要模型已经被充分地预训练过。即,增加模型规模不仅对大型任务有效,对小型任务也有效(模型需要被预训练)。
c. 训练步数的效果
下图展示了从一个已经预训练了
$ k $ 个step
的checkpoint
进行微调后的MNLI
验证准确性。这使我们能够回答以下问题。问题:
BERT
是否真的需要如此大量的预训练(128,000 words/batch * 1,000,000 steps
)来实现高的微调准确率?答案:是的。
BERT_BASE
预训练一百万步时,与五十万步相比,在MNLI
上实现了接近1.0%
的微调准确率提升。问题:
MLM
预训练的收敛速度是否比LTR
预训练慢,因为每个batch
中只有15%
(而不是100%
)的单词被预测?答案:是的,
MLM
模型的收敛速度比LTR
稍慢。然而,就绝对准确率而言,MLM
模型几乎从一开始就超过了LTR
模型。
d. Feature-based Approach with BERT
迄今为止,所有的
BERT
结果都采用了微调方法,即在预训练的模型中加入一个简单的分类层,并在下游任务中联合微调所有的参数。然而,feature-based
的方法,即从预训练的模型中抽取固定的特征,具有一定的优势:- 首先,并不是所有的
NLP
任务都可以很容易地用Transformer
编码器架构来表示,因此需要增加一个task-specific
的模型架构。 - 其次,如果能够一次性地预先计算好训练数据的
expensive representation
,然后在这个representation
的基础上用不太昂贵的模型进行许多实验,这有很大的计算优势。
这里我们通过在
CoNLL-2003 NER
任务上生成类似于ELMo
的pre-trained contextual representation
来评估BERT
在feature-based
的方法中的表现如何。为了做到这一点,我们使用与本文在Named Entity Recognition
章节中相同的input representation
,但是使用BERT
的一个或多个层的激活值而没有微调任何参数。这些contextual embedding
被用作一个双层BiLSTM
的输入,这个双层BiLSTM
具有768
维并且是随机初始化的,并且这个双层BiLSTM
位于最终的分类层之前。结果如下表所示。表现最好的方法是将预训练的
Transformer
的最后四个隐层的token representation
拼接起来,这比微调整个模型仅相差0.3 F1
。这表明:BERT
对微调方法和feature-based
方法都是有效的。- 首先,并不是所有的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论