模型的预训练

语言模型在处理特定任务时面临一个关键的问题:它们往往缺乏足够的上下文信息来理解和生成高质量的文本。这是由于优质训练数据的稀缺性以及模型在特定领域知识上的不足所导致的。互联网上现存的数据是海量的,但这些数据往往是杂乱无章的,缺乏结构化和标注,难以直接用于训练高效的语言模型。在这种背景下,现代的语言模型形成了所谓的“预训练-微调”范式(pretrain-finetune paradigm)。其中,预训练阶段指的是模型在大规模通用数据集上进行无监督学习,以捕捉语言的基本结构和模式。这个过程胜在数据量大,模型可以学习到丰富的语言特征。

Words & Tokens

先前我们介绍过 Word2Vec 技术,它通过将词语映射到向量空间来捕捉词语之间的语义关系。然而,Word2Vec 面临的问题在于它无法处理未登录词(out-of-vocabulary words),即那些在训练数据中未出现过的词语。并且,Word2Vec 是一个僵化而静态的表示模型,它无法通过上下文来动态调整词语的含义,也无法根据上下文来推测当前词语的含义。我们先前引用过一个论断:

You shall know a word by the company it keeps.

但是这是一个纯粹统计性的结论,它并不能很好地诠释自然语言的复杂性。事实上同一位作者还在另一篇文章中补充道:

… the complete meaning of a word is always contextual, and no study of meaning apart from a complete context can be taken seriously.

可见一斑。因此,我们需要一种更为灵活和动态的词语表示方法,能够根据上下文来调整词语的含义。这就引出了 subword 和 token11 我完全不知道该如何翻译“token”,因此此后我会直接使用它的英文原词。 的概念。Token 是指将文本拆分成更小的单位,这些单位可以是单词、子词(subword)或字符。通过这种方式,模型可以更好地处理未登录词,并且能够根据上下文来动态调整词语的含义。在语言模型中往往有所谓的 Tokenizer,它的作用就是将文本拆分成 token 序列。目前常见的 tokenizer 包括 BPE (Byte Pair Encoding) 和 WordPiece 等。这其中 BPE 是一种基于频率的子词分割方法,它通过迭代地合并最频繁出现的字符对来构建子词单元。WordPiece 则是一种基于最大似然估计的子词分割方法,它通过最大化训练数据的似然函数来选择子词单元。这些 tokenizer 的目标都是为了在保持语义信息的同时,减少词汇表的大小,从而提高模型的泛化能力和处理未登录词的能力。

模型架构

现代的语言模型基本都使用了 transformer 架构的一部分。我们知道 transformer 架构在初次提出时是用于机器翻译任务:它需要将一种语言的句子转换为另一种语言的句子。这个过程需要模型理解源语言句子的语义,并生成目标语言句子的文本。为了实现这一点,transformer 架构引入了编码器-解码器(encoder-decoder)结构。编码器负责将源语言句子编码为一个固定长度的向量表示,而解码器则根据这个向量表示生成目标语言句子。然而在预训练过程中我们想要实现的目的有所不同:要么我们想从文本中提取一些信息,以此来理解文本的含义;要么我们想生成一些文本,以此来扩展和丰富已有的文本内容。因此,在预训练过程中往往不使用完整的 transformer 架构,而是根据具体任务的需求,选择使用编码器部分或解码器部分。

BERT:Encoder-only

BERT (Bidirectional Encoder Representations from Transformers) 是一种基于 encoder-only 架构的预训练语言模型。它通过双向编码器来捕捉文本的上下文信息,从而提高模型对文本的理解能力。由于 encoder 结构中缺乏 mask,BERT 可以同时关注上下文的左右两侧信息,因此它不能用于文本生成任务,相反它对于文本理解任务表现出色。

BERT 的预训练过程主要包括两个任务:掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)。在 MLM 任务中,BERT 会随机掩盖输入文本中的一些词语,然后让模型预测这些被掩盖的词语。这种方法迫使模型学习到词语之间的上下文关系,从而提高对文本的理解能力。在 NSP 任务中事实上有后续研究表明 NSP 任务对于 BERT 的性能提升作用有限,因此在后续的模型中往往会省略这一任务。,BERT 会给出一对句子,并让模型判断第二个句子是否是第一个句子的后续句子。这种方法帮助模型理解句子之间的关系,从而提高对文本结构的理解能力。

对于 MLM 任务的训练,数学上对应以下过程:

其中 表示输入文本中的词语, 表示编码器输出的隐藏状态, 表示模型预测的词语分布, 是模型的参数。若 是一个完整未被掩盖的句子,则 BERT 的训练目标是最大化 ,即最大化模型对被掩盖词语的预测概率。转化为交叉熵损失函数后,BERT 的训练目标可以表示为: 表示被掩盖的词语集合, 表示输入文本中未被掩盖的部分

然而简单地掩盖词语会导致训练数据和实际应用场景之间存在差异,因为在实际应用中,模型并不会遇到被掩盖的词语(正常来说根本不会有 [MASK] 这种 token 出现)。为了解决这个问题,BERT 在掩盖词语时采用了一种随机策略:在随机选取的 15% 词语中

这种策略使得模型在训练过程中能够接触到更多样化的输入,从而提高模型的泛化能力。

GPT:Decoder-only

GPT (Generative Pre-trained Transformer) 是一种基于 decoder-only 架构的预训练语言模型。它通过单向解码器来生成文本,从而提高模型对文本生成任务的表现能力。我们知道 transformer decoders 中包含了 mask 机制,这使得 GPT 只能关注上下文的左侧信息,因此它非常适合用于文本生成任务。我们的训练目标是最大化给定已经存在的文本 ,预测下一个词语的概率 。转化为交叉熵损失函数后,GPT 的训练目标可以表示为:

同样用数学公式来描述 GPT 的训练过程:

则我们的目标是最大化 ,即最大化模型对下一个词语的预测概率。具体而言是

这里 表示模型预测的词语分布序列,其中第 个元素对应于输入序列中前 个词语的预测结果,也就是对于第 个词语的预测。 表示输入文本中从第二个词语到第 个词语的真实词语序列。这种错位匹配使得训练过程中可以高效并行计算损失函数,从而加快训练速度。

GPT 为首的一众基于 decoder-only 的一大特色即是他们在文本生成任务中的应用。通过所谓的“自回归生成”(autoregressive generation)方法,模型可以根据已经生成的文本逐步生成新的文本内容。这种方法使得模型能够生成连贯且有逻辑的文本,从而在各种文本生成任务中表现出色。

随着 GPT 模型的不断 scale-up,出现了许多额外的模型能力,也许就是“量变引起质变”吧。在相当大的模型中,模型开始具备例如 in-context learning 的能力,即模型可以通过上下文信息来调整其生成的文本内容,而无需进行额外的微调。这种能力使得模型在处理各种任务时更加灵活和高效。此外,在学习了足够多的文本数据后,模型还展现出了零样本学习(zero-shot learning)和少样本学习(few-shot learning)的能力,即模型可以在没有或仅有少量训练数据的情况下,完成特定任务。这些能力的出现使得基于 decoder-only 的语言模型在实际应用中具有更广泛的适用性和更强的表现力。