DeepSeek LLM发布于2024年1月,收集了2万亿个词元用于预训练,在模型层面沿用了LLaMA的架构,并将余弦退火学习率调度器替换为多阶段学习率调度器,便于持续训练。并从多种来源收集了超过100万个实例进行监督微调(SFT)。此外,利用直接偏好优化(DPO)技术进一步提升模型的对话能力。
一、预训练
1. 数据
为了全面提升数据集的丰富性和多样性,将数据构建方法分为三个关键阶段:去重、过滤和混洗。
(1) 去重阶段
采用激进的去重策略,扩大去重范围。分析表明,对整个Common Crawl语料库进行去重比单独处理单个数据包更能有效去除重复实例。如表展示了在跨91个数据包进行去重时,消除的重复文档数量是单个数据包方法的4倍。
各种Common Crawl数据包的去重比率
(2) 过滤阶段
在过滤阶段,专注于制定用于文档质量评估的稳健标准。
(3) 混洗阶段
调整策略以解决数据不平衡问题,侧重于增加代表性不足领域的数据。
DeepSeek LLM基于分词器库(Huggingface)实现了字节级字节对编码(BBPE)算法。与GPT-2类似,采用预分词处理,以防止来自不同字符类别的(如换行符、标点符号和中日韩(CJK)字符)合并。
此外,将数字拆分为单个数字,且将词汇表中的常规标记数量设定为100000。该分词器在一个约24GB的多语言语料库上进行训练,并在最终词汇表中增加了15个特殊词元标记,使得词表总大小达到100015个。同时,为确保训练期间的计算效率并为未来可能需要的额外特殊标记预留空间,将模型的词汇表大小配置为102400。
2. 架构
(1) 微观设计
DeepSeek LLM微观设计主要沿用了LLama的设计思路,具体包括:
- 归一化结构:采用Pre-Norm结构,使用RMSNorm归一化函数。
- 激活函数:在前馈网络(FFN)中使用SwiGLU激活函数,中间层维度为。
- 位置编码:使用旋转嵌入(RoPE)进行位置编码。
- 注意力机制:为优化推理成本,67B模型采用分组查询注意力机制(Grouped-Query Attention,GQA),而非传统的多头注意力(MHA)。
(2) 宏观设计
在宏观设计方面,DeepSeek LLM与大多数现有模型有所不同:
- 层数调整:70亿参数的DeepSeek LLM是一个30 层的网络,670亿参数的DeepSeek LLM有95层。这种层数调整不仅保持了与其他开源模型的参数一致性,还便于模型的流水线划分,从而优化训练和推理过程。
- 参数扩展策略:选择了增加网络深度而不是拓宽FFN层的中间宽度来扩展67B模型的参数,以追求更好的性能。
详细的网络规格如表所示。
DeepSeek LLM系列模型的详细规格
3. 超参数
DeepSeek LLM的初始化标准差为0.006,并使用AdamW优化器进行训练,具体超参数设置如下:
- 动量参数:
- 权重衰减:weight_decay = 0.1
- 梯度裁剪:训练阶段的梯度裁剪值设为1.0
在预训练过程中,采用了多阶段学习率调度器,而非传统的余弦退火调度器。具体的学习率变化策略如下:
- 预热阶段:学习率在前2000个warmup steps后线性增加到最大值。
- 第一阶段:处理完80%的训练词元后,学习率降低到最大值的31.6%。
- 第二阶段:处理完90%的训练词元后,学习率进一步降低到最大值的10%。
通过这种方式,多阶段学习率调度器能够在保持最终性能与余弦调度器一致的同时,提供更方便的持续训练支持。如图(a)所示,尽管训练损失曲线的趋势有所不同,但最终性能基本一致。
调整不同阶段的比例可以略微提升性能,如图(b)所示。然而,为了平衡持续训练中的复用比例和模型性能,选择了80%、10%和10%的三阶段分布。
不同学习率调度器的训练损失曲线
此外,batch size和学习率会随模型规模的不同而变化。具体可参见DeepSeek LLM系列模型的详细规格表。
4. 基本框架
DeepSeek LLM使用的是高效且轻量级的训练框架HAI-LLM。该框架集成了数据并行、张量并行、序列并行和1F1B流水线并行技术。此外,还利用闪存注意力机制(Flash Attention)技术来提高硬件利用率。采用ZeRO-1方法在数据并行节点之间划分优化器状态。
(1) 计算与通信优化
为了最小化额外的等待开销,采取了以下措施:
- 计算与通信重叠:包括最后一个微批次的反向传播过程和ZeRO-1中的reduce-scatter操作,以及序列并行中的矩阵乘法(GEMM)计算和all-gather/reduce-scatter操作。
- 层/运算符融合:通过融合LayerNorm、尽可能多的矩阵乘法运算和Adam更新,加速训练过程。
- 精度优化:模型以bf16精度进行训练,但梯度累积以fp32精度进行,以提高训练稳定性。
- 交叉熵优化:采用in-place交叉熵计算,减少GPU内存消耗。具体来说,在交叉熵CUDA内核中动态地将bf16对数几率(logits)转换为fp32精度,并计算相应的bf16梯度,覆盖对数几率(logits)以存储其梯度。
(2) 模型保存与恢复
模型权重和优化器状态每5分钟异步保存一次,这意味着即使在偶尔的硬件或网络故障情况下,最多也只会丢失5分钟的训练进度。这些临时模型检查点会定期清理,以避免占用过多的存储空间。并支持从不同的3D并行配置恢复训练,以应对计算集群负载的动态变化。
(3) 模型评估
在生成任务中,使用vLLM进行评估;而在非生成任务中,采用连续批处理方法,以避免手动调整批处理大小和减少token填充,从而提高评估效率。
二、Scalling lows
关于缩放定律(Scalling lows)的最早研究是在大模型出现之前的。研究表明,通过增加计算预算(C)、模型规模(N)和数据规模(D),可以提升模型性能。当模型规模(N)由模型参数表示,数据规模(D)由词元数量表示时,计算预算(C)可以近似为。
为了减少实验成本和拟合难度,采用了Chinchilla中的IsoFLOP profile方法来拟合缩放曲线。为了更准确地表示模型规模,使用了新的模型表示法——非嵌入FLOPs/token-M,取代了之前使用的模型参数(N),并将计算预算公式从改为更精确的
。实验结果提供了关于最优模型/数据扩展分配策略和性能预测的见解,并准确预测了DeepSeek LLM 7B和67B模型的预期性能。
IsoFLOP曲线和最优模型/数据分配
该研究在缩放定律方面的贡献和发现可以总结如下:
- 建立了超参数的缩放定律,为确定最优超参数提供了一个经验框架。
- 采用非嵌入FLOPs (M) 表示模型规模,更准确的最优模型/数据扩展分配策略和更好的大模型泛化损失预测。
- 提出预训练数据质量影响最优模型/数据扩展分配策略,数据质量越高,增加的计算预算应更多地分配给模型扩展。
- 证明了缩放定律的普遍适用性,并预测了未来更大规模模型的性能。
1. 超参数缩放定律
DeepSeek LLM 最初在计算预算的小规模实验中对批量大小和学习率进行了网格搜索,针对特定模型规模(每词元1.77亿次浮点运算)的实验结果如下图所示。结果显示,在广泛的批量大小和学习率选择范围内,泛化误差保持稳定。这表明,可以在相对宽泛的参数空间内实现接近最优的性能。
利用上述多步学习率调度器,通过复用第一阶段的训练成果,对多个具有不同批量大小、学习率以及计算预算(范围从到
FLOPs的模型进行了有效训练。考虑到参数空间中的冗余,将泛化误差不超过最小值0.25%的模型视为近似最优超参数。
随后,拟合了批量大小B和学习率与计算预算C的关系。如下图所示,随着计算预算C的增加,最优批量大小B逐渐增加,而最优学习率
逐渐减小。这与模型扩量时对批量大小和学习率的直观经验设置相符。此外,所有近似最优超参数都落在一个较宽的区间内,表明在这个区间内选择近似最优参数相对容易。
最终拟合出的批量大小和学习率公式如下:
DeepSeek LLM 在一系列计算预算为FLOPs的模型上验证了这些公式,特定模型规模(每词元2.94亿次浮点运算)的验证结果如上图 (b) 所示。结果显示,拟合参数集中在最优参数空间内。
需要注意的是,目前的研究尚未考虑超出计算预算C的其他因素对最优超参数的影响。这与一些早期研究成果不一致,后者认为最优批量大小可以建模为仅与泛化误差L相关。此外,在计算预算相同但模型/数据分配不同的模型中,最优参数空间存在细微差异。
2. 估算最优模型和数据规模
在推导出拟合近似最优超参数的公式后,开始拟合缩放曲线并分析最优模型/数据扩展分配策略。这一策略旨在找到分别满足和
的模型扩展指数a和数据扩展指数b,其中数据规模D可以用数据集中的词元数量来表示。
在早期的研究中,模型规模通常由模型参数表示,包括非嵌入参数和完整参数
,计算预算C与模型/数据规模之间的关系可以近似描述为
,即可以用
或
来近似模型规模。
然而,由于和
都没有考虑注意力操作的计算开销,并且
还包括了对模型容量贡献较小的词汇表计算,因此在某些设置下存在显著的近似误差。
为了减少这些误差,引入了一种新的模型规模表示法:非嵌入层每词元浮点运算次数M, M包括了注意力操作的计算开销,但不考虑词表计算。使用M表示模型规模时,计算预算C可以简单地表示为。、
和
的具体差异如下:
其中,表示层数,
表示模型宽度,
是词表大小,
是序列长度。
如下表所示,在不同规模的模型上评估了这三种表示法的差异。
不同模型规模表示法的差异及非嵌入参数N1和完整参数N2相对于每词元非嵌入M的差异
结果表明,和
在不同规模的模型中都会高估或低估计算成本,这种差异在小规模模型中尤为明显,最大可达50%。这种不准确性在拟合缩放曲线时会引入显著的统计误差。
采用M表示模型规模后,目标可以清晰的描述为:给定计算预算,找到最小化模型泛化误差的最佳模型规模
和数据规模
。这个目标可以形式化为:
为了减少实验成本和拟合难度,采用Chinchilla模型的等浮点运算量(IsoFLOP)配置方法来拟合缩放曲线。DeepSeek LLM选取了从到
的8个不同的计算预算,并为每个预算设计了大约10种不同的模型/数据规模分配方案。每个预算的超参数由拟合得到的批量大小和学习率公式确定,并在独立验证集上计算泛化误差,该验证集与训练集分布相似,包含1亿个词元。
上图展示了IsoFLOP曲线和模型/数据缩放曲线,这些曲线是通过使用每个计算预算下的最优模型/数据分配拟合得出的。最优非嵌入层每词元浮点运算次数和
最优词元数量的公式如下:
此外,根据计算预算C和最优泛化误差拟合了损失缩放曲线,并预测了DeepSeek LLM 7B和67B模型的泛化误差,如图所示。结果显示,利用小规模实验能够准确预测计算预算为其1000倍的模型的性能。
三、对齐
为确保实际应用的有用性和安全性,DeepSeek LLM收集了大约150万条英文和中文的指令数据实例,涵盖了广泛的有益性和无害性话题。其中,有益数据包含120万个实例,具体分布为:31.2%为一般语言任务,46.6%为数学问题,22.2%为编程练习。安全数据则由30万个实例组成,覆盖了各种敏感话题。
对齐流程
DeepSeek LLM对齐流程分为两个阶段:监督微调(Supervised Fine-Tuning, SFT)和直接偏好优化(Direct Preference Optimization, DPO)。
(1) 监督微调(SFT)
①训练设置:
- 对7B模型进行4个epoch的微调,对67B模型仅进行2个epoch的微调,因为观察到67B模型存在严重的过拟合问题。
- 7B和67B模型学习率分别为
和
。
- 微调过程中,不仅监控基准准确度,还评估聊天模型的重复率。共收集了3868个中英文提示,并确定生成响应未能终止而是无限重复文本序列的比例。
- 观察到随着数学SFT数据量的增加,重复率有上升趋势。这可能是由于数学SFT数据中偶尔包含类似的推理模式,导致较弱的模型难以掌握这些模式,从而产生重复响应。
②解决重复问题:
- 尝试了两阶段微调和DPO方法,这两种方法都能几乎保持基准分数并显著减少重复。
(2) 直接偏好优化(DPO)
①训练设置:
- 为了进一步增强模型的能力,使用了直接偏好优化算法DPO,这是一种简单但有效的方法,用于LLM的对齐。
- 构建了关于有益性和无害性的偏好数据。对于有益性数据,收集了涵盖创意写作、问答、指令跟随等类别的多语言提示,并使用DeepSeek Chat模型生成响应候选。对于无害性偏好数据,也采用了类似的操作。
- DPO训练了一个epoch,学习率为,批量大小为512,使用了学习率预热和余弦学习率调度器。
②效果:
- DPO可以强化模型的开放式生成能力,同时在标准基准性能上几乎没有差异。
参考:https://arxiv.org/abs/2401.02954