一、核心概念:模型、训练与推理
- 模型 (Model):
- 本质是一个复杂的数学公式(如
y=σ(ax+b)
),由许多“神经元”构成。 - 通过调整参数
a
和b
(通常是高维矩阵),模型可以将输入x
(如文本) 映射到输出y
(如回答)。
- 本质是一个复杂的数学公式(如
- 训练 (Training):
- 目标是找到最优的参数
a
和b
,使模型能准确地根据输入x
生成期望的输出y
。 - 通过大量数据(如问答对)进行“拟合”,利用梯度下降等方法调整参数,最小化预测与真实值之间的差异(loss)。
- 目标是找到最优的参数
- 推理 (Inference):
- 使用训练好的模型(固定的
a
和b
)对新的输入x
进行计算,得到输出y
。 - LLM 推理通常是自回归的:将输入文本转换为数字序列 (tokens),模型预测下一个 token,然后将预测的 token 加入输入序列,继续预测,直到生成结束符 (eos_token)。
- 使用训练好的模型(固定的
二、预训练范式与模型类型
- 数据类型与训练阶段:
- 预训练 (Pre-training): 使用海量无标注数据(互联网文本),让模型学习通用的语言逻辑和知识。成本高昂,产出“Base 模型”。
- 微调 (Fine-tuning / SFT - Supervised Finetuning): 使用有标注数据(如问答对),使模型具备特定任务能力(如对话)。
- 人类对齐 (Human Alignment): 使用含正误答案的数据或人类反馈,使模型回答更符合人类期望(有用、无害、诚实)。产出“Chat 模型”。
- 模型分类:
- Base 模型: 完成预训练,或结合通用数据微调的模型,具备知识但可能回答不佳,需额外训练。
- Chat 模型: 经过人类对齐的模型,可直接用于通用问答,也可在其基础上微调。
三、Transformer 架构
- 目前 LLM 的主流架构,取代了 CNN 和 LSTM。
- 核心原理: 通过 Attention 机制计算句子中各 token 之间的相关性,并结合位置编码 (如 RoPE) 理解序列信息。
- 结构 (以 LLaMA2 为例): 输入文本 -> Tokenizer -> Embedding -> 多层 Transformer Block (含 Attention, Normalization 如 RMSNorm, FeedForward MLP 如 SwiGLU) -> 输出概率分布。
- 优势: 并行计算能力强,适合大规模分布式训练,对长距离依赖处理更好。
- Decoder-Only 架构: 当前 LLM 多采用此结构,因其分布式训练相对简单,且参数量增加时性能不逊于 Encoder-Decoder。
- 关键组件: RMSNorm (高效归一化), RoPE (旋转位置编码), SwiGLU (激活函数), GQA/MQA (多查询/分组查询注意力,提升推理性能)。ChatGLM2 结构类似,但在细节上有所不同。
四、数据预处理
- 分词器 (Tokenizer): 将原始文本按词表(vocab.txt)切分为 tokens (数字 ID 序列)。
- 模板 (Template): 为模型输入定义特定格式,尤其 Chat 模型需要区分系统指令 (system prompt)、用户输入 (user) 和模型回答 (assistant)。不同模型模板不同。SWIFT 框架内置多种模板。
- 标签处理: 微调时,对输入部分的标签设为-100,使损失函数仅关注模型应生成的部分。
五、PyTorch 框架与训练基础
- PyTorch: 主流深度学习框架,提供 Tensor 操作、自动求导 (
backward()
)、模型构建 (torch.nn.Module
) 等功能。 - 关键文件:
pytorch_model.bin
(模型权重),config.json
(模型结构配置),tokenizer.json
(分词器配置),vocab.txt
(词表)。 - 设备管理: Tensor 运算需在同一设备 (CPU 或 GPU/CUDA)。
- 基本训练流程:
- 数据准备: Dataset, DataLoader (批量加载、padding)。
- 模型定义: 继承
torch.nn.Module
。 - 优化器 (Optimizer): 如 AdamW,根据梯度更新模型参数。
- 学习率调度器 (LR Scheduler): 动态调整学习率。
- 训练循环 (Epochs):
- 模型前向传播 (
forward
) 计算输出和损失 (loss)。 - 损失反向传播 (
backward
) 计算梯度。 - 优化器步进 (
step
) 更新参数。 - 梯度清零 (
zero_grad
)。
- 模型前向传播 (
- 重要训练概念: loss, epoch, batch_size, learning_rate, max_length, flash_attention (高效注意力), gradient_checkpointing (节省显存)。
六、选择适合的方法和模型
- 方法选型:
- 直接推理 (提示词工程): 低成本,适用于通用任务,但效果不可控,可能产生幻觉。
- 训练 (全量/轻量):
- 全量训练: 训练模型大部分或全部参数,效果好但资源消耗大。
- 轻量训练 (LoRA, QLoRA): 冻结原模型,仅训练附加的小模块 (如 LoRA) 或对模型进行量化。成本低,部分任务效果接近全量。
- 适用于知识灌注、风格定制、能力增强。
- RAG (检索增强生成): 外挂知识库,通过检索相关信息辅助模型回答。适用于精确问答、知识更新频繁场景。
- Agent: 利用模型 CoT (思维链) 能力执行复杂任务(代码生成、API 调用)。需要强大的模型。
- 模型选型:
- Agent 任务优先大模型或闭源 API。
- 训练时,数据量大且质量高可选 Base 模型;数据量少可选 Chat 模型。
- 关注开源模型榜单。
七、指令微调 (SFT) 与 LoRA
- 指令微调: 使用有标注数据,让模型学会按特定指令或风格回答,如风格化、自我认知修改、能力增强。
- LoRA (Low-Rank Adaptation): 一种流行的轻量微调技术。在原模型冻结层旁增加两个低秩矩阵 (Adapter),只训练 Adapter 参数。显著减少训练参数量和显存占用,训练后可合并回原模型。
八、分布式训练
- 为解决单卡显存不足或训练速度慢的问题。
- DDP (分布式数据并行): 数据分发到不同 GPU,加速训练。
- MP (模型并行): 模型本身拆分到不同 GPU (如 Tensor 并行、流水线并行、FSDP/ZeRO)。
九、训练过程与自定义 (以 SWIFT 框架为例)
- SWIFT 框架提供了便捷的 LLM 训练和推理工具(包括
sft_main
,infer_main
,web-ui
)。 - 自定义训练步骤:
- 选择启动方式 (UI 或命令行)。
- 选择模型。
- 准备自定义数据集 (遵循特定格式)。
- 参考已有脚本配置训练参数。
- 训练完成后进行推理和部署。
Last updated on