Pretrained Language Models.
预训练语言模型(Pretrained Language Models,PLMs)是一种从大量无标签的语料库中学习通用的自然语言特征表示的方法。笔者认为,预训练模型之于自然语言处理,就好比backbone之于计算机视觉。使用预训练语言模型的步骤如下:
- 在大量无标签的语料库上进行特定任务的预训练;
- 在下游任务的语料库上进行微调。
本文首先介绍语言的特征表示,然后介绍预训练语言模型的发展,最后尝试理解预训练语言模型。
1. 语言的特征表示
自然语言处理中对于语言的特征表示应能够从文本语料库中学习到内在语言规则和常识知识,如词义、句法结构、词类、语用学信息等。一种好的语言特征表示应具有与具体任务无关的通用含义,又能够针对具体的任务提供有用的信息。目前对语言的特征表示有两种形式,即上下文无关的嵌入(non-contextual embedding)和上下文相关的嵌入(contextual embedding)。
(1) Non-Contextual Embedding
上下文无关的嵌入通常是由词嵌入(word embedding)实现的,即把句子中的每一个word转化成一个词向量:$x \to e_x$。在这类方法中,不同句子中的相同word都会被嵌入为同一个词向量,然而相同word在不同的句子中位于不同的token位置,可能具有不同的含义,如下面两个句子:
- It is safest to deposit your money in the bank.
- The victim was found lying dead on the river bank.
在上面两个句子中bank分别表示银行和河岸;因此这种词嵌入无法解决多义问题。此外,由于词向量的个数是有限的,对于之前不存在的词,则无法得到相应的词嵌入向量(即OOV问题,out of vocabulary)。
基于上下文无关的嵌入方法可以被认为是早期的预训练语言模型,代表模型有Word2Vec,CBOW,Glove。这类模型结构简单,尽管是从无标注语料库中训练得到的,也能获得高质量的词向量;其学习到的词向量能够捕捉文本中潜在的语法和语义信息,但这类预训练词向量无法随上下文而动态变化,只是简单地学习”共现词频”,无法理解更高层次的文本概念,如多义性、句法特征、语义角色、指代等。
(2) Contextual Embedding
上下文相关的嵌入是指根据当前文本的上下文,灵活地对每一个token位置(注意不是对每一个word)进行词嵌入;当文本不同时,同一个word也会具有不同的词嵌入向量。这通常是由一个神经网络编码器$f_{enc}(\cdot)$实现的:$[h_1,…,h_T]=f_{enc}([x_1,…,x_T])$。随着LSTM,Transformer等模型的引入,这种结合上下文信息的预训练语言模型获得了更多的关注。这类预训练语言模型能够根据预训练任务学习包含词的上下文信息的词表示,并用于不同的下游任务中。这类预训练语言模型的优点如下:
- 可以在大规模预训练语料库中学习到通用语言表示;
- 可以提供一个更好的下游任务初始化模型,提高下游任务的表现并加速收敛;
- 可以看作一种正则化,防止模型在小数据集上过拟合。
2. 预训练语言模型的发展
(1) 预训练语言模型的结构
Transformer模型是编码-解码端 (Encoder-Decoder)的架构。但是当前对于语言模型的分类,将语言模型分为三个类型:编码端(Encoder-Only),解码端(Decoder-Only)和编码-解码端(Encoder-Decoder)。
① 编码端(Encoder-Only)架构
编码端架构(如BERT, RoBERTa)可以生成上下文向量表征,但不能直接用于生成文本。这些上下文向量表征通常用于自然语言理解任务(形式为分类任务,如文本分类、情感分类)。该架构的优势是对于文本的上下文信息有更好的理解,因此该模型架构才会多用于理解任务。该架构的优点是对于每个$x_i$,上下文向量表征可以双向地依赖于左侧上下文$(x_{1:i−1})$和右侧上下文$(x_{i+1:L})$。但是缺点在于不能自然地生成文本,且需要更多的特定训练目标(如掩码语言建模)。
② 解码端(Decoder-Only)架构
解码器架构(如GPT系列)是常见的自回归语言模型,通常用于自然语言生成任务:给定一个提示$x_{1:i}$,它们可以生成上下文向量表征,并对下一个词元$x_{i+1}$ (以及递归地,整个完成$x_{i+1:L}$) 生成一个概率分布。与编码端架构比,其优点为能够自然地生成文本,有简单的训练目标(最大似然)。缺点也很明显,对于每个$x_i$,上下文向量表征只能单向地依赖于左侧上下文$(x_{1:i−1})$。
③ 编码-解码端(Encoder-Decoder)架构
编码-解码端架构(如BART, T5)在某种程度上结合了两者的优点:它们可以使用双向上下文向量表征来处理输入$x_{1:L}$,并且可以生成输出$y_{1:L}$。该模型的具有编码端、解码端两个架构的共同的优点,对于每个$x_i$,上下文向量表征可以双向地依赖于左侧上下文$(x_{1:i−1})$和右侧上下文$(x_{i+1:L})$,可以自由的生成文本数据。缺点就是需要更多的特定训练目标。
On the Role of Bidirectionality in Language Model Pre-Training一文指出,如果是以fine-tuning方式解决下游任务,编码端架构效果更好;若是以zero shot/few shot prompting这种模式解决下游任务,解码端架构效果更好。这是因为解码端架构能够直接生成完整的序列,在少样本范式下更具优势;而编码端架构需要额外的推理步骤来处理masked token,在微调范式下能够充分利用上下文信息。
(2) 预训练语言模型的任务
预训练语言模型的预训练任务通常有以下几类:
- 概率语言建模 Language Modeling(LM)
概率语言建模是自然语言处理中最常见的无监督任务,通常指自回归(autoregressive)或单向语言建模,即给定前面所有词预测下一个词:
\[p(x_{1:T}) = \prod_{t=1}^{T} p(x_{t}|x_{0:t-1})\]- 掩码语言建模 Masked Language Modeling(MLM)
掩码语言建模是指从输入序列中遮盖一些token(为这些token加上mask),然后训练模型通过其余的token预测masked token。然而这种预训练方法会使预训练和微调之间产生不匹配(discrepancy)问题,因为在下游任务中MASK
等预训练中使用的特殊token并不存在。这类方法也称为自编码(autoencoding)式语言模型。
- 序列到序列的掩码语言建模 Seq2Seq Masked Language Modeling(Seq2Seq MLM)
掩码语言建模MLM通常用于解决分类问题,即将masked序列作为输入,将模型输出送入softmax分类器以预测masked token。序列到序列的掩码语言建模是指采用编码器-解码器结构,将masked序列输入编码器,解码器以自回归的方式顺序生成masked token。
- 增强掩码语言建模 Enhanced Masked Language Modeling(E-MLM)
增强掩码语言建模E-MLM是指在掩码语言建模的过程中使用了一些增强方法。不同的模型使用了不同的增强方法,详见下表。
- 排列语言建模 Permuted Language Modeling(PLM)
排列语言建模是指在输入序列的随机排列上进行语言建模。给定输入序列,从所有可能的序列排列中随机抽样一个排列。将该排列序列中的一些token选定为目标,训练模型根据其余token和目标的正常位置(natural position)来预测这些目标token。
(3) 常见的预训练语言模型
预训练模型 | 结构 | 预训练任务 | 参数量(M百万,B十亿) |
---|---|---|---|
ELMo | 双向LSTM | LM | - |
GPT | Transformer解码器 | LM | $117$M |
GPT2 | Transformer解码器 | LM | $117$-$1542$M |
GPT3 | Transformer解码器 | LM | $125$M-$175$B |
BERT | Transformer编码器 | MLM+相邻句子预测(Next Sentence Prediction) | $110$-$340$M |
ALBERT | Transformer编码器 | MLM+句子顺序预测(Sentence-Order Sentence Prediction) | $12$-$235$M |
ELECTRA | Transformer编码器 | MLM+替换词检测(Replaced Token Detection) | $14$-$335$M |
REALM | Transformer编码器 | MLM+知识检索(Knowledge Retrieval) | $330$M |
MASS | Transformer | Seq2Seq MLM | $220$M-$11$B |
UniLM | Transformer编码器 | Seq2Seq MLM | $340$M |
BART | Transformer | Seq2Seq MLM | $139$M-$406$M |
T5 | Transformer | Seq2Seq MLM | $220$M-$11$B |
T5.1.1 | Transformer | Seq2Seq MLM | $220$M-$11$B |
mT5 | Transformer | Seq2Seq MLM | $300$M-$13$B |
RoBERTa | Transformer编码器 | E-MLM(Dynamic Masking) | $355$M |
DeBERTa | Transformer编码器 | E-MLM(Disentangled Attention+Enhanced Mask Decoder) | $390$M |
XLNet | Transformer编码器 | PLM | $110$-$340$M |
Gopher | Transformer解码器 | LM | $44$M-$280$B |
Jurassic-1 | Transformer解码器 | LM | $7$B-$178$B |
3. 理解预训练语言模型
(1) 预训练语言模型学到了哪些知识?
预训练语言模型从文本数据中学习到的知识包括语言类知识和世界知识两大类。
- 语言类知识是指词法、词性、句法、语义等有助于人类或机器理解自然语言的知识,又包括浅层语言知识和抽象语言知识。
- 浅层语言知识是指词法、词性、句法等知识,通常存储在Transformer的低层和中层;
- 抽象语言知识是指语义类知识,通常存储在Transformer的中层和高层。
- 世界知识是指真实事件或常识等有助于人类或机器理解真实世界的知识,又包括事实型知识和常识性知识。这类知识主要分布在Transformer的中层和高层,尤其聚集在中层。
- 事实型知识 (Factual Knowledge)是指在这个世界上发生的一些真实事件,如“特朗普是现任美国总统”(这类知识可能会失效!)。
- 常识性知识 (Common Sense Knowledge)是指这个世界存在的生活常识和规律,如“太阳从东方升起”。
BERTnesia: Investigating the capture and forgetting of knowledge in BERT一文指出,预训练语言模型学习到的世界知识不仅存储在最后一层,中间层也贡献了大量知识;并且随着模型层深增加,能够学习到的世界知识数量逐渐以指数级增加。在对模型进行微调时,世界知识可能会被遗忘,遗忘程度取决于微调目标和训练数据。
When Do You Need Billions of Words of Pretraining Data?一文指出,仅需约1000万至1亿词汇的预训练数据即可学习到可靠的语言类知识,但要掌握典型的世界知识则需要数十亿词汇的数据。大型预训练模型在大规模数据上性能提升的主要驱动力是世界知识。
(2) 预训练语言模型如何存储知识?
预训练语言模型的知识存储在Transformer的模型参数里。从Transformer的结构看,模型参数由两部分构成:自注意力层(约占总参数的三分之一)和全连接层(约占总参数的三分之二)。自注意力层主要用于计算token或知识间的相关性,并对全局信息进行整合,更可能是在建立知识之间的联系,大概率不会存储具体的知识点;则可以推论出模型的知识主体是存储在全连接层结构中。
Transformer Feed-Forward Layers Are Key-Value Memories一文指出,把全连接层看作键-值记忆单元($FF(x)=f(x⋅K^\top )⋅V$),其中第一层的参数$K$作为输入序列的模式检测器,第二层的参数$V$存储了对应模式下输出词汇表上的概率分布。
(3) 预训练语言模型如何修改知识?
预训练语言模型中存储的事实型知识可能会过时(如美国总统换届),因此修正预训练语言模型里存储的错误或者过时的知识是有必要的。下面介绍三种修改知识的方法。
① 更换训练数据
假设想要删除某一类知识,可以定位并删除对应的数据源,然后重新预训练整个模型。由于模型预训练的成本太高。所以这种方法比较适合对于某个特定类别数据的一次性大规模删除场合(如去除偏见和毒性等内容的处理),不适合少量多次的常规知识修正场景。
实现该功能要求对于指定的某条知识,可以定位到是哪些训练数据导致预训练语言模型学会了这条知识,即实现数据归因(Data Attribution)功能。Towards Tracing Factual Knowledge in Language Models Back to the Training Data一文设计了三种用于事实追踪(识别哪些训练样本教会了语言模型生成特定的事实性断言)的数据归因方法:
- 梯度归因方法TracIn:在训练过程中,每当对训练样本 $z$ 进行梯度更新时,记录测试样本 $z_{\text{query}}$ 的损失变化;通过内积来估计影响力:
- 嵌入归因方法:从Transformer语言模型中提取中间层的输出,通过余弦相似度计算训练样本 $z$ 和测试样本 $z_{\text{query}}$的关联性:
- 信息检索方法BM25:通过计算训练样本 $z$ 和测试样本 $z_{\text{query}}$之间的词项重叠来选择支持样本:
② 微调模型
可以根据要修正的新知识来构建微调数据集,然后微调预训练语言模型。这个方法会带来灾难性遗忘问题,即模型可能会遗忘掉一些不应该遗忘的知识。
Modifying Memories in Transformer Models一文提出了一种约束优化方法,可以在不降低Transformer模型对未修改事实性能的前提下,显式修改模型中特定的事实性知识。给定一个预训练的Transformer模型,其参数为$θ_0$,存储了一系列事实$F$。目标是将$F$中的一小部分事实$S$替换为新的事实$M$,得到新的模型参数$θ^{new}$,使其存储$F^′ = (F \backslash S) ∪ M$。优化目标为:
\[\begin{aligned} \min_{\theta \in \Theta} \quad & \frac{1}{m} \sum_{x \in D_M} L(x; \theta) \\ \text{subject to} \quad & \|\theta - \theta_0\|_\infty \leq \delta \end{aligned}\]上述优化问题可以通过投影梯度下降求解:
- 使用预训练模型初始化参数$θ_0$。
- 在每个迭代中,计算梯度并更新参数。
- 将更新后的参数投影到约束集合内,确保参数变化不超过$δ$。
③ 修改模型参数
讨论(2)已经指出与训练语言模型的知识存储在全连接层(FFN)中,因此可以通过直接修改预训练语言模型里某些知识对应的模型参数来修正知识。这种方法涉及到两项关键技术:
- 如何在预训练模型的参数空间中定位某条知识的具体存储位置;
- 如何修正模型参数,来将旧知识替换为新知识。
⚪ Knowledge Neuron
本文提出了“知识神经元”的概念,并采用一种基于集成梯度的知识归因方法来识别表达特定知识的神经元。给定一个输入提示 $x$ 和一个关系事实 $\langle h, r, t \rangle$(由已知词、关系词和目标词向量构成的三元组),模型的输出 $P_x(\hat{w}^{(l)}_i)$ 定义为预训练模型预测正确答案 $y^*$ 的概率:
\[P_x(\hat{w}^{(l)}_i) = p(y^* | x, w^{(l)}_i = \hat{w}^{(l)}_i)\]为了计算神经元 $w^{(l)}_i$ 的归因分数 $\text{Attr}(w^{(l)}_i)$,从 $w^{(l)}_i = 0$ 到 $w^{(l)}_i$ 的原始值,逐步计算梯度并进行积分:
\[\text{Attr}(w^{(l)}_i) = w^{(l)}_i \int_{0}^{1} \frac{\partial P_x(\alpha w^{(l)}_i)}{\partial w^{(l)}_i} \, d\alpha\]按照上述计算识别出归因分数大于某个阈值 $t$ 的神经元可以作为粗略的知识神经元集合。通过保留同一个事实的不同提示中广泛共享的神经元,可以进一步过滤掉“假阳性”神经元。
利用知识神经元可以在不进行微调的情况下编辑预训练Transformer中的特定事实知识。
- 更新事实:将预训练模型中学到的关系事实从⟨h, r, t⟩更新为⟨h, r, t′⟩(其中$t$为词嵌入,更新方式为$FFN = FFN-\lambda_1t+\lambda_2t^\prime$)。
- 擦除关系:将识别和设置特定关系的知识神经元的值为零。
⚪ Rank-One Model Editing(ROME)
本文通过因果干预分析定位模型中存储事实的具体位置:
- 干净运行:将包含主题的事实性提示输入模型,收集所有隐藏状态激活值。
- 损坏运行:在模型运行前,对主题词的嵌入向量添加噪声,破坏模型对主题的识别能力,然后收集损坏状态下的激活值。
- 恢复运行:在损坏运行的基础上,选择性地恢复某些隐藏状态的干净值,观察这些状态对恢复原始预测的影响。
基于因果干预分析的结果,作者提出了Rank-One Model Editing(ROME)方法,用于直接编辑模型中的事实关联。ROME作用于全连接层的第二层,更新规则如下:
\[\begin{aligned} \hat{W} &= W + \Lambda (C^{-1} k^*)^T \end{aligned}\]其中,$W$ 是原始权重矩阵,$C=KK^\top$ 是输入嵌入的协方差矩阵,用于约束更新的幅度。$\Lambda$ 是一个向量,计算为新权重与原始权重的残差误差。
⚪ MEMIT
本文提出了MEMIT方法,能够批量更新预训练语言模型中的多个记忆。MEMIT通过以下步骤实现多层更新:
- 计算目标向量 $z_i$:对于每个记忆 $i$,计算一个向量 $z_i$,使得在顶层 $L$ 的隐藏状态中完全传达新的记忆,优化 $z_i$ 以最大化模型对新对象 $o_i$ 的预测概率。
- 在多层中传播 $z_i$:从顶层 $L$ 开始,逐层向下传播 $z_i$,第$l$层新的事实增加$R_l=M_l-M_0=\frac{z_i-h_i^L}{L-l+1}$。
- 使用公式 $\Delta_l = R_l K_l^T (C_l + K_l K_l^T)^{-1}$ 更新每层的MLP权重。
⚪ 参考文献
- Pre-trained Models for Natural Language Processing: A Survey:(arXiv2003)一篇预训练模型的综述。
- Deep contextualized word representations:(arXiv1802)ELMo:使用语言模型进行词嵌入。
- Improving Language Understanding by Generative Pre-Training:(NLPIR2018)GPT:使用生成式预训练模型提高对语言的理解。
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding:(arXiv1810)BERT:从Transformer中获得上下文的编码表示。
- MASS: Masked Sequence to Sequence Pre-training for Language Generation:(arXiv1905)MASS:序列到序列的掩码语言建模。
- Unified Language Model Pre-training for Natural Language Understanding and Generation:(arXiv1905)UniLM:使用BERT实现序列到序列的预训练。
- XLNet: Generalized Autoregressive Pretraining for Language Understanding:(arXiv1906)XLNet:使用排列语言建模训练语言模型。
- RoBERTa: A Robustly Optimized BERT Pretraining Approach:(arXiv1907)RoBERTa:鲁棒优化的BERT预训练方法。
- ALBERT: A Lite BERT for Self-supervised Learning of Language Representations:(arXiv1909)ALBERT:一种轻量型的BERT模型。
- BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension:(arXiv1910)BART: 用于自然语言生成、翻译和理解的去噪序列到序列预训练模型。
- Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer:(arXiv1910)T5:编码器-解码器结构的预训练语言模型。
- Language Models are Unsupervised Multitask Learners:(2019)GPT2:语言模型是无监督的多任务模型。
- REALM: Retrieval-Augmented Language Model Pre-Training:(arXiv2002)REALM:通过检索增强预训练语言模型。
- GLU Variants Improve Transformer:(arXiv2002)T5.1.1:使用GLU改进预训练语言模型T5。
- ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators:(arXiv2003)ELECTRA:判别式的预训练语言模型。
- Language Models are Few-Shot Learners:(arXiv2005)GPT3:语言模型是少样本学习模型。
- DeBERTa: Decoding-enhanced BERT with Disentangled Attention:(arXiv2006)DeBERTa:使用分解注意力机制和增强型掩膜解码器改进预训练语言模型。
- mT5: A massively multilingual pre-trained text-to-text transformer:(arXiv2010)mT5:多语言版本的预训练语言模型T5。
- When Do You Need Billions of Words of Pretraining Data?:(arXiv2011)什么时候需要数十亿单词的预训练数据?
- Transformer Feed-Forward Layers Are Key-Value Memories:(arXiv2012)Transformer全连接层是键值记忆单元。
- Modifying Memories in Transformer Models:(arXiv2012)修正Transformer模型中的记忆。
- Knowledge Neurons in Pretrained Transformers:(arXiv2104)预训练Transformer中的知识神经元。
- BERTnesia: Investigating the capture and forgetting of knowledge in BERT:(arXiv2106)BERTnesia:探究 BERT 中知识的捕获与遗忘。
- Scaling Language Models: Methods, Analysis & Insights from Training Gopher:(arXiv2112)扩展语言模型:训练 Gopher 的方法、分析和见解。
- Jurassic-1: Technical details and evaluation:(AI21 Labs)Jurassic-1:技术细节与评估。
- Locating and Editing Factual Associations in GPT:(arXiv2202)定位和编辑GPT中的事实关联。
- On the Role of Bidirectionality in Language Model Pre-Training:(arXiv2205)探讨语言模型预训练中的双向性。
- Towards Tracing Factual Knowledge in Language Models Back to the Training Data:(arXiv2205)将语言模型中的事实知识追溯到训练数据。
- Mass-Editing Memory in a Transformer:(arXiv2210)批量编辑Transformer中的记忆。