该文章记录自己对于DeepSeek相关论文阅读的阅读过程和理解,非专业解读。
1.DeepSeek LLM:Scaling Open-Source Language Models with Longtermism
1.1. 摘要
主要讲DeepSeek-AI团队研究了一种新的缩放定律Scaling laws,该定律用于在确定compute budget(预算)的情况下调控数据规模和模型参数量的比例。通常是先在小模型中拟合出缩放定律,再将该定律应用到参数量较大的模型中进行预估权衡。
讲述了训练DeepSeek LLM模型时用到了哪些东西:1.训练集,使用了自己制作的包含2万亿个tokens的数据集,并且这个数据集仍在扩大;2.对于预训练得到的Base Models,使用了SFT(supervised fine-tuning,监督微调)和DPO(direct preference optimization,直接偏好优化),将Base Models转化为Chat Models。
DeepSeek LLM 67B的表现超过了GPT-3.5。
DeepSeek LLM是开源模型。
1.2. Introduction
主要讲了LLM的现状,重点是:LLM的浪潮由闭源模型掀起(如GPT,Claude),而它们通常是利用昂贵的算力资源和标注成本开发出来的。随后有了开源模型如LLaMA,但这些开源模型的研究往往针对的是训练固定参数量的模型(如7B,13B,34B,70B),而忽视了对LLM缩放定律的研究和探索。
1.3. Pre-Training
1.3.1 Data
DeepSeek AI团队对于训练数据的处理主要分为三个阶段:deduplication(去重),filtering(过滤)和remixing(重组)。
去重:采用了一个较为激进的去重策略,扩大了去重范围。针对整个语料库而不是以dump为单位进行去重。
过滤:自行制定了文档质量评估标准。
重组:主要是为了解决数据不均衡的问题。加强了代表性不足领域的样本的占比。
分词器:使用了基于tokenizers library的Byte-level Byte-Pair Encoding算法。使用预分词是为了防止不同字符类别(如换行符,标点符号,中日韩符号)的token被搞混。GPT-2也用了这样的处理方式。同时,沿袭了(Touvron等,2023a,b)的方法将数字拆分为单独的digits(各个位数)。然后讲了一下分词器的具体训练过程。
1.3.2. Architecture架构
1.3.3. Hyperparameters超参数
standard deviation 0.006
使用AdamW优化器:β1 = 0.9, β2 = 0.95, and weight_decay = 0.1
关于学习率的改变,没有采用余弦调度器cosine scheduler,而是一个多步学习率调度器(简单说就是有一个热身环节比如前2000步,然后主要环节,然后到最后阶段,这几个阶段的学习率的变化是不同的)。最终使用的是80%+10%+10%。在2000步的热身后学习率达到最大,随后学习率在训练了80%的tokens之后降至最大值的31.6%,然后到训练了90%的时候降至最大值的10%。

训练阶段的gradient clipping:1.0
1.3.4 Infrastructure基础设施
使用的训练框架为 HAI-LLM
采用了flash attention(闪存注意力)技术提高硬件利用率。
使用ZeRO-1在数据并行层级间划分优化器状态。此外,还通过重叠计算与通信来最小化额外等待开销,包括ZeRO-1中最后微批次的反向传播与reduce-scatter操作,以及序列并行中矩阵乘法计算与all-gather/reduce-scatter的时序重叠。某些层/算子会尽可能进行融合以加速训练,包括层归一化(LayerNorm)、通用矩阵乘法(GEMM)和Adam优化器更新。(这个看不懂,ai翻的)
以bf16的精度训练模型,以fp32精度累加梯度。
执行原位交叉熵计算以降低GPU内存占用,即:我们在交叉熵CUDA核函数中即时将bf16格式的logits转换为fp32精度(而非事先在HBM中进行转换),计算出对应的bf16梯度,并用梯度值覆盖原logits。(这个看不懂,ai翻的)
模型权重和优化器状态每5分钟保存一次。
我们还支持从不同的3D并行配置恢复训练,以应对计算集群负载的动态变化。(这个看不懂,ai翻的)
在evaluation阶段,对生成式任务采用vLLM,非生成式任务采用连续批处理技术。
1.4. Scaling Laws
先前的:C = 6ND,C为compute budget计算预算,N为model scale,D为Data Scale。
本文的:C = MD,C为compute budget计算预算,M为non-embedding FLOPs/token(非嵌入式FLOPs/token),D为Data Scale
1.4.1 Scaling Laws for Hyperparameters关于超参的缩放定律
通过在小型模型上的网格搜索来寻找关于batch size和learning rate的最佳组合。
结果表明,在非常大的的Batch Size和学习率选择范围内,泛化误差保持稳定。(意思这两个参数不是很灵敏,不用费心调)

得到学习率η和批大小B关于计算预算的计算如下:

1.4.2 Estimating Optimal Model and Data Scaling估计最佳的模型和数据集规模
对于模型规模M和数据集规模D,寻找如同上述公式里的0.3118*C的-0.1250次方,0.2920*C的0.3271次方里的系数和指数,使得
将上述问题当作一个优化问题,寻找使得泛化误差最小的M_opt和C_opt。

论文中给出的具体计算公式如下:
同时,论文还拟合了loss曲线来计算compute budgetC和最优的泛化误差,发现在通过在小规模实验下得到的曲线可以很好地预测1000倍以上compute budget时的情况。
1.4.3 Scaling laws with different data对于不同数据集的scaling laws
使用了三种不同的数据集进行测试:early in-house data(早期内部数据)、current in-house data(现有内部数据)、OpenWebText2(被用于先前的scaling laws),他们的数据质量依次递增.

观察到的现象是:数据集质量越好,模型的缩放指数a增加而数据的缩放指数减小,表明应更多地将增加的算力预算分配给模型而非数据。
1.5 Alignment
收集了1.5million个中英文指令数据实例,它们包含了许多有益和无害的主体。有益数据有120万条,其中31.2%是通用语言任务,46.6%是数学问题,22.2%是编程问题。另外有30万的安全数据,涵盖了许多敏感话题。
alignment pipleline(对齐流程)主要分为两步。
1.5.1 Supervised Fine-Tuning(监督微调)
对7B模型微调4个epoch,对67B模型微调2个epoch(因为在67B模型上观察到了严重的过拟合现象)7B模型的学习率设置为1e-5,67B为5e-6.在微调过程中,除了监控benchmark的精准度,还会评估聊天模型的重复率(无限重复文本序列)。观察到,随着数学SFT数据量的增加,重复率会上升。为了解决这个问题,团队尝试了两阶段为微调和DPO(direct preference optimization),发现两者都可以在维持benchmark分数的同时显著降低重复率。
1.5.4 Direct Preference Optimization
根据有益性和无害性构建了用于DPO训练的偏好数据。
对DPO训练了一个epoch,学习率为5e-6,batch size为512,同时使用了学习率热身机制和余弦调度器。
1.6 Evaluation
主要是展示模型效果的,直接看原文吧。
里面比较有意思的发现:DeepSeek 67B相对于LLaMA2 70B的优势,比DeepSeek 7B相对于LLaMA2 7B的优势更为明显。这一现象突显出语言冲突对较小模型的影响更大。
1.6.1 Discussion
DeepSeek团队在开发过程中有一些有趣的发现:
1.Staged Fine-Tuning:小型模型需要在数学和代码数据集上进行更长时间的微调,但这会损害模型的对话能力,例如增加重复行为。为解决该问题,DeepSeek团队实施了分阶段微调方案:第一阶段使用所有可用数据进行微调,第二阶段则专门针对对话数据进行定向微调。

2.Multi-Choice Question:在对齐阶段,测试了加入了2000万道中文多选题后模型的表现,发现加入这些题后模型不光在中文选择题基准测试上有益,还提升了英语基准测试的表现,但这种提升并没有延伸到其他非选择题形式的评估任务上。所以猜测可能这样的数据对模型实现真正的对话互动没有好处,而是可能让模型过拟合。所以在训练中排除了多选题数据。

3.Instruction Data in Pre-Training:团队在在预训练阶段最后10%的进度中整合了500万条以多选题为主的指令数据。实证表明,基础模型在基准测试中的性能确实有所提升,但最终效果与将同等数据用于监督微调(SFT)阶段所获结果基本持平。由此得出结论:该方法虽能强化基础模型的基准测试表现,但其整体效益与不引入指令数据相当。若指令数据规模足够庞大,将其纳入预训练环节是可取的。而DeepSeek因为偏向在训练中排除多选题数据,并且拥有的非多选题数据有限,所以没有在预训练过程中使用这些指令数据。
4.System Prompt:借鉴了LLaMA-2的prompt,在其中做了些微修改。
You are DeepSeek Chat, a helpful, respectful and honest AI assistant developed by DeepSeek. The knowledge cut-off date for your training data is up to May 2023. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature. If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don’t know the answer to a question, please don’t share false information.
在7B的模型上引入prompt,模型在MT Bench上的性能略微下降;而在67B模型上引入prompt时,模型性能变好。其原因可能是:更大规模的模型能够更准确理解系统提示的深层意图,从而更高效地执行指令并生成优质响应。相比之下,较小模型难以充分把握系统提示的要义,加之训练与测试场景的不一致性,最终导致其表现欠佳。

1.7 Conclusion,Limitation,and Future Work
局限性:练后缺乏持续的知识更新、可能生成未经验证建议等非事实信息,以及产生幻觉的倾向。同时,DeepSeek团队的训练中的初始中文数据尚未覆盖全部领域。
深度求索(DeepSeek)大语言模型是一项致力于推进开源语言模型发展的长期项目。
- 团队即将发布关于代码智能与混合专家系统(MoE)的技术报告。这些报告将展示我们如何构建高质量的预训练代码数据,并设计稀疏模型以实现媲美密集模型的性能。
- 现在,团队正在为下一代模型构建更大、更优质的数据集。希望新版本在逻辑推理、中文理解、数学与编程能力等方面都能取得显著提升。
- 初步实验证明,强化学习能够提升模型的复杂推理能力。