1. 大语言模型训练的整体框架
大语言模型的训练是一个复杂的过程,涉及数据准备、模型架构、优化策略和推理部署。以下是整体框架的详细分解:
1.1 训练阶段
- 预训练:在海量文本数据上学习通用语言表示,类似于“学习语言的百科全书”。
- 微调:针对特定任务调整模型参数,类似于“针对考试复习重点内容”。
- 指令微调:在对话或指令数据集上优化,使模型更适合交互式任务。
- 推理:使用训练好的模型进行预测或生成。
1.2 核心组件
- 数据集:提供训练所需的文本和标签。
- 特征:将文本转换为模型可处理的数值表示。
- 损失函数:衡量模型预测与目标的差距,指导优化。
- 模型架构:通常是 Transformer,包含编码器、解码器或两者组合。
- 优化器:如 AdamW,用于更新模型参数。
- 评估指标:如准确率、F1 分数、BLEU 分数,用于监控性能。
2. 数据集的全面解析
数据集是大语言模型训练的基石,其质量、规模和多样性直接决定模型的性能。以下是对数据集的详细剖析。
2.1 数据集的来源与类型
2.1.1 预训练数据集
- 通用文本数据集:
- Common Crawl:从互联网抓取的网页数据,包含数十亿网页,覆盖多种语言和主题。
- Wikipedia:高质量、结构化的百科全书文本,适合学习事实性知识。
- BooksCorpus:开源图书数据,适合长文本建模。
- C4 (Colossal Clean Crawled Corpus):从 Common Crawl 清洗后的数据集,广泛用于 T5、Grok 等模型。
- 社交媒体数据:
- Reddit:捕捉口语化、实时性强的文本,需严格过滤敏感内容。
- 多语言数据集:
- mC4:多语言版本的 C4,包含 100 多种语言。
- XLM 数据集:支持跨语言任务的混合数据集。
- 领域特定数据集:
- ArXiv:学术论文,适合科学领域的预训练。
- PubMed:生物医学文献,适合医疗领域。
2.1.2 微调数据集
- 通用 NLP 任务数据集:
- GLUE/SuperGLUE:包含文本分类、相似性判断、自然语言推理等任务。
- SQuAD:问答数据集,包含问题、上下文和答案。
- CoNLL-2003:命名实体识别(NER)数据集。
- 生成任务数据集:
- WMT (Workshop on Machine Translation):机器翻译数据集,包含源语言和目标语言对。
- CNN/Daily Mail:新闻摘要数据集。
- 对话数据集:
- Alpaca、Dolly:开源指令微调数据集,包含用户指令和模型回答。
- UltraChat:大规模对话数据集,模拟多轮交互。
- 定制数据集:
- 企业或研究者根据需求手动标注,例如客户服务对话、法律文档分析等。
2.1.3 数据集规模
- 预训练:通常需要 TB 级文本数据( 1 0 9 10^9 109 到 1 0 12 10^{12} 1012 词)。
- 微调:数据集规模较小( 1 0 3 10^3 103 到 1 0 6 10^6 106 样本),但需要高质量标注。
- 指令微调: 1 0 4 10^4 104 到 1 0 6 10^6 106 条指令-回答对。
2.2 数据预处理
数据预处理是将原始文本转换为模型可处理的格式的过程,具体步骤包括:
2.2.1 清洗
- 去噪:移除 HTML 标签、JavaScript 代码、广告、乱码等。
- 去重:使用哈希或相似性检测(如 MinHash)移除重复文本。
- 过滤:
- 移除低质量内容(如过短句子、色情内容)。
- 使用语言检测工具(如 FastText)过滤非目标语言文本。
- 应用启发式规则(如句子长度、词汇多样性)筛选高质量文本。
2.2.2 分词
- 方法:
- WordPiece:BERT 使用的分词方法,将词拆分为子词单元(如 “playing” → “play##ing”)。
- Byte-Pair Encoding (BPE):GPT 系列使用的分词方法,通过合并高频字节对构建词汇表。
- SentencePiece:无监督的分词方法,适用于多语言场景。
- 词汇表大小:通常为 30,000 到 100,000 个 token。
- 特殊标记:
- [CLS]:BERT 中用于表示整个句子。
- [SEP]:分隔不同句子或段落。
- [PAD]:填充短序列到统一长度。
- 、:生成任务中的开始和结束标记。
2.2.3 格式化
- 将文本转换为模型输入格式,如:
- JSON:存储文本、标签和其他元信息。
- TFRecord:TensorFlow 使用的二进制格式,适合大规模数据。
- HDF5:高效存储大型数据集。
- 示例:
{ "text": "这部电影太棒了!", "label": "积极", "tokens": ["这部", "电影", "太", "棒", "了", "!"], "token_ids": [101, 2023, 3185, 2003, 10392, 999, 102] }
2.2.4 数据增强
- 同义词替换:用同义词替换句子中的词(如 “棒” → “好”)。
- 反向翻译:将文本翻译到另一种语言再翻译回来,生成语义相近的变体。
- 随机插入/删除:随机添加或删除词,增加数据多样性。
- 示例:
- 原始:这部电影太棒了!
- 增强:这部影片很精彩!
2.3 数据集的标签
标签是训练过程中模型需要预测的目标,分为以下几类:
2.3.1 预训练中的标签
预训练通常采用自监督学习,标签从数据本身生成:
-
掩码语言建模 (MLM, BERT):
- 任务:随机掩盖 15% 的词,预测这些词。
- 标签:被掩盖的词。
- 示例:
- 输入:这只 [MASK] 在垫子上。
- 标签:猫
- 细节:
- 80% 的掩盖词直接替换为 [MASK]。
- 10% 替换为随机词。
- 10% 保持不变(防止模型过于依赖 [MASK])。
-
因果语言建模 (CLM, GPT):
- 任务:给定前文,预测下一个词。
- 标签:序列中的下一个词。
- 示例:
- 输入:这只猫
- 标签:在
- 细节:模型逐步生成序列,适合生成任务。
-
下一句预测 (NSP, BERT):
- 任务:判断两个句子是否连续。
- 标签:二分类标签(1 表示连续,0 表示不连续)。
- 示例:
- 输入:句子 A:这只猫在垫子上。句子 B:它很舒服。
- 标签:1
- 输入:句子 A:这只猫在垫子上。句子 B:天空是蓝色的。
- 标签:0
-
排列语言建模 (PLM, XLNet):
- 任务:预测随机排列序列中的词。
- 标签:原始序列中的词。
- 细节:结合了 MLM 和 CLM 的优点,考虑双向上下文。
-
对比学习 (SimCSE):
- 任务:通过对比正负样本学习句子表示。
- 标签:正样本(相同句子的变体)与负样本(其他句子)。
2.3.2 微调中的标签
微调通常采用监督学习,标签由人工标注:
-
分类任务:
- 单标签分类:如情感分析,标签为“积极”、“消极”或“中性”。
- 多标签分类:如主题分类,标签为多个主题的组合(如“科技”、“健康”)。
- 示例:
- 文本:这部电影太棒了!
- 标签:积极
-
序列标注任务:
- 任务:为序列中的每个词分配标签,如命名实体识别(NER)。
- 标签:BIO 格式(Begin, Inside, Outside)。
- 示例:
- 文本:埃隆·马斯克是特斯拉的首席执行官。
- 标签:B-PER I-PER O O O O B-ORG
-
生成任务:
- 任务:生成目标文本,如机器翻译、摘要生成。
- 标签:目标文本序列。
- 示例:
- 输入:这只猫在垫子上。
- 标签:The cat is on the mat.
-
问答任务:
- 任务:从上下文中提取答案或生成答案。
- 标签:答案文本或答案的起始/结束位置。
- 示例:
- 上下文:法国的首都是巴黎。
- 问题:法国的首都是哪里?
- 标签:巴黎
-
指令微调:
- 任务:根据用户指令生成回答。
- 标签:高质量的回答文本。
- 示例:
- 指令:写一首关于月亮的诗。
- 标签:月亮在夜空中柔和地发光……
2.3.3 标签设计的挑战
- 噪声:人工标注可能存在错误,需通过多轮标注或一致性检查提高质量。
- 不平衡:某些标签(如消极情感)可能较少,可通过加权损失或数据增强解决。
- 多模态标签:如果涉及多模态任务(如图像描述),标签可能包括文本和图像区域。
2.4 数据集的特征
特征是模型输入的数值表示,决定了模型能从数据中学习到什么。
2.4.1 词嵌入
- 定义:将词或子词映射到高维向量(如 768 维)。
- 方法:
- 静态嵌入:如 Word2Vec、GloVe(不常用)。
- 动态嵌入:Transformer 模型通过嵌入层生成上下文相关的表示。
- 示例:
- 词:猫
- 嵌入:[0.12, -0.34, 0.56, …](768 维向量)
2.4.2 位置编码
- 作用:捕捉词序信息,因为 Transformer 不具备天然的序列感知能力。
- 方法:
- 正弦位置编码(Vaswani 等人,2017):
- P E ( p o s , 2 i ) = sin ( p o s / 1000 0 2 i / d ) PE(pos, 2i) = \sin(pos / 10000^{2i/d}) PE(pos,2i)=sin(pos/100002i/d)
- P E ( p o s , 2 i + 1 ) = cos ( p o s / 1000 0 2 i / d ) PE(pos, 2i+1) = \cos(pos / 10000^{2i/d}) PE(pos,2i+1)=cos(pos/100002i/d)
其中, p o s pos pos 是词的位置, i i i 是维度索引, d d d 是嵌入维度。
- 学习位置编码:通过训练学习位置向量(如 BERT)。
- 正弦位置编码(Vaswani 等人,2017):
- 示例:
- 输入:这只猫
- 位置编码:
- 这: [sin(0), cos(0), …]
- 只: [sin(1), cos(1), …]
- 猫: [sin(2), cos(2), …]
2.4.3 上下文特征
- 生成方式:Transformer 的自注意力机制生成上下文相关的特征。
- 数学形式:
- Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
其中, Q Q Q、 K K K、 V V V 是查询、键、值矩阵, d k d_k dk 是键的维度。
- Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
- 示例:
- 输入:这只猫在垫子上
- 输出:每个词的上下文表示(如 “猫” 的表示融合了 “这” 和 “在” 的信息)。
2.4.4 任务特定特征
- 分类任务:
- 使用 [CLS] 标记的向量表示(BERT)。
- 示例:CLS 向量输入到线性层进行分类。
- 问答任务:
- 拼接问题和上下文,生成联合表示。
- 示例:输入 “[CLS] 法国的首都是哪里? [SEP] 法国的首都是巴黎。 [SEP]”。
- 生成任务:
- 逐步生成序列,每次输入前文特征。
- 示例:输入 “这只猫” 生成 “在”。
2.4.5 元特征
- 语言标识:多语言模型中加入语言标记(如 “zh” 表示中文)。
- 来源信息:如文本来自 Wikipedia 或其他来源。
- 长度信息:用于动态调整序列长度。
2.4.6 特征工程的挑战
- 词汇表覆盖:低频词或新词可能不在词汇表中,需使用子词或 OOV 处理。
- 序列长度:Transformer 通常限制最大长度(如 512 或 2048),需截断或分段处理长文本。
- 多模态特征:如图像-文本任务,需将图像特征(如 CNN 或 ViT 提取的向量)与文本特征对齐。
2.5 数据集的组织与划分
2.5.1 数据集划分
- 训练集:80%-90%,用于优化模型参数。
- 验证集:5%-10%,用于超参数调优和早停。
- 测试集:5%-10%,用于评估最终性能。
- 示例:
- 数据集:10,000 条评论
- 训练集:8,000 条
- 验证集:1,000 条
- 测试集:1,000 条
2.5.2 批处理
- 批大小:常见值为 16、32、64,取决于 GPU 内存。
- 动态填充:将短序列填充到批次中最长序列的长度。
- 示例:
from transformers import DataCollatorWithPadding data_collator = DataCollatorWithPadding(tokenizer) batch = data_collator(samples) # 自动填充
2.5.3 数据加载
- 使用 DataLoader(PyTorch)或 tf.data(TensorFlow)实现高效加载。
- 并行加载:多线程读取数据,减少 I/O 瓶颈。
- 乱序:随机打乱样本,防止模型学习数据顺序。
3. 损失函数的全面解析
损失函数是训练的核心,衡量模型预测与真实标签的差距。以下是大语言模型中常用的损失函数及其数学形式、应用场景和优化技巧。
3.1 预训练中的损失函数
3.1.1 掩码语言建模 (MLM)
- 目标:预测被掩盖的词。
- 损失函数:交叉熵损失。
- 数学形式:
- L MLM = − ∑ i ∈ masked ∑ j = 1 ∣ V ∣ y i , j log y ^ i , j \mathcal{L}_{\text{MLM}} = -\sum_{i \in \text{masked}} \sum_{j=1}^{|V|} y_{i,j} \log \hat{y}_{i,j} LMLM=−∑i∈masked∑j=1∣V∣yi,j