预训练定义
预训练(Pre-training)是指在大规模无监督数据上进行初步模型训练,使模型能够学习到通用的语言模式、知识表征和统计特征。这一阶段不依赖于特定任务,帮助模型建立基础的语言理解能力(通用能力)。通过预训练得到base模型,该模型可以在后续的特定任务上(如分类、生成、翻译等)以更快的速度和更高的准确性进行微调。
预训练的发展历程
预训练的发展可以分为以下几个关键阶段:
早期探索阶段(2013-2017)
2013年Mikolov等人提出的Word2Vec是预训练思想的早期实践,通过在大规模语料上学习词向量表示,为下游NLP任务提供了有效的特征输入。随后的GloVe和FastText进一步丰富了静态词向量的方法。这一阶段的预训练局限于词级别,无法捕捉上下文信息。
预训练-微调范式兴起(2018-2019)
2018年是预训练语言模型爆发的一年:
ELMo(Embeddings from Language Models):首次提出上下文相关的动态词向量,通过双向LSTM语言模型生成,解决了多义词问题。
GPT-1(2018年6月):OpenAI提出,采用Transformer Decoder架构,通过自回归语言模型(Autoregressive LM)在大规模无标注语料上进行预训练,然后在下游任务上微调。GPT-1证明了生成式预训练在NLU任务上的有效性。
BERT(2018年10月):Google提出,采用Transformer Encoder架构,引入掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)两个预训练目标。BERT的出现彻底改变了NLP的范式,使得预训练-微调成为NLP的主流方法。
GPT-2(2019年2月):将模型参数扩展到15亿,展示了规模增长带来的零样本(Zero-shot)学习能力提升,首次提出"语言模型是无监督多任务学习者"的观点。
规模化与涌现阶段(2020-2023)
GPT-3(2020年5月):参数量达到1750亿,展示了Few-shot和In-context Learning能力,证明了大规模语言模型在不需要微调的情况下也能完成各种任务。这催生了提示工程(Prompt Engineering)的研究热潮。
T5(2019年10月):Google提出,将所有NLP任务统一为文本到文本(Text-to-Text)格式,采用编码器-解码器(Encoder-Decoder)架构,系统性地比较了不同预训练策略的效果。
LLaMA(2023年2月):Meta发布,采用仅解码器(Decoder-only)架构,包含RoPE旋转位置编码、GQA分组查询注意力、RMSNorm和SwiGLU激活函数等优化。LLaMA证明了在开源数据上训练的小模型可以匹配甚至超越闭源大模型,推动了开源大模型生态的繁荣。
LLaMA 2(2023年7月):在LLaMA基础上扩展了训练数据量和上下文长度,并引入了GQA(Grouped Query Attention)机制,进一步提升了模型性能。
持续演进阶段(2024至今)
Mistral(2023年9月):引入滑动窗口注意力(Sliding Window Attention)和分组查询注意力,以更小的参数量实现了优异的性能。
DeepSeek(2024年):采用MoE(Mixture of Experts)混合专家架构,在保持计算效率的同时大幅扩展模型能力。
Qwen(2024年):阿里云发布的开源大模型系列,支持中英双语,在多项基准测试中表现优异。
预训练范式
因果语言模型(CLM)
因果语言模型(Causal Language Model, CLM)是最常见的自回归预训练范式,以GPT系列为代表。其核心思想是根据前文预测下一个token:
在训练时,每个token只能看到其左侧的上下文,通过自注意力掩码(Causal Mask)实现。CLM天然适合文本生成任务,是当前大语言模型的主流预训练范式。
掩码语言模型(MLM)
掩码语言模型(Masked Language Model, MLM)以BERT系列为代表。其核心思想是随机遮盖输入文本中的部分token,然后根据上下文预测被遮盖的内容:
BERT通常随机遮盖15%的token,其中80%替换为[MASK]、10%替换为随机词、10%保持不变。MLM能更好地理解上下文语义,但不适合文本生成任务。
前缀语言模型(PrefixLM)
前缀语言模型(Prefix Language Model, PrefixLM)以T5和UniLM为代表,结合了CLM和MLM的特点。在给定前缀(Prefix)的条件下,对后续部分采用自回归方式生成:
前缀部分可以使用双向注意力,而生成部分使用因果注意力。这种范式在序列到序列任务中表现优异。
范式对比
| 范式 | 代表模型 | 架构 | 预训练目标 | 适用场景 |
|---|---|---|---|---|
| CLM | GPT系列 | Decoder-only | 预测下一个token | 文本生成、对话 |
| MLM | BERT系列 | Encoder-only | 预测被遮盖的token | 文本理解、分类 |
| PrefixLM | T5、UniLM | Encoder-Decoder | 前缀条件下自回归生成 | 翻译、摘要 |
训练目标
预训练采用自监督的方式训练,对于CLM(当前主流),训练目标为预测下一个token的对数似然损失:
在计算loss的时候会计算prompt和response两部分的loss值。
对于MLM,训练目标为预测被遮盖位置的真实token:
其中
开源大模型的意义
在开源大模型数量爆炸的时代,预训练模型的意义在何处?
核心要素缺失:许多大模型没有开源训练框架、训练数据等核心要素,仅通过评估无法确定大模型对知识的掌握程度,导致在模型对齐阶段无法对症下药。例如我要微调一个写诗的大模型,采用的大模型在预训练阶段可能根本没在诗歌数据集上训练过,仅通过微调训练出的大模型写出来诗肯定难以直视。
领域适配需求:通用模型在特定领域的表现远不如domain模型,而要训练出好的domain模型,仅靠微调是不够的,需要做继续预训练,而继续预训练与预训练的技术栈基本一致。
Tokenizer可控性:开源模型的tokenizer不可控,导致解码速度不可控。比如llama模型做意图识别任务,有个意图叫 ai.listen.music,会被映射成 5 个 token,但如果使用自己训练的大模型,便会在一开始就设置成 1 个 token,极大节省了生成速度。