Skip to main content

部分llm技术报告的阅读

· 19 min read
ayanami

Qwen

base model: 3 trillion tokens 三万亿

数据处理

预训练:公共文档,书籍,代码

HTML中提取文本,语言识别工具确定语言

增加多样性: MinHash/LSH 模糊去重

过滤低质量数据:rule-base/ML方法(语言模型,文本质量评分模型,内容审查模型)

进一步提高性能:高质量instruction数据集

tokenization: BPE byte pair encoding

cl100k base作为起点

最终152k词汇量

  • embedding: 解绑定的embedding方法,而不是绑定embedding和输出projection的权重 -> 内存换性能(why)
  • position embedding: RoPE fp32精度
  • Bias: 只有attention的QKV有
  • PreNorm & RMSNorm 提高训练稳定性,替代传统layer norm, prenorm > post-norm
  • activation function: SwiGLU

训练:上下文2048, flash attn, AdamW, 余弦学习率,最小为10%峰值,bf16混合精度训练

上下文长度拓展:在推理时做,训练时长上下文O(N^2)开销太大,NTK-aware interpolation

另外两个注意力机制: LogN-Scaling and window attention

sft对齐: ChatML-style format

该模型的训练过程采用AdamW优化器,具有以下超参数:β1设置为0.9,β2设置为0.95,(ϵ\epsilon)设置为(10810^{-8}). 序列长度限制为2048,batch size为128. 该模型总共经过4000步,学习率在前1430步逐渐增加,达到峰值(2×106)(2 \times 10^{-6}). 为了防止过拟合,应用权重衰减,值为0.1,dropout设置为0.1,梯度裁剪强制限制为1.0.

sft泛化和创造性的限制,容易过拟合 -> RLHF

PPO

tool-use造数据:左脚踩右脚,让Qwen生成更多示例相关的查询、特定格式的输出,应用规则+人工过滤产生训练样本,之后SFT

代码模型:继续预训练,900亿tokens + 8192长上下文

数学模型:1024上下文,数学问题较短加快训练速度

Qwen2.5

下载

预训练 18万亿tokens

大于100w样本的sft,多阶段强化学习

有效KVcache利用:GQA Group Query Attention

MoE架构:将标准FFN层替换为专门MoE层,每一层包括多个FFN专家和一个路由,路由将tokens分派给topk专家

tokenization从BPE升级到BBPE, 控制token增加

做数据:

  1. 更好的数据过滤

  2. 更好的数学和代码数据,在预训练就加

  3. 更好的合成数据,数学/代码/知识模型生成 + 奖励模型过滤

  4. 平衡样本分布

电子商务、社交媒体和娱乐等领域在网络规模数据中明显过度表示,通常包含重复的、基于模板的或机器生成的内容。 相反,技术、科学和学术研究等领域虽然包含更高质量的信息,但传统上代表性不足。 通过对过度表示的领域进行战略性降采样,以及对高价值领域进行升采样

长上下文拓展:

最终预训练 4k -> 32k, RoPE 10k->1000k

渐进式拓展

32k->64k->128k->256k

每一个截断包含40%的长序列和60%的短序列,避免遗忘

YARN + Dual Chunk Attention 降低困惑度来改善长序列推理性能

两阶段RL:

• Offline RL:此阶段侧重于开发奖励模型难以评估的能力,例如推理、事实性和 instruction-following。 通过对训练数据进行细致的构建和验证,我们确保 Offline RL 信号既可学习又可靠 (Xiang et al., 2024),使模型能够有效地获得这些复杂技能。

• Online RL:Online RL 阶段利用奖励模型检测输出质量细微差别的能力,包括真实性、helpfulness、简洁性、相关性、harmlessness 和 debiasing。 它使模型能够生成精确、连贯且结构良好的响应,同时保持安全性和可读性。 因此,模型的输出始终符合人类的质量标准和期望。

长上下文:准备long-response dataset:从pre-training data中生成long-text数据对应的长查询,并使用Qwen2过滤低质量data

数学:CoT + 拒绝采样 + reward model/annotated answer

编码:code-related QA web 合成示例,github收集snippet, sandbox code checking, 自动单元测试保证正确性

指令准随:利用可严格验证的code来做,拒绝采样

结构化数据:table QA/fact verification/error correct... 造数据集然后训

逻辑推理:70000个新query迭代改进

回复过滤:多智能体协作评分系统

离线rl, 客观查询领域,数学/编码/逻辑推理/指令追随, 确保回复的质量,只有通过质量检查的才是正示例,其他回答全是负示例

在线rl, 真实性,帮助性,简洁性,相关性,无害性和去偏见

GRPO, 先训response分数方差较高的query

当前的reward model评估benchmark无法准确预测在其指导下训练的RL模型的性能


Qwen3 Embedding

多阶段训练流程: 大规模无监督训练, 高质量数据集有监督微调

qwen3 产生高质量、多语言、多任务的文本相关性数据集,在无监督阶段利用,筛选出部分高质量用于有监督训练

Embedding, Instruction + query,之后直接**[EOS]**, 最后的嵌入是这个EOS对应的最后一层隐藏状态

Reranking, Instruction + query + doc,之后是Assistant:

image-20250629132905912

为了嵌入的统一,instruction和query会拼接成同一个输入,{Instruction} {Query}<|endoftext|>

重排: **pointwise,二分类问题,**遵循以下模板,实际相关性分数是yes|no的logits

image-20250629133305609

image-20250629133428708

使用InfoNCE作为损失函数

image-20250629133536398

qwen3采用批内负采样

即,在实际对比学习(尤其是检索任务)中,为了训练出区分能力强的模型,负样本非常关键。但生成或采样足够丰富且高质量的负样本往往代价很高或不现实。

因此,常用的做法是:

  • 批内负采样(In-batch Negative Sampling):利用当前训练批次中其他样本的 query qjq_j、正样本 dj+d_{j+}以及负样本 djd_{j-}作为当前样本qiq_i的负样本补充。

因为batch是随机取的,所以为了避免批内负采样形成错误信号,需要在qj,dj{q_j,d_j}中把实际是正样本的部分筛选掉,就是下面的掩码因子

image-20250629133751623

减轻false negative的影响

认为是错负例的:

  1. dj/qj=di+d_j/q_j = d_{i+}
  2. sim(dj/qj,qi)>sim(di+,qi)+0.1sim(d_j/q_j, q_i) > sim(d_{i+}, q_i) + 0.1的,即这个批内负样本比正样本还相似度高0.1以上,这个0.1可能是考虑到初期时数值的稳定性加的

此时掩码为0,LembeddingL_{embedding}的这一项是0,即不考虑这一项作为负样本

比起用if-else等前筛选方法,这个后筛选方法方便并行化,由于预计假负样本应该是比较少的,所以能提高效率

对于rerank, 定义SFT loss Lreranking=logp(lP(q,d))L_{reranking} = -log p(l| P(q,d))

ll对正面文档是"yes", 负面是"no"

创新点:

  1. 大规模合成数据,直接使用qwen3的合成数据而不是收集qa pair
  2. 高质量合成数据在SFT中的利用
  3. 模型合并:基于球面线性插值(slerp)对微调的多个ckpt进行合并,提升不同数据分布下的鲁棒性和泛化

image-20250629140122099

数据集合成:

Qwen3-32B, 利用检索模型从角色库中,识别出(文档可能对应的)前五个角色候选

然后,将文档+候选角色作为prompt,令模型输出最适合的角色配置

再将角色配置给到模型,生成查询

  • 多样性:使用查询类型(关键词、事实、摘要、判断、...)×查询长度×查询语言×查询难度×...查询类型(关键词、事实、摘要、判断、...) \times 查询长度 \times 查询语言 \times 查询难度 \times ... 作为模型合成数据的状态空间

最后产生了1.5亿对数据

高质量对:简单的余弦相似度计算,保留相似度大于0.7的,得到1200w对

结果 SOTA

两个分析:

  1. 不做合成数据训练,明显掉点
  2. 不做模型合并,也掉点

Qwen3

GQA, SwiGLU, RoPE, RSMNorm,Pre-Norm

移除QKV的bias, 在attn中引入QK-Norm

MoE, 128专家,激活8个,去除共享专家,采用全局批次负载平衡损失

预训练:36T tokens,100+语言,代码、STEM、推理、书籍、合成数据

部分数据是Qwen-2.5-VL对大量pdf做OCR再Qwen2.5进行文本优化得到的高质量文本数据

三阶段预训练:

  1. 通用阶段,30T tokens,4k max length,获取语言能力和世界知识
  2. 推理阶段,增加STEM, 代码,推理和合成数据的比例,5T tokens,4k max length,加速学习率衰减
  3. 长上下文阶段,32K,4k-16k 25% + 16k-32k 75%,RoPE 基础频率10000->1000000, 引入YARN和双向块注意力

后训练

image-20250629142730991

  1. 思考控制
  2. 强到弱蒸馏

CoT冷启动:query response两层过滤

query过滤用2.5-72B删除不容易验证的query, 如多个子问题和通用问题删除2.5-72B能直接正确回答不需要CoT的问题对每个Query进行领域标注,保持数据平衡

Response过滤用QwQ-32B, 每个问题生成N个response,

  1. 无法生成正确答案->人工标注
  2. 移除最后答案不正确的,存在大量重复的,猜测而缺乏推理的,推理和总结不一致的,混用语言的,可能和验证集过于相似的

冷启动数据直接SFT,学习基础推理模式,为后续RL打基础

推理RL:GRPO, 大Batch Size, 每个Query多Rollout

仅仅用了4k个数据,满足

  1. 冷启动没用过
  2. 冷启动模型可学习(不太难)
  3. 有挑战性
  4. 广泛子领域

235B-A22B进行了170个RL训练步骤

思考模式融合(控制不思考)

SFT数据集融合思考非思考的数据,同时设计聊天模板,非思考保留空思考块

image-20250629143421275

当模型学会在非思考和思考模式之间切换,就可以**处理基于不完整的思考生成答案,就可以让模型在思考过程中根据预算来强行停止思考过程。**即 当模型的思考长度达到定义的阈值时,插入停止思考指令:“考虑到用户的时间限制,我必须根据目前的思考直接给出解决方案。 \n</think>.\n\n”。并让模型继续根据其积累的推理生成最终响应。

通用RL

增强能力和稳定性

20多任务:指令遵循,格式遵循,偏好对齐,代理能力,特定场景能力(如RAG)

三种奖励:基于规则的奖励,基于模型的奖励(带参考答案),基于模型的奖励(无参考答案)

蒸馏:离线和在线

离线,教师模型产生输出给学生模型SFT

在线,教师和学生对相同prompt在输出logits对齐(最小KL散度)

Ablation

  • Math & code 做完 reasoning RL 达到顶峰
  • Agent tool use 能力,general RL 也很关键
  • 通用语言能力,很需要 General RL

有一个有趣的是thinking其实损害了长上下文的性能

img

RULER大海捞针,non-thinking mode更高,long CoT甚至掉点


GRPO & RLHF

RLHF大致两种,on policy(ppo)和off policy(dpo)

on policy的更耗卡,更耗时,但理论上限更高

ppo的四个模型:actor, critic, reference model, reward model

on policy:top_p = 1.0, top_k=-1,加大探索

critic 得出V(s)V(s),起一个降低方差的作用

ReMax: 用rrgreedyr-r_{greedy}作为baseline,(rgreedyr_{greedy}不是随机采样, 是状态的函数),解决critic model的开销

能够降低方差的原因是默认认为通常 SFT 模型已经经过一部分对齐,对于同一个 prompt 模型不太会输出差异性过大的答案

GRPO:直接退回PG是否有点原始

虽然Critic不仅占资源,并且在LLM这种全部回答的trajectory才重要的情况下,中间的“价值”也很难界定,但PPO还有别的先进feature可以保留,比如重要性采样和clip

img

只是将 AiA_i 的计算从criticcritic的输出换成了group内的相对值 rimean(rg)var(rg)\frac{r_i - mean(r_g)}{var(r_g)}

非常暴力,但非常有效

KL penalty用近似值保证KL始终是正数, ratio1logratioratio - 1 - log ratio

LLM中,通常将GAE的γ\gamma设置为1,因此也直接将这个得分复制到每一个token训练

尽管这种方法确实可以省掉一个 Critic,但成功需要具备 2 个关键:

  1. SFT 对给定的 prompt 不能有着太 diverse 的输出,否则方差会比较大。
  2. 对同一个 prmopt 采样的数量要可能大,这样才能降低方差

offline方法,DPO

降低不好答案被采样的概率,提升好回答的概率

DPO 有一个非常致命的问题

由于 DPO 的训练 loss 目标是「尽可能最大化好答案和坏答案之间的采样概率差」,

一种常见的情况是:好答案 & 坏答案被采样的概率同时在变低,只不过坏答案降低的比好答案更多

这种情况在 chosen 和 rejected 答案有大部分内容相同,仅有少部分内容不同时较为常见

DPOP添加了一个如果choosen答案在SFT模型(ref)中采样概率大于当前policy模型的采样概率,则减去的正则项(policy还没拟合好,少更新点)

TDPO 加上了KL,但是是forward KL(KL非对称,SFT计算采样概率是forward, policy model计算是backward KL)

由于 backward KL 的目标是拟合整个分布中的「一部分」,而 forward KL 的目标是尽可能 cover 整个分布中的大部分。因此,TDPO 训练后的模型会比 PPO 训练后的模型,在输出多样性上更加自由

token clipping 操作是导致性能下降的主要原因!尤其是像 "However"、"Recheck"、"Wait"、"Aha" 这类带有反思性质的 token 在初始模型中本就属于低概率 token,在更新过程中容易出现高奖励值继而被裁剪,从而无法继续为后续梯度更新提供贡献。

minimax提出CISPO,不丢弃token梯度,裁剪重要性采样权重

传统方法: 先计算 ratioAratio * A, 再裁剪乘积

CISPO: 先裁剪 ratioratio, 再乘以 AA

效率显著提高(2x speed)

早停: 目标不是对已经生成的重复文本进行惩罚,而是在模型进入重复循环前就终止生成。由于简单的字符串匹配难以应对复杂的重复模式,我们设计了一个基于 token 概率的启发式方法

一旦模型进入重复循环,所生成 token 的概率会大幅上升。因此我们制定了如下早停规则:

如果连续 3,000 个 token 的生成概率都大于 0.99,就立即终止生成。

Loading Comments...