Llama3.0论文学习笔记: The Llama 3 Herd of Models
1. 写在前面
今天分享Llama3.0的论文,2024.7月来自Meta的Llama团队,2025年1月DeepSeek R1出现之后,其风头显然已经盖住了Llama3,这时候整理Llama3感觉有点赶不上潮流了,但是我还是想整理下Llama3.0,原因是刚好春节的时候读了下原论文(起源是节后在公司做分享),另外一个是Llama3的技术比较成熟,很多大模型的语言部分都是Llama的架构,因此想做为入门大模型的第一个实践模型。
Llama3的技术报告也是长达94页,读完之后,还是有一种醍醐灌顶的感觉,里面还是写了非常多干货的,比如如何从零预训练一个大语言模型,后处理怎么做,海量的训练数据怎么清洗,如何用scaling laws定律指导模型的设计与训练等, 学习完之后,受益匪浅,这些也可以当作后面训练大模型的一些经验来用,所以想先用一篇笔记把Llama3的一些知识整理一下。
- 论文地址:https://arxiv.org/pdf/2407.21783
- llama网站:https://llama.meta.com/
- 模型链接:https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct
这篇论文介绍了Meta公司开发的新一代语言模型Llama 3,该模型支持多语言、代码、推理和工具使用。最大的模型是一个有405B参数的Dense Transformer架构(现在很多大的模型开始走MOE架构,比如DeepSeek系列), 最长能支持128K的上下文。 在很多任务上都和GPT-4的效果差不多。
下面用一个表来提炼论文内容:
模型 | Llama 3.1 405B |
---|---|
算力 | 3.8 ∗ 1 0 25 3.8 * 10^{25} 3.8∗1025FLOPS |
数据量 | 15.6 15.6 15.6 T(llama 2的50倍) |
支持上下文 | 128 128 128K(影响RAG的使用) |
特点 | 多语言、代码、推理、工具使用 |
训练架构 | Dense Transformer, 没有用MOE, 提升稳定性 |
训练方法 | Pre-train (初始预训练、上下文预训练, 退火训练) Post train(没有采用RLHF(基于人类反馈的强化学习),用的SFT(监督微调), RS(拒绝采样), DPO(直接偏好优化)) |
模型版本 | Pre-trained Llama3(8B、70B、405B) Post-trained Llama3 Instruct(8B、70B、405B) Llama Guard 3 (输入输出方面加了一些安全的策略) |
Ok, let’s go!
大纲如下:
- 1. 写在前面
- 2. What
- 3. Why
- 4. How
- 4.1 预训练
- 4.1.1 预训练数据
- 4.1.1.1 数据清洗
- 4.1.1.2 数据混合
- 4.1.1.3 退火数据
- 4.1.2 模型架构
- 4.1.2.1 Scaling Laws
- 4.1.3 训练的基础配置
- 4.1.4 训练丹方
- 4.2 后训练
- 4.2.1 奖励模型
- 4.2.2 监督微调(SFT)
- 4.2.3 DPO训练优化
- 4.2.4 模型平均
- 4.2.5 能力
- 5. 应用
2. What
基础模型是通用的语言、视觉、语音或其他模态的模型,用于支持各种各样的AI任务。
现代基础模型的发展包含两个阶段:
- 预训练阶段: 此阶段中,模型使用 诸如下一个词预测或标题生成等直接任务在大规模数据上训练(GPT1,2,3)
- 后训练阶段: 此阶段,模型被调整以遵循指令、与人类偏好保持一致, 并提升特定的能力,比如编码和推理(Instruct GPT)
Llama3 模型群是一套新的基础语言模型,该模型支持多语言、编程、推理和工具使用。最大的模型有405B参数, 在128K token的山下文窗口中处理信息。
开发高质量的基础模型,有3个关键因素:数据、规模、和复杂度管理。在Llama模型更新迭代过程,注重在3个关键因素上进行发力:
- 数据: 相比于早期的Llama模型,提升了预训练和后训练的数据量和质量, 为预训练数据开发了更细致的训练过程,后训练采用了更严格的数据过滤方法。 Llama 3是15T的多语言语料库进行的预训练, Llama 2是1.8T的语料库进行的训练。
- 规模:Llama3系列模型的参数规模远大于Llama 2, 最大的一个模型参数405B,计算量 3.8 ∗ 1 0 25 3.8*10^{25} 3.8∗1025 FLOPs, 是Lamma 2的50倍。
- 复杂度管理:用稠密的Transformer架构而不是MOE架构,后处理采用常规的监督学习微调(SFT),拒绝采样(rejection sampling, RS), 直接偏好优化(direct preference optimization, DPO), 相对简单,较稳定,容易扩展
3. Why
那么Llama3为啥会这么火呢? 首先看下Llama 3模型的表现
- 多领域任务表现突出:在多个基准测试中, Llama 3展示了强大的性能。 在常识推理,知识问答,阅读理解,数学推理,编码等任务,不同参数规模的Llama 3都有出色的表现。 Llama 3 405B的模型在多个任务上与GPT4表现相当。
- MMLU: 各种考试里面的多选题,考察的是知识面,各种知识记住了就会比较猛,模型越大可能越占优势, 近几年大模型可能overfit了
- IFEval: 看模型对各种指令的一个理解能力
llama模型在数学,代码,推理等方面的能力很强
- 多语言能力:支持至少8种语言,在多语言任务上表现良好
- 工具使用与多模态扩展:能使用多种工具,如搜索引擎,pyhon解释器和数学计算引擎等,零样本工具使用任务上表现出色。 通过组合方法为模型添加图像,视频和语音等能力
- 开源
- 支持128K上下文
整体来看,70B其实就够用, 各个任务上,8B和70B差的有点大,但70B和405B就没有那么大差距了。但405B的模型训练和推理成本会比较大,70B是一个性价比较高的模型。
4. How
Llama 3的模型架构
开发主要包括两个阶段:
- 预训练阶段: 首先将一个大型的、多语言的文本语料库转换为离散的token,在得到的数据上执行下一个token预测的任务预训练一个大型语言模型(LLM)。在语言模型预训练阶段,模型学习语言的结构,并从它正在 “阅读” 的文本中获得大量关于世界的知识。
- 后训练阶段:预训练的语言模型对语言有丰富的理解,但它还没有遵循指令或以我们期望的方式行事。在几轮中将模型与人类反馈对齐,每轮都涉及对指令调整数据和直接偏好优化的监督微调。
由此产生的模型具有丰富的功能集。他们可以用至少八种语言回答问题,编写高质量的代码,解决复杂的推理问题,并使用开箱即用或zero-shot的方式使用工具。
接下来,还加了图像、视频、语音等能力。
- 多模态编码器预训练:在大量图像 - 文本对上训练图像编码器。这教会模型视觉内容和自然语言中对该内容的描述之间的关系
- 视觉适配器训练:训练一个适配器,将预训练的图像编码器集成到预训练的语言模型中。
- 适配器由一系列交叉注意力层组成,这些层将图像编码器表示输入到语言模型中。
- 适配器在文本 - 图像对上进行训练。使图像表示与语言表示对齐。在适配器训练期间,更新图像编码器的参数,冻结语言模型参数。
- 我们还在成对的视频 - 文本数据上训练图像适配器之上的视频适配器。这使模型能够跨帧聚合信息。
- 语音适配器训练:通过适配器将语音编码器集成到模型中,该适配器将语音编码转换为可以直接馈送到微调语言模型中的令牌表示。适配器和编码器的参数在监督微调阶段联合更新,以实现高质量的语音理解
下面是每个步骤的详细过程。
4.1 预训练
预训练涉及步骤:
- 大规模语料库的管理和过滤
- 模型架构的开发和确定模型大小以及模型用多少数据的scaling laws找出来
- 大规模高效预训练技术的开发
- 预训练流程的原则
4.1.1 预训练数据
Llama 3 成功很大的一个原因是Data方面的工作做了很多,清洗,构造,配比等。 数据源: 2023年底之前的网上的数据源
4.1.1.1 数据清洗
使用了多个去重的策略以及数据清理策略, 提高数据质量
-
PII和安全过滤
- 非法网站、敏感网站
- 大量personally identifiable informationPII(个人隐私)的网站
- Meta安全标准被列为有害的域
- 成人内容
-
文本的提取和清洗
- 网页数据 -> html解析器, 抽取文章,去除广告,导航栏之类的信息
- 保留图片的文本属性
- 保留数学内容(OCR识别)和代码内容
- 去除标记符
- Markdown有害,也去除 ? 模型回答的公式,图片等都是markdown, 训练如果不用markdown的话,感觉不太合理
-
数据去重:
- url层面: 同一个url可能爬了多次,保留最新的
- 文档层面: 相似的文档只保留一份, 采用min-hash技术(求两篇文章的Jaccard距离)
- 行级别的去重: 3000w个文档里面,每一行提取,如果一行的文字出现超过6次,移除掉。目的: 删除网站的残留模板,导航,警告等
-
启发式过滤:删除额外的低质量文档、异常值和重复过多的文档
- 用重复的 n-gram 覆盖率来删除包含重复内容(如日志记录或错误消息), 上面行过滤可能过滤不掉
- 脏话统计, 有太多脏字的文档去掉
- 与训练语料库分布相比,统计每篇文章token分布 Kullback-Leibler KL散度来过滤掉包含过多异常值token的文档(如果某篇文章里面的token分布和其他文章相差的很远,认为是异常token)
-
基于模型的质量筛选: 训练一些模型分类器,给处理之后的文档进行打分 或 打上tag,根据实验结果进行更细的过滤
- 分类模型: fasttext模型, 识别是否被维基百科引用,如果是,质量高
- Llama 2标注的网页数据(提示词工程),训练DistilledRoberta模型(Bert的简化版本), 做二分类, 直接判断质量高低
- 上面两个分类模型的结果取并集,两个模型只要一个判定质量高,则保留
-
代码和推理的数据单独抽取处理:
- 构建了提取代码和数学相关网页的特定领域管道。
- 代码和推理分类器都是在 Llama 2 注释的 Web 数据上训练的 DistilRoberta 模型。与上面提到的通用质量分类器不同,对包含数学推导、STEM 区域中推理和与自然语言交错的代码的目标网页进行提示调整
-
多语言数据处理(非英语)
- 分类器,识别成176种语言
- 文档去重,行去重
- 特定语言的启发式方法和基于模型的过滤器删除低质量文档
- 基于Llama 2的多语言分类器对多语言文档质量排序,确保高质量的内容得到优先处理
4.1.1.2 数据混合
数据来自不同数据源, 每个数据源的数据遵循一个配比。
原则: 高质量的数据多用,低质量的数据少用
决定数据混合的方法是: 知识的分类和scaling law的实验
- 知识的分类: 开发了一个分类器来对网络数据中包含的信息类型进行分类(类似于打一个tag),以更有效地确定数据组合。我们使用这个分类器对网络上表现过度的数据类别进行下采样,例如艺术和娱乐。
- Scaling law: 为了确定最佳数据混合,我们执行缩放定律实验,在该实验中,在数据混合上训练几个小模型,并用它来预测大模型在该混合上的性能。对于不同的数据混合,我们多次重复此过程以选择新的数据混合候选。随后,我们在该候选数据混合上训练一个更大的模型,并在几个关键基准上评估该模型的性能。
最终的数据组合包含大约 50% 的对应于一般知识的token、25% 的数学和推理token、17% 的代码token和 8% 的多语言token
4.1.1.3 退火数据
根据经验,我们发现对少量高质量代码和数学数据进行退火可以提高关键基准测试上预训练模型的性能。
退火的意思是说: 对少量高质量的代码、数学数据(比如学术的数据集,评测榜的评测集)单独抽出来, 在经过大量网页数据训练完之后, 再把模型的学习率打开, 再用这些高质量的数据再训练一下(类似于考试之前背一下考题)。 如果这些数据直接和大量网页数据混合起来, 基本上就看不见了。
退火的策略还可以帮助去评估一个训练集的好坏:
- 假设已经有一个在DataA上训练到一半的模型, 现在要评估DataB对模型是否有用
- 70%的DataA + 30%的DataB 混合成一个新的DataC数据集,采用退火的方式再训练下模型,看模型效果是否有提升
4.1.2 模型架构
Llama3采用的稠密的,标准的Transformer架构(解码器),和Llama2基本保持一致。
405B这个规模的dense模型在如今MoE的潮流中显得有些“复古”。Meta对此给出了解释:不做成MoE模型是因为要追求能力的最大化(通常来说,相同总参数量下dense模型还是比MoE要强一些的),同时使用标准的Transformer模型可以让训练更加稳定,毕竟这样大规模的训练成本巨大,如果中间训炸了还是比较麻烦的。包括在post-training中使用的supervised finetuning(SFT),rejection sampling(RS),and direct preference optimization(DPO)都是经受住了许多考验,证明有效的方案。看起来这里在路线的选择上,Meta倾向于保守一些。 当然,还有内幕是说,当时训练MOE架构,但没训练收敛,所以没放出来。
和2017年的transformer块有点小区别,比如位置编码采用了一种循环编码的方式, LayerNorm换成了RMSNorm, ReLU激活函数换成了SwiGLU等。
性能的提升主要是来自于数据的质量,数量和多样性, 训练规模变大, 对模型结构并没有做fancy的调整。
小的修改如下:
-
使用分组查询注意力(GQA)和 8 个键值头,以提高推理速度并减少解码期间键值缓存的大小。理解Attention:从起源到MHA,MQA和GQA
-
GQA的原理:主要基于对传统多头注意力机制(Multi-Head Attention,MHA)的改进,旨在在保持模型性能的同时,提升推理速度和减少内存占用
-
在传统的 MHA 中,每个头都有独立的查询(Query)、键(Key)和值(Value)线性投影。对于输入序列,会为每个头分别计算注意力,这虽然能让模型从不同表示子空间捕捉信息,但随着头数增多,计算量和内存需求大幅增加。例如,在处理长序列时,多头注意力计算的复杂度较高,会成为模型推理速度和内存使用效率的瓶颈。
-
GQA 引入了分组的概念,在保持查询头数量不变的情况下,将键值头的数量进行分组。每个查询头可以访问所有组的键值信息,但在计算注意力时,不同查询头共享部分键值头的计算结果。这意味着,虽然查询头可以从多个不同的表示子空间获取信息,但键值头的计算被共享,从而减少了计算量和内存占用
# 假设开始的输入 (1, 256, 64)# 计算得到Q, K, V # 8个Q, 2个K, 2个V query = torch.randn(1, 256, 8, 64) key = torch.randn(1, 256, 2, 64) value = torch.randn(1, 256, 2, 64)# Q分成四组 num_head_groups = query.shape[2] // key.shape[2]# 维度交换,方便后面分组和计算 query = rearrange(query, "b n h d -> b h n d") # query:从(1, 256, 8, 64)变为(1, 8, 256, 64)。 key = rearrange(key, "b s h d -> b h s d") # key:从(1, 256, 2, 64)变为(1, 2, 256, 64) value = rearrange(value, "b s h d -> b h s d") # value:从(1, 256, 2, 64)变为(1, 2, 256, 64)# query:从(1, 8, 256, 64)变为(1, 4, 2, 256, 64)。 # 这里将原来 8 个头的查询张量按照每组 2 个头分成了 4 组,增加了一个分组维度g。 query = rearrange(query, "b (h g) n d -> b g h n d", g=num_head_groups) # 计算分数 # 经过einsum计算后维度为(1, 2, 256, 256) # 计算过程中,对于查询的每一组(4 组),每组内的 2 个头会与键的 2 个头进行矩阵乘法,最终通过求和等操作得到注意力分数。这里einsum操作会沿着最后一个维度(d)进行矩阵乘法,然后对分组维度g进行求和等操作,所以最终结果的头数量和键的头数量一致,为 2。 scores = einsum(query, key, "b g h n d, b h s d -> b h n s") scale = query.size(-1) ** 0.5 attention = F.softmax(scores / scale, dim=-1) # (1, 2, 256, 256) out = einsum(attention, value, "b h n s, b h s d -> b h n d") # (1, 2, 256, 64) out = rearrange(out, "b h n d -> b n h d") # (1, 256, 2, 64)# 后两维reshape,再接FFN即可 # 合并后两个维度 merged_output = rearrange(gqa_output, 'b n h d -> b n (h d)') # (1, 256, 128)# FFN
-
-
使用注意力掩码来防止同一序列中不同文档之间的self-attention。 即一个序列可能是多篇文档组成,计算self-att的时候,每篇文档只需要和内部的token计算attention即可。这种变化在标准预训练中影响有限,但发现它在非常长序列的持续预训练中很重要。
-
使用带有 128K token的词汇表。token词汇表将来自 tiktoken3 分词器的 100K token与 28K 额外token相结合,以更好地支持非英语语言,支持更多种类的词元输入。
-
提高了压缩率(1个token对应的字符个数), 从llama 2的3.17/token -> 3.94/token, 意味着同样的文章,有更短的上下文, 对长文本的支持会更好,对RAG的支持会更好。
-
调整了旋转位置编码(RoPE)的基础频率,以更好地处理长序列输入。把RoPE的base frequency增大到500,000,按《Effective long-context scaling of foundation models》的结果,这个数值足够支持32,768长度的窗口了, 位置编码可以参考理解LLM位置编码:RoPE
4.1.2.1 Scaling Laws
Scaling Laws(缩放定律)是描述大型语言模型性能与模型规模(参数数量)、训练数据量、计算资源消耗之间量化关系的规律。
一定范围内,模型性能(以损失函数衡量)随参数数量、训练数据量、计算资源增加而提升,通常呈幂律下降关系。但参数和数据量增加到一定程度,性能提升会变缓。
应用:
- 辅助模型设计,根据资源和目标预测所需参数和数据量。
- 指导训练资源分配,确定不同阶段资源投入及参数与数据扩充比例。
- 作为性能评估基准,判断模型设计合理性与提升空间。
论文中通过scaling laws去确定模型的大小, 一般是拿小模型上的表现来推测下在大模型上的表现。
论文指出之前用scaling law去指导模型大小存在的问题:
- 现有的扩展定律通常只预测下一个标记的预测损失,而不是特定的基准性能。
- 缩放定律可能具有噪声和不可靠性,因为它们是基于以较小的计算预算进行的预训练运行开发的
论文中实施了一种两阶段方法来制定准确预测下游基准性能的扩展定律:
- 首先在计算最优模型对下游任务(可以是任意关心的特定任务)的负对数似然(预测下一个token的loss误差)与训练 FLOPS 之间建立相关性。
- 接下来,我们将下游任务的负对数似然与任务准确性相关联(这样就和模型解耦开了),同时使用缩放定律模型和用更高计算 FLOP 训练的旧模型。在此步骤中,我们专门利用了 Llama 2 系列模型的训练结果。
下面是预测的结果:
左图: 不同算力规模下, 不同参数的模型,训练token的大小与损失的曲线对比图(每个点是一个特定的模型大小),结论如下:
-
同一算力的条件下, 模型参数越小, 可训练的tokens越大, 此时的验证损失先变小后增大,有个平衡点。 下面给出了一个推导, 来得出了模型算力,token数和模型尺寸3者的一个关系。结论: F = 6 N D F=6ND F=6ND
-
算力不断翻倍的情况下, 验证loss整体是一个不断下降的结果, 最终假设token数量和算力之间符合这样的一个关系:
-
模型变得比较大的时候, training tokens与验证损失的变化曲线相对平衡了,意思是最佳的模型大小或最佳样本大小相对来说, 大一点小一点,没多大关系,不需要那么精确
有了上面的结论, 对模型的尺寸指导有啥意义呢? 根据左图, 可以找到不同算力下面的最佳的平衡点, 根据最佳平衡点, 拟合等式,求出未知数 A A A和 a a a( A A A和 a a a的拟合,不同的模型不一样,跟数据和模型超参有关系,整体符合这个规律,需要不停的实验)
有了token数N和算力C之后,根据之前的公式 C = 6 N M C = 6NM C=6NM, 就能大概推算出我的模型参数量大概是多少,确定大概能训练多大的模型。
- 不断调整算力预算,每一次预算固定之后, 在小模型上进行实验, 把token和模型的平衡点找到,最后得到一条平衡曲线, 根据平衡曲线把A和a拟合出来。
- 根据最终的算力预算,计算出能使用的token数量。
- 根据token数量, 估算出训练的模型大小。
最后估算出Llama3的405B模型的大小。上面这个思想很重要
右边图是算力和训练数据之间的关系,大概能估算出, 我有这么多的算力,大概需要多少训练数据才能使得模型收敛。
接下来,是在一个特定的benchmark上(推理上一个评测集ARC challenge)的一个应用
左边图是用了几个scaling law的小模型, 可视化了算力与验证loss的一个趋势, 结论:
- 算力越大,模型越大, loss线性下降。
- 通过小模型去预测405B模型的算力与loss的关系,预测出的scaling law 与真实的405B的差距还是很小的
右边图是验证loss与准确率之间的一个关系图: - 依然是用了llama3的几个小模型, Llama 2的模型,预测出了405B模型的loss与准确率的关系, 相差也不大。 并且后面开始收敛了,再增大模型提升效果不明显了。
通过上面的实验还可以得出:
- 不同的benchmark的曲线变化不一样, 论文里面认为针对特定benchmark做曲线拟合很有必要
4.1.3 训练的基础配置
这块简单过一下, 一般没有资源支持这种大规模训练。
- 计算资源: 16K张 H100, 80G Nvlink, 一机8卡
- 存储: 240PB的SSD, 7000台机器存储
- 网络设计,负载均衡等
- 训练时候的各种并行方式
- 张量并行TP:个别权重的张量分割成不同设备的多个块
- 流水线并行PP: 通过层降模型垂直划分成不同阶段,在不同设备并行处理完整模型流水线的不同阶段
- 数据并行DP: 对模型、优化器和梯度分片,数据分片,在多个GPU上处理
- 上下文并行CP: 对输入上下文分成段, 减少长序列输入的内存瓶颈
4.1.4 训练丹方
这个还是很重要的。主要说了Llama3是怎么预训练出来的。
主要有3步:
- 初始的预训练
- A d a m W AdamW AdamW算法,对Llama3 405B预训练,峰值学习率 8 ∗ 1 0 − 5 8*10^{-5} 8∗10−5, 前8000steps预热(学习率0线性到峰值), 后面cos下降到 8 ∗ 1 0 − 7 8*10^{-7} 8∗10−7(12000 steps)
- 训练早期使用较小的 batch size 来提高训练稳定性,随后增加 batch size 以提高效率
- 初始: 4M个token的batch size, 长度4096
- 预训练252M token之后, batch size 变成 8M个token, 序列长度8192
- 预训练2.87 T token之后, batch size 变成 16M 的token, 序列长度8192(目前大部分语言模型支持的序列长度是8K的原因,就是训练的时候用的8K的序列训练的)
- 调整数据组合:训练期间对训练前数据组合进行了一些调整,以提高模型在特定下游任务上的性能,在预训练期间增加了非英语数据的百分比,以提高 Llama 3 的多语言性能。我们还对数学数据进行上采样以提高模型的数学推理性能,在预训练的后期阶段添加了更新的 Web 数据,以提高模型的知识截止率,并对后来被确定为质量较低的预训练数据的子集进行下采样
- 长上下文的预训练
- 在预训练的最后阶段,在长序列上进行训练,以支持高达 128K 令牌的上下文窗口
- 之前不会对长序列进行训练,因为自我注意层中的计算在序列长度上呈二次方增长
- 逐步增加支持的上下文长度,进行预训练,直到模型成功适应增加的上下文长度。
- 基于两个原则去慢慢增大上下文窗口
1. 模型在短期评估中的性能是否完全恢复
2. 模型完美地解决了该长度的 “大海捞针” 任务(从很长的序列里面提取关键信息)。 - 在 Llama 3 405B 预训练中,我们从最初的 8K 上下文窗口开始,到最终的 128K 上下文窗口结束,分六个阶段逐渐增加上下文长度。这个长上下文预训练阶段使用大约 800B 训练token执行。
- 退火训练(类似于拿评测集拟合下)
- 最后 40M token进行预训练期间,我们将学习率线性退火为 0,保持 128K token的上下文长度
- 在这个退火阶段,我们还调整了数据组合配比,增加高质量数据数学、代码、逻辑内容的影响(对非常高质量的数据源进行上采样)
- 最后,我们计算退火过程中模型检查点的平均值,以产生最终的预训练模型(最后的模型参数,是后期多个模型的参数平均值得到的,不是使用的最后一次检查点的模型, 竞赛刷磅的常用技巧)。
Polyak 平均(也称为 Polyak - Ruppert 平均)的核心思想是在模型训练过程中,对多个不同时间点(通常是在训练的后期阶段,即退火过程中)保存的模型参数进行加权平均,而不是直接使用最后一个训练得到的模型参数。这种方法有助于平滑模型在训练过程中的波动,减少噪声的影响,从而提高模型的泛化性能。
这里面能get到的一些经验总结:
- 数据清洗方面的一些经验,去重,配比等
- 使用退火来发现有价值的预训练数据
- 长文本的curriculum learning,逐步扩展
- 通过scaling law把FLOPs和下游任务效果关联起来,但是这个成本比较高,一般机构直接用结果就行了
- 基于和下游任务效果关联的scaling law选择data mix,同样是大力出奇迹,all you need is money
- checkpoint average,和苹果用到的model soup类似,是个值得关注的技巧
4.2 后训练
步骤:
- 人工标注数据训练Reward Model,用来评价一个
<Prompt, answer>
的数据质量 - 用预训练的模型生成若干个回答
- RM模型对回答进行拒绝采样,RM对生成的内容给予质量打分,选择得分最高的保留,作为SFT数据,其他的丢掉
- 上述SFT数据,再加上专门的增强代码、数学、逻辑能力的SFT数据混合,调整预训练模型得到SFT模型
- DPO训练调整LLM参数
上面完成了一个迭代轮次的Post-Training, 总共6轮迭代。
4.2.1 奖励模型
reward model(RM)是post-training中的一个重要部分。训练一个奖励模型(Reward Model):在预训练检查点的基础上,利用人类标注的偏好数据来训练奖励模型。
用预训练的语言模型权重作为初始化,再添加一个额外的线性层,将模型的输出映射为一个标量奖励值,该值代表了人类对整个文本序列(prompt + resp1 + resp2 + resp3)所体现的响应偏好程度。
和Llama-2相比,这次RM的一个变化是移除了训练时加入的margin term(用于把chosen和rejected response区分得更开),因为随着模型规模的增大,加入margin term收益越来越小了。
另一方面,同Llama-2一样,preference data中只有区分度比较大的数据对用于训练RM。
数据上,除了常规的chosen和rejected response之外,还引入了第三种 – “edited response”,即在chosen的基础上通过(人工)编辑,进一步提升这条response的质量。这样每条ranking sample就可能有3条response(edited > chosen > rejected)。
训练的时候,prompt和对应的多条随机打乱的response拼接在一起训练(prompt + resp_1 + resp_2 + resp_3),这和通常的做法,即每个response都拼接prompt有些不同(prompt + resp_1, prompt + resp_2, prompt + resp_3)。从结果上来看,都拼接到一起在accuracy上没有什么损失,而训练效率更高。
训练损失一般是采用对比损失, 好的resp的分数要比差的resp的分数高一个阈值。
推理的时候, 输入是<prompt, resp>
, 模型会其打分, 表示符合人类偏好的程度。
4.2.2 监督微调(SFT)
训练好的RM模型会用于拒绝采样, 对生成的结果过滤。得到的高质量数据会和其他来源的SFT数据一起用于微调模型。
SFT数据主要有这几个来源:
- 人工收集的prompt,以及对应的通过拒绝采样得到的response
- 特定领域的合成数据(后面capacities部分会讲到)
- 少量人类真实数据
处理细节:
- RS(拒绝采样)阶段,每个prompt会从"最新的chat模型中"采样K个回复(一般10-30个), 然后RM模型选出最佳回复
- 在靠后轮次的post-training中,RS引入了控制风格、格式、语气等特性的system prompt已更精细控制数据质量
- 不同领域(代码,推理,工具使用等)可能采用不同prompt
SFT训练的时候, l r = 1 ∗ 1 0 − 5 lr=1*10^{-5} lr=1∗10−5, steps: 8.5 k − 9 k 8.5k-9k 8.5k−9k。 共使用了近2kw个QA对。
数据处理和质量控制:
- post-training的前几轮中,研究人员发现数据中混入一些包含过量表情,感叹号值类的数据,因此,用专门规则对低质量的pattern进行清洗。
- model-base的方法过滤低质量数据
- 话题分类: llama 3 8B做粗粒度 & 细粒度的领域分类
- 质量打分:
- RM模型用于识别高质量回复,只有RM得分在前四分之一的数据认为高质量
- 基于llama 3 checkpoint, 使用特定prompt(不同领域不同)进行多方面打分,得分高的认为高质量
- 上面两者取并集
- 难度打分:用了Instag和Llama模型打分两种方式衡量数据难度
- 语义去重:用Roberta对对话聚类,每个类别中按quality score * difficulty进行排序, 然后只保留“和已选的高质量数据相似度小于阈值"的样本
4.2.3 DPO训练优化
DPO 是一种用于使模型的输出与用户偏好保持一致的方法。在后训练中,DPO 训练精选最新能力批次的数据。
在DPO阶段,会用在上一轮post-training得到的最佳模型收集偏好数据对,这样能使得偏好数据的分布和强化学习时的policy model更一致。
除了DPO以外,Meta也尝试了一些on-policy的方案,如PPO。但是相对来说,DPO消耗更少的计算资源,并且效果也更好,特别是在instruction following的能力上,所以还是选择在post-training使用DPO。
具体步骤如下:
- 数据准备:在预训练检查点的基础上,利用人类标注的偏好数据来训练直接模型。人类标注的结果会产生选中、拒绝和 “编辑后”(选中的响应经过编辑以使其更好)的响应,偏好顺序为编辑后 > 选中 > 拒绝,收集人类偏好数据,即包含选中响应和拒绝响应的数据集,但不需要对数据进行用于训练奖励模型的额外处理。
- 直接优化:直接使用偏好数据对模型进行优化,通过最小化特定的损失函数来更新模型参数,实现过程相对简洁。
DOP训练中,使用的 L R = 1 ∗ 1 0 − 5 , b e t a = 0.1 LR=1*10^{-5}, beta=0.1 LR=1∗10−5,beta=0.1
训练中做了一些不同于标准做法的改动:
- 在DPO损失中, 把特殊token,比如起止符屏蔽,不用于计算loss,因为使用这些token计算loss会使得模型在生成时,出现如复读机或者在不合适的地方截断的情况。这可能就是因为chosen repsponse和rejected response同时包含的这些特殊token,让模型在训练时要同时增大和较小它们的likelihood,导致冲突。
- 除了DPO常用的loss, meta额外加入了NLL损失,模型生成的文本在语法、语义上更加准确和连贯,同时也能满足人类偏好的要求。
4.2.4 模型平均
在RM、SFT和DPO阶段,分别把“用不同版本的数据和超参训练得到模型”进行平均,以获得最终模型。
4.2.5 能力
在不同的具体领域上,Meta分别有一套方法,来提升对应的能力。能力这块不详细整理了,感兴趣的可以参考原论文或这篇文章
5. 应用
应用这块还没来得及仔细研究,可以先通过Ollma的方式把模型下载下来,然后直接跑起来。
https://ollama.com/,下载ollama(Ollama 是一个开源的大型语言模型服务工具,旨在帮助用户快速在本地运行大模型)
# linux
curl -fsSL https://ollama.com/install.sh | sh# 下载模型
ollama run llama3:8b
参考:
- Llama3.1–预训练要点一览
- Llama3.1–post-training要点一览
- 李沐老师的论文课程
相关文章:
Llama3.0论文学习笔记: The Llama 3 Herd of Models
1. 写在前面 今天分享Llama3.0的论文,2024.7月来自Meta的Llama团队,2025年1月DeepSeek R1出现之后,其风头显然已经盖住了Llama3,这时候整理Llama3感觉有点赶不上潮流了,但是我还是想整理下Llama3.0,原因是…...
C#学习之数据转换
目录 一、创作说明 二、数据类型之间的转换 1.数据类型之间的转换表格 2.代码示例 三、进制之间的转换 1.进制之间的转换表格 2.代码示例 四、ASCII 编码和字符之间的转换 1.ASCII 编码和字符之间的转换表格 2.代码示例 五、总结 一、创作说明 C#大多数时候都是和各…...
POI 和 EasyExcel
前言 将表格信息导出为Excel表格(导出数)将Excel表格信息录入到数据库(导入数据) 操作Excel目前比较流行的就是 Apache POI 和阿里巴巴的 EasyExcel Apache POI Apache POI 官网:https://poi.apache.org/ HSSF&am…...
分布式光纤传感:为生活编织“感知密网”
分布式光纤测温技术虽以工业场景为核心,但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术(DTS)作为一种先进的线型温度监测手段,近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…...
Web后端 - Maven管理工具
一 Maven简单介绍 Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 Maven的作用 二 Maven 安装配置 依赖配置 依赖传递 依赖范围 生命周期 注意事项:在同一套生命周期中,当运行后面的阶段时,前面的阶段都…...
聊一聊vue如何实现角色权限的控制的
大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…...
Java中使用EasyExcel
Java中使用EasyExcel 文章目录 Java中使用EasyExcel一:EasyExcel介绍1.1、核心函数导入数据导出数据 1.2、项目实际应用导入数据导出数据 1.3、相关注解ExcelProperty作用示例 二:EasyExcel使用2.1、导入功能2.2、导出功能 三:EasyExcel完整代…...
LLM:GPT 系列
阅读原文: LLM:Qwen 系列 GPT(Generative Pre-trained Transformer)是生成式预训练语言模型,基于 Transformer 架构,专注于通过自回归的方式生成自然语言文本,即给定一个输入序列 x { x 1 , …...
【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1
1,参考社区链接,首先降低gradio版本,降低到4以下,但是也不能降太低,也不能太高,要适中,推荐版本3.39.0 pip install gradio3.39.0 2,下载正确的httpx版本 参考社区链接࿰…...
Linux:深入了解进程信号(上)
目录 1. 什么是信号 1.1 引入 1.2 概念 1.3 特性 1.4 信号的三个方面 2. 信号的产生 2.1 键盘按键产生 2.2 signal捕捉信号函数 2.3 发送信号原理 2.4 硬件中断 2.5 指令和函数接口 2.5.1 kill指令 2.5.2 kill函数 2.5.3 raise与abort函数 2.6 软件条件 2.7 异…...
Java小白入门基础知识(二)
1.标识符 概念: 在程序中给类,方法,变量取的名称叫做标识符 规范: 字母,数字,下划线,$符号 注意: 不能以数字开头,也不能是关键字,严格区分大小写(一般定义常量就是大写) 软性建议: 1)类名:每个单词首字母大写(大驼峰) 2)方法名:首字母小写,后面每个单词首字母大写(小驼…...
Servlet中,WebServlet注解的使用方法
案例:声明abc接口,在接口内部获取配置信息 WebServlet(urlPatterns"/abc",loadOnStartup6,initParams {WebInitParam(name"username", value"mmm", description"this is username"),WebInitParam(name"a…...
重新出发的LLM本地部署——DeepSeek加持下的Ollama+OpenWebUI快速部署
DeepSeek 这真的是太惊艳了,发布出来的模型这么能打,在线的版本使用起来也是丝滑连招,感觉效果比起之前一直用智谱 chatglm4 更好用,想着本地化部署一下。 本来以为,会和之前在开发测试 transformers 的模型和代码一样…...
【Python爬虫(1)】专栏开篇:夯实Python基础
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
低代码组态软件-BY组态
引言 在工业4.0与智能制造浪潮的推动下,组态软件作为工业自动化的核心工具,正逐步从传统单机模式向Web化、智能化方向演进。BY组态作为一款基于Web的嵌入式组态插件工具,凭借其低代码、高灵活性和跨平台特性,成为工业物联网&#…...
【计算机网络】数据链路层数据帧(Frame)格式
在计算机网络中,数据帧(Frame) 是数据链路层的协议数据单元(PDU),用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议(如以太网、PPP、HDLC 等)。以下是常见数据帧格式的…...
[特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用
C语言中对文件打开关闭操作 前言方法一:标准输入输出库(stdio.h)—— 高级文件操作的利器打开文件💡 关闭文件:fclose示例代码📝 个人见解 方法一:系统调用(fcntl.h 和 unistd.h&…...
如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传
目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录(例如rpc)保存为一个Git仓库并上传到远程仓库,您可以遵循以下步骤: 1. 初始…...
应用分层、三层架构和MVC架构
前言 在前面中,我们已经学习了Spring MVC 的一些基础操作,那么后面就用一些简单的案例来巩固一下。 在开始学习做案例之前,我们先来了解一下在软件开发中常见的设计模式和架构。 应用分层 含义 应用分层是一种软件开发设计思想࿰…...
前端实现防抖功能的详细解读
在前端开发中,防抖(Debounce) 是一种优化技术,用于限制某个函数在短时间内被频繁调用的次数。它的核心思想是:在一定时间内,无论触发多少次事件,只执行最后一次操作。防抖通常用于处理用户输入、…...
VUE3环境搭建
最近准备用Vue编写一点前端页面,我在前端一直是个小白,之前用的Vue2写了几个页面,现在已经是VUE3了,重新安装下环境开始。 1.npm安装 Vue需要用npm安装,npm是nodejs的package manager,这里我们安装下node…...
1-16 tortoiseGit分支与Git操作
1-1 创建分支 什么时候需要开分支? - 隔离线上版本和开发版本 - 大功能开发,不想影响到其他人,自己独立开个分支去开发 SVN经典目录结构: - trunk-------------------------开发中的文件 - bran…...
【VB语言】EXCEL中VB宏的应用
【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示:以下是本篇文章正文内容,下面案例可供参考 一、EXCEL-VB 1.实验过…...
前端优化可以从哪些方面下手及优化方案
前端优化是提升网页性能、提升用户体验和降低服务器负担的重要手段。可以从多个角度入手,以下是一些常见的优化方向和方案: 1. 性能优化 减少请求数量:尽量减少页面加载时发起的 HTTP 请求,例如使用合并文件(CSS 和 …...
类和对象(5)——抽象类和接口
目录 1. 抽象类 1.1 抽象类的概念 1.2 抽象类语法:abstract关键字 1.3 抽象类的特性 1.4 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口语法:interface关键字 2.3 接口的实现:implements关键字 2.4 接口的特性 2.5 实现多个接口 …...
海康摄像头IPV6模式,手动,自动,路由公告
海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议(IP)的第六版,用于替代IPv4,提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接: 手动:用户可…...
LabVIEW与USB设备开发
开发一台USB设备并使用LabVIEW进行上位机开发,涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输,帮助用户顺利完成项目开发。下面是一个详细的说明&…...
BY组态:工业自动化的未来,触手可及
在工业4.0的浪潮下,智能化、数字化已成为制造业发展的核心驱动力。作为工业自动化领域的重要工具,组态软件在实现设备监控、数据采集、流程控制等方面发挥着不可替代的作用。然而,传统的组态软件往往存在开发周期长、学习成本高、灵活性不足等…...
深入理解Python多进程编程 multiprocessing
深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程,从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行,极大地提高了处理效率,特别是在…...
使用DeepSeek建立一个智能聊天机器人0.12
为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...
基于VLC的Unity视频播放器(三)
关于UMP插件 UMP插件不更新了,我测试在Ubuntu24.04上编辑器和运行时都无法正常播放,在替换lib之后编辑器可以播放,但打包后不行……很奇怪 继续更新了一下UnityVLC 添加了对Linux的支持,勉强都可以播放了…… Win截图 Ubuntu2…...
每日一题——把数字翻译成字符串
把数字翻译成字符串 题目描述示例示例1示例2 题解动态规划代码实现复杂度分析 总结 题目描述 有一种将字母编码成数字的方式:‘a’->1, ‘b’->2, … , ‘z’->26。 现在给一串数字,返回有多少种可能的译码结果。 数据范围:字符串…...
基于状态观测器和物联网基础设施的智能电网高速孤岛检测
论文标题 中文标题: 基于状态观测器和物联网基础设施的智能电网高速孤岛检测 英文标题: High-Speed Islanding Detection in Smart Grids Using a State Observer and IoT Infrastructure 作者信息 Shahid Karim<sup>1,2, *</sup>, Prajo…...
FPGA的星辰大海
编者按 时下风头正盛的DeepSeek,正值喜好宏大叙事的米国大统领二次上岗就业,OpenAI、软银、甲骨文等宣布投资高达5000亿美元“星际之门”之际,对比尤为强烈。 某种程度上,,是低成本创新理念的直接落地。 包括来自开源社区的诸多赞誉是,并非体现技术有多“超越”,而是…...
【Black Mesa】黑山起源用服务器开服多人联机教程
1、登录服务器(百度莱卡云游戏面板) 进入控制面板后会出现正在安装的界面,安装大约10分钟(如长时间处于安装中请联系我们的客服人员) 2、修改端口 看到一下图片的界面时说明服务器已经安装完成,服务器需要…...
【学习笔记】深度学习网络-深度模型中的优化
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中…...
java八股文之Redis
1.Rdis常见的使用场景 缓存分布式锁(redision,setnx)计数器保存token消息队列延迟队列 2.说明一下缓存雪崩,缓存穿透和缓存击穿以及解决方式 1.缓存雪崩 定义: 缓存雪崩指的是当大量的缓存数据同时失效,…...
ubuntu系统下KVM设置桥接网络(失败)
20250216 - 概述 因实验需求,需要设置KVM下的虚拟机采用桥接模式进行通信,这种方式将使虚拟机与主机类似使用同一网段的IP。实际上,为了实现这个功能,我已经在自己mac上VMware使用过,虚拟机获得了自己独立的IP。 但…...
CentOS 7操作系统部署KVM软件和创建虚拟机
CentOS 7.9操作系统部署KVM软件和配置指南,包括如何创建一个虚拟机。 步骤 1: 检查硬件支持 首先,确认您的CPU支持虚拟化技术,并且已在BIOS中启用: egrep -c (vmx|svm) /proc/cpuinfo 如果输出大于0,则表示支持虚拟…...
驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布
一:概述 当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer,即画布)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。 虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与…...
Spring Boot过滤器链:从入门到精通
文章目录 一、过滤器链是什么?二、为什么需要过滤器链?三、Spring Boot中的过滤器链是如何工作的?(一)过滤器的生命周期(二)过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++中的智能指针
智能指针总结 智能指针其作⽤是管理⼀个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,类会…...
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini) 📊 引言 近年来,AI 编程助手已成为开发者的高效工具,它们可以加速代码编写、优化代码结构,并提供智能提示。本文介绍如何在 IntelliJ I…...
【R语言】非参数检验
一、Mann-Whitney检验 在R语言中,Mann-Whitney U检验(也称为Wilcoxon秩和检验)用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验,适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...
PyTorch 源码学习:阅读经验 代码结构
分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同,所以笔者在整理资料时尽可能按版本号升序,版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...
04运维实用篇(D4_日志)
目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1:添加日志记录操作 步骤2:设置日志输出级别 步骤3:设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...
Linux文件管理:硬链接与软链接
文章目录 1. 硬链接的设计目的(1)节省存储空间(2)提高文件管理效率(3)数据持久性(4)文件系统的自然特性 2. 软链接的设计目的**(1)跨文件系统引用****&#x…...
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
以耳倾听世间繁华,以语表达心中所想 大家好,我是whisperrrr. 前言: 大家好,我是你们的朋友whisrrr。在日常工作中,MySQL作为一款广泛使用的开源关系型数据库,其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...
小米平板怎么和电脑共享屏幕
最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的,需要下载一款电脑安装包:小米妙享 关于这个安装包,想吐槽的是: 没有找到官网渠道,是通过其他网络方式查到下载的 不附录链接,原因是因为地…...