目录
预训练(Pretraining)与微调(SFT, Supervised Fine-Tuning)的区别
预训练(Pretraining)与微调(SFT, Supervised Fine-Tuning)的区别
训练方式
- 相同点:预训练和微调在训练方式上没有任何区别,都是通过梯度下降等优化算法来调整模型参数。
- 不同点:主要区别在于数据的组成形式和训练目标。
数据组成
-
预训练(Pretraining):
- 每条数据通常是满编的,例如4K或8K长度的文本。
- 数据来源广泛,通常是无标签的海量文本数据。
- 主要目的是让模型学习语言的基本结构和广泛知识。
-
微调(SFT, Supervised Fine-Tuning):
- 每条数据的长度根据原始数据的实际长度决定,不一定是满编的。
- 数据通常是有标签的,并且包含特定任务的标注信息。
- 引入预训练阶段未见过的特殊标记(special_token),如system、user、assistant等,以帮助模型学习新的语义和角色。
- 微调数据中会包含最重要的eos_token,以便模型在生成时知道何时停止。
特殊标记(Special Tokens)
-
预训练(Pretraining):
- 通常不包含特殊标记,模型主要学习通用的语言模式。
-
微调(SFT, Supervised Fine-Tuning):
- 引入特殊标记(special_token),如system、user、assistant等,根据业务需求也可以有“背景”、“旁白”、“事件”等。
- 这些标记帮助模型理解和区分不同的角色和语境。
Prompt处理
-
预训练(Pretraining):
- 通常不涉及prompt,模型学习的是通用的语言知识。
-
微调(SFT, Supervised Fine-Tuning):
- Prompt的同质化比较严重,所以通常不计算prompt的loss,但如果确保每条prompt都是独一无二的,可以省去prompt的loss_mask环节。
Session数据处理
- 在微调过程中,需要明确是每一个answer都算loss,还是只对最后一轮的answer算loss。
训练目的
-
预训练(Pretraining):
- 主要是让模型背书,纯粹学习语言的广泛知识和结构。
-
微调(SFT, Supervised Fine-Tuning):
- 主要是让模型做题,学习指令跟随能力(instruction-following ability)。
- 不建议在微调阶段进行知识注入,因为这会显著降低模型的通用能力。知识注入工作应该采用继续预训练(continue-pretraining)的思路进行,控制在10%~20%的比例,而不是100%某个知识。
小结
- 预训练:使用大量无标签数据进行训练,主要学习语言的基本结构和广泛知识。
- 微调:使用有标签数据进行训练,主要学习特定任务的指令跟随能力和语义理解。
通过预训练和微调的结合,LLM能够在广泛的语言理解和生成任务中表现出色,同时也能在特定任务中达到高水平的性能。
LLM大模型预测耗时的粗略估计
在自然语言处理模型,特别是生成式模型(如GPT系列)中,预测时间的近似估算可以表示为:
y=kx+b
其中:
- y 是总预测时间。
- x 是生成的 token 总数量。
- k 是生成每个 token 的平均耗时。
- b 是生成首个 token 的耗时。
这个公式中的 b 和 k 主要受到以下几个因素的影响:
1. 首个 Token 的生成耗时(b)
首个 token 的生成耗时较长,主要原因如下:
1.1 编码阶段
- 在生成第一个 token 时,模型需要对输入的 prompt 进行编码。这涉及到将输入序列通过多层 Transformer 编码器进行处理,以生成上下文向量。
1.2 KV Cache 初始化
- 在生成第一个 token 时,模型需要初始化 Key-Value (KV) 缓存。KV 缓存用于存储每一层 Transformer 的键和值,以便在生成后续 token 时,可以快速访问这些缓存,减少重复计算。初始化 KV 缓存的过程较为耗时,因为需要对整个输入序列进行计算。
1.3 长度相关性
- 首个 token 的生成耗时与输入 prompt 的长度呈正相关,因为较长的输入序列需要更多的计算资源和时间来进行编码和初始化缓存。
2. 后续 Token 的生成耗时(k)
生成后续 token 的耗时较短,主要原因如下:
2.1 KV Cache 利用
- 在生成后续 token 时,模型可以利用之前生成的 KV 缓存,从而避免对整个输入序列进行重复计算。这样,生成每个新 token 只需要在现有缓存的基础上进行增量计算,大大减少了计算量和时间。
2.2 自回归生成
- 生成每个新 token 时,模型会将前一个 token 的输出作为输入,结合 KV 缓存,快速生成下一个 token。这种自回归生成方式在时间复杂度上相对较低。
详细过程
- 输入编码:模型首先对输入 prompt 进行编码,生成上下文向量。这一步包括嵌入层和多层 Transformer 编码器的计算。
- KV 缓存初始化:在生成第一个 token 时,模型会初始化 KV 缓存,用于存储每一层 Transformer 的键和值。
- 首个 token 生成:利用上下文向量和初始化的 KV 缓存,生成第一个 token。
- 后续 token 生成:在生成每个新 token 时,模型利用之前的 KV 缓存和前一个 token 的输出,进行增量计算,快速生成下一个 token。
近似估算公式的应用
通过公式 y=kx+b,我们可以近似估算模型的预测时间:
- 首个 token 的耗时 b:与 prompt 的长度和 KV 缓存的初始化有关,通常是生成每个 token 耗时 k 的十几倍或更多。
- 每个 token 的平均耗时 k:由于利用了 KV 缓存,生成每个新 token 的耗时较短且相对稳定。