“能生成一只狗”和“在新场景里仍生成同一只狗”,对模型的要求并不一样。前者依赖较广泛的基础生成能力,后者可能需要更有针对性的数据与适配。预训练、后训练和 LoRA,描述了这件事的不同层面。
预训练与后训练主要按阶段和目标区分;LoRA 是一种参数高效的适配方法。理解这个关系,就能继续追问:模型已经有什么能力,这次要改善什么,又准备更新哪些参数?
01预训练建立基础能力,后训练面向具体目标
预训练,是在较广泛的数据上,建立可供后续使用和适配的基础模型。对文生图模型来说,图像和文字描述帮助它学习视觉结构、内容组合,以及文字与图像之间的联系。[2][3]
后训练,是基础模型形成之后,为具体使用目标继续进行的训练。目标可能是更好地执行指令、适应某类内容,或让输出更符合人的偏好。区别主要在训练所处的位置和想解决的问题;不能只按数据多少或训练时间长短划分。
例如,模型已经能生成不同品种的狗;如果希望它在新场景里仍表现出某一只狗的特征,就需要更有针对性的适配。DreamBooth 研究的是用少量主体图片微调文生图模型。[9] 另一类目标是学习人的偏好:Diffusion-DPO 利用同一提示词下的图片偏好对优化模型。[4] 这两种目标需要不同的训练信号。
FIGURE 01 / 预训练与后训练的对照点图放大
图 1|按数据、目标、起点与产物对照两类训练安排。LoRA 与蒸馏属于方法维度,不能作为必经阶段顺次排列。[3][8]“预训练”也不表示整套系统的每个组件都必须从零开始:生成网络可以搭配已有的文本编码器和图像编码器。各团队对后训练的阶段边界并不完全一致,读模型介绍时,还需要看具体的数据与目标。[3]
02训练,改变的是模型里的参数
训练,是利用数据和目标,反复更新模型的可训练参数。论文通常用 θ 表示参数,也常称作权重。以经典的噪声预测扩散训练为例:向图片加入已知噪声,让模型预测加入的噪声,再比较预测与目标之间的差距。[1][2]
损失函数(Loss)把这种差距写成可计算的目标。优化器根据损失的梯度调整参数。损失下降首先说明指定训练目标做得更好,是否满足创作者的要求,还要用未参与训练的样本和相应标准检查。
ComfyUI 中 KSampler 的 Steps,控制的是一次生成推进多少步;训练脚本中的优化步骤则调整可训练参数。增加采样步数,不会让已经加载的模型重新学习。
不同模型可以使用不同的训练目标。例如 SD3 的 rectified flow 学习速度场,即不同噪声状态下应怎样更新。[3] 构造输入、计算目标、衡量差距、更新参数,是理解这些训练方案的共同起点。
论文里的“更新参数”,可以怎样读?
θ ← θ − η ∇θ L
这是一种最简单的梯度下降写法。θ 是可训练参数,L 是损失,∇θ L 表示损失相对参数的变化方向,η 是学习率。优化器根据这些信息计算一次更新;实际模型常用 AdamW 等更复杂的优化器。
学习率决定训练更新的尺度。CFG 作用于采样时的条件引导,不负责学习参数。
03LoRA 改的是什么,为什么能少训练一些参数?
LoRA 是 Low-Rank Adaptation,通常译为低秩适配。它保留已有模型的原权重,在选定层旁边增加可训练的低秩增量。训练时主要更新这些新增参数;原有的大矩阵保持冻结。[8][10]
把一个线性层的原权重记作 W₀。全量微调可以直接调整 W₀;标准 LoRA 则让两个较小的矩阵 A 和 B 相乘,形成权重增量 BA。计算输入 x 时,将增量支路的输出 sBAx 与主路输出 W₀x 相加。图中灰蓝色是冻结主路,暖色是参与训练的增量支路。
“低秩”约束的是更新量,不是把原模型的大矩阵删掉。A 先把输入映射到较小的中间维度 r,B 再映射回输出维度。BA 的秩最多为 r,用较少的参数表达一组受约束的变化方向。[8]
FIGURE 02 / 冻结原权重,训练低秩增量点图放大
图 2|一个线性层的 LoRA 结构示意。主路 W₀ 冻结,A 与 B 可训练;s 表示增量的总缩放。图中尺寸与 1.56% 仅用于解释单个矩阵,不代表整模型的性能或显存比例。[8][10]用一层矩阵,算清楚“少”在哪里
假设原矩阵是 1024 × 1024,它有 1,048,576 个参数。取 rank=8 时,A 是 8 × 1024,B 是 1024 × 8,一共新增 16,384 个可训练参数,约为原矩阵的 1.56%。这只是一个矩阵的算例,不代表整模型的显存或训练时间也降到了 1.56%。
原模型仍需加载,前向计算、中间激活等也有开销。LoRA 节省的主要是需要更新的参数及相关训练状态;最后保存的适配权重通常也更小。[10][11]
只算这一层的可训练参数
LoRA 新增可训练参数
相对原矩阵参数量
8 × (1024 + 1024) = 16,384
原矩阵固定为 1024 × 1024;条带全长表示 1,048,576 个参数。图 2 展示 r = 8,这里可以单独比较其他 rank。
rank、alpha 和加载强度,各自控制什么
这几个数字都可能出现在 LoRA 工具里,但作用不同。
| 设置 | 它控制的内容 |
|---|
| rank(r) | 低秩支路的中间维度。r 增大,可训练参数增加,表达更新的空间也增大;效果还取决于数据和训练配置。 |
| alpha(α) | 训练配置中的缩放超参数。标准 LoRA 使用 α/r 缩放增量;它不是学习率。rsLoRA 等变体会采用不同规则。[10] |
| 加载时的强度 | 推理时进一步调整适配增量的影响。0.5 不表示“保留了 50% 的画风”,也不会重新训练 A 和 B。[12] |
图中的 s 概括增量支路的总缩放。理解图时先看两条支路怎样相加;设置具体工具时,再查看它如何处理 alpha、rank 与加载强度。
主体、画风与兼容性,要一起看
LoRA 是更新参数的方法,并不指定要学习哪种内容。主体个性化可以把 DreamBooth 的训练方案与 LoRA 结合:前者规定围绕哪个主体、怎样组织训练,后者决定哪些参数参与更新。[9][11][15]
准备同一只狗的图片时,可以先区分“希望保留的身份特征”和“允许变化的背景、角度、光线”。如果样本总是同一个背景,就难以判断模型学到的是主体,还是把主体与背景一起记住了。验证时应检查未用于训练的场景,而不只是回看训练图片。
加载 LoRA 还要匹配基础模型和目标层。为 SD1.5 训练的适配器,不能因为文件也叫 safetensors 就直接用于 SDXL 或 SD3.5。LoRA 文件通常保存的是适配增量;加载或合并到模型,是使用已经训练好的参数,和重新训练是两回事。[12]
04蒸馏:用已有模型的能力指导另一个模型
知识蒸馏(Knowledge Distillation),是用已有模型提供的训练信号,指导另一个模型学习。提供信号的通常叫教师模型(Teacher),接受训练的叫学生模型(Student)。学生可以学习教师的输出分布、预测结果,或由教师构造的监督目标。[5]
早期蒸馏工作常讨论把大模型或模型集成的能力转移给更便于部署的模型。因此,“让模型更小”是一个常见用途。但在图像生成里,还有另一类需求:减少一次生成需要的采样步骤。[5][6]
少步蒸馏,希望把较多次采样计算所完成的生成过程,学成更少次更新。例如 Progressive Distillation 论文让学生学习教师两步采样的结果,再逐级压缩采样步数。[6] 学生要为这种走法接受训练;只把普通模型的 Steps 从 20 改成 4,并没有发生蒸馏。
FIGURE 03 / 教师两步,学生学习用一步逼近点图放大
图 3|依渐进蒸馏的两步到一步思路作图。教师提供训练目标,学生更新参数去逼近;图不表示两者输出完全相同,也不是速度实测。[6]图 3 取渐进蒸馏中“学生一步学习教师两步”的思路作概念示意,并非 SD3.5 Turbo 的 ADD 完整训练图。蒸馏可以参与不同阶段的训练;它与 LoRA 也不是互斥分类,一个强调监督从哪里来,一个强调如何表示参数更新。
05去 Hugging Face 看三个具体例子
先从小样本和官方脚本看起,把“数据怎样提供信号”与“哪些参数被更新”联系起来。下面两个数据集均已查看实际字段;文档示例的模型版本也需要对应阅读。
数据集 · 元数据与描述
huggan/smithsonian_butterflies_subset
当前 train 分割有 1,000 条记录,含 image、name、scientific_name、image_alt 等字段。它原本是为蝴蝶 GAN 处理的子集,不能只凭“有图有字”就当作现成的文生图训练配方。[13]
打开后可以这样看打开一条记录,对照图片、物种名和 image_alt:这些文字有没有描述翅膀颜色、姿态与背景?试着写一句描述可见内容的 caption,并区分视觉描述与分类元数据。
数据集 · 主体个性化
diffusers/dog-example
官方示例仓库有 5 张图片,Dataset Viewer 只有 image 字段,没有逐图 caption。训练提示词如何设置,需要结合 DreamBooth 文档来看。[14][15]
打开后可以这样看观察五张图里,主体特征有哪些重复,场景和姿态有哪些变化。再看文档如何用 instance_prompt 指定主体,把它与逐图 caption 的用法分开。
对应 DreamBooth 文档 ↗
官方实现 · LoRA 参数怎样进入训练
Diffusers / Training / LoRA
重点看 LoraConfig 中的 r、lora_alpha、target_modules,以及优化器接收哪些参数。当前文档示例使用 SD1.5 与 UNet,不能直接当成 SD3.5 的训练脚本。[11]
打开后可以这样看找到“冻结原参数”“添加 LoRA”“只把适配参数交给优化器”的代码。能把这三处与图 2 对上,就能看懂 LoRA 在实际训练里怎样生效。
PEFT 的 LoRA 参数说明 ↗
这些入口适合先观察数据和阅读实现,不要求立刻下载训练。用自己的项目素材替换示例之前,先写清希望保留什么、改变什么,以及准备怎样验证;再选择基础模型与适配方法。
06总结:理解训练,是为了更准确地选择方法
理解这些概念,最终要回到一个判断:我需要的效果,应该靠换模型、做适配,还是调整现有工作流来实现?预训练提供基础能力,后训练围绕使用目标继续优化;LoRA 描述怎样更新参数,蒸馏描述怎样借助教师提供的信号学习。它们并不是四个必须依次经历的步骤。
如果目的是让同一主体出现在新场景里,可以评估主体数据与 LoRA 适配;如果更在意生成速度,则可以比较少步蒸馏模型,同时检查细节和控制是否满足要求。
方法有没有价值,要看它是否改善了你在意的结果。先写清想保留什么、允许改变什么,再用未参与训练的场景检查。参数量更少、步数更低,都不能代替这一步判断。