模型简介
模型特点
模型能力
使用案例
🚀 玉兰花迷你指令模型(YuLan-Mini-Instruct)
玉兰花迷你指令模型(YuLan-Mini-Instruct)是一个参数规模为24亿的轻量级强大模型。它基于玉兰花迷你模型(YuLan-Mini)进行后训练调整,在数学和代码等核心能力上表现出色,性能可与主流模型相媲美。该模型在10.8万亿个标记上进行预训练,并通过监督微调、偏好微调、强化学习等后训练流程进一步提升能力。
🚀 快速开始
以下是使用Huggingface进行推理的简单示例:
Huggingface推理示例
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("yulan-team/YuLan-Mini-Instruct")
model = AutoModelForCausalLM.from_pretrained("yulan-team/YuLan-Mini-Instruct", torch_dtype=torch.bfloat16)
# 输入文本
chat = [
{"role": "system", "content": "You are YuLan-Mini, created by RUC AI Box. You are a helpful assistant."},
{"role": "user", "content": "What is Renmin University of China?"}
]
formatted_chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(formatted_chat, return_tensors="pt", add_special_tokens=False)
# 生成结果
output = model.generate(inputs["input_ids"], max_new_tokens=100, temperature=0.5)
print(tokenizer.decode(output[0][inputs['input_ids'].size(1):], skip_special_tokens=True))
vLLM服务示例
vllm serve yulan-team/YuLan-Mini-Instruct --dtype bfloat16
SGLang服务示例
python -m sglang.launch_server --model-path yulan-team/YuLan-Mini-Instruct --port 30000 --host 0.0.0.0
Ollama示例
ollama run hf.co/mradermacher/YuLan-Mini-Instruct-GGUF:IQ4_XS
✨ 主要特性
- 轻量级高性能:仅有24亿参数,却能在数学和代码推理任务中展现出与主流模型相当的性能。
- 多阶段训练:通过监督微调、偏好微调、强化学习等后训练流程,充分挖掘模型潜力。
- 广泛评估:在多个基准测试任务中进行了严格评估,结果显示在多个领域具有竞争力。
📦 安装指南
文档未提及安装相关内容,可参考快速开始部分的推理示例进行使用。
💻 使用示例
基础用法
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("yulan-team/YuLan-Mini-Instruct")
model = AutoModelForCausalLM.from_pretrained("yulan-team/YuLan-Mini-Instruct", torch_dtype=torch.bfloat16)
# 输入文本
chat = [
{"role": "system", "content": "You are YuLan-Mini, created by RUC AI Box. You are a helpful assistant."},
{"role": "user", "content": "What is Renmin University of China?"}
]
formatted_chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(formatted_chat, return_tensors="pt", add_special_tokens=False)
# 生成结果
output = model.generate(inputs["input_ids"], max_new_tokens=100, temperature=0.5)
print(tokenizer.decode(output[0][inputs['input_ids'].size(1):], skip_special_tokens=True))
高级用法
文档未提及高级用法相关代码示例。
📚 详细文档
模型概述
玉兰花迷你指令模型(YuLan-Mini-Instruct) 与同规模模型相比表现出色,尤其是在涉及数学和代码的推理任务中。我们将其与前沿系列中参数规模相近的其他模型(如Qwen2.5 - 1.5B - Instruct和Llama3.2 - 3B - Instruct)进行了评估比较。
监督微调
数据
数据来源
我们精心挑选了两个主要数据源:1)开源数据;2)合成数据,以确保模型实现全面的知识覆盖和强大的特定领域专业能力。
- 开源数据:我们整理了涵盖多个领域和学科的高质量开源数据集。这些数据集由GPT - 4等强大的专有模型构建或由人类专家精心制作,为监督微调(SFT)提供了坚实的基础。
- 合成数据:由于高质量特定领域数据的稀缺,合成数据在提高模型的专业能力方面发挥着至关重要的作用。因此,我们还合成了大量针对数学、科学和中文常识推理等领域的数据。
- 数学:从强大的模型中提炼数据为数据构建提供了一种高效的方法,特别是在数学领域。除了选择合适的教师模型外,选择高质量和特定领域的初始指令同样重要。因此,我们采用以强大数学能力著称的Qwen2.5 - Math - 7B - Instruct作为教师模型。对于初始提炼样本,我们从包含超过1000万个高质量数学问答对的OpenMathInstruct2数据集中选择不同难度的问题。每个提炼的响应都与真实答案进行匹配,以确保答案的准确性。
- 科学:为了开发高质量的科学数据集,我们首先从各种可靠来源(如Wiki、Reddit和Arxiv)收集科学文本。这些文本涵盖了广泛的学科,包括物理、化学、生物学和心理学。收集阶段完成后,我们使用Qwen2.5 - 32B - Instruct从文本中提取问题并生成合适的答案。最后,使用主题分类器对生成的问答对进行重新分类,以确保与各自的科学类别准确对齐。
- 中文常识推理:对于中文常识推理数据的构建,我们从权威来源百度百科以及WildChat和SmolTalk - Chinese等知名平台的真实用户交互中收集数据。使用TF - IDF和关键词匹配,我们识别和过滤具有高度语义相关性的内容,以生成多个包含知识密集型文档的问答对。为了保持严格的质量标准,我们使用CMMLU分类器进行主题分类,并使用基于大语言模型(LLM)的评估来评估响应质量。为了防止幻觉,我们将基于实体的查询与百科条目进行交叉引用,并维护一个映射列表,以确保对类似问题的回答一致。
数据过滤
在监督微调阶段,训练数据的质量对模型性能起着关键作用。因此,我们设计了一个全面的数据过滤管道,结合了多种质量控制策略,以确保精炼后的数据集最大程度地提高模型的有效性和可靠性。
- 去重:在数据过滤过程中,去重是一个关键的预处理步骤,因为冗余数据样本的存在会显著限制模型学习多样化模式的能力,从而影响训练效率。为了解决这个问题,我们采用MinHash和局部敏感哈希(LSH)算法,能够有效识别和去除近重复内容。
- 启发式过滤:训练数据中的异常模式(包括但不限于重复标点或过多乱码文本)已被经验证明会对模型性能产生不利影响。为了避免这种情况,我们开发了一套全面的基于规则的过滤启发式方法,以消除可能损害模型的低质量样本。
- 基于质量的评分:使用大语言模型作为评判者是评估数据质量的有效方法。具体来说,我们使用Qwen2.5 - 32B - Instruct作为评判者,从指令遵循、信息性和真实性三个维度对每个数据进行评分,分数范围为1到5。然后,我们根据这三个维度的平均分数对数据进行排序,并丢弃较低百分位的样本。
- 基于复杂度的选择:除了数据质量低之外,过高的数据复杂度会显著损害学习效果。这种现象在小规模语言模型中尤为明显,因为它们处理和内化高度复杂模式的能力有限。因此,我们开发了一种方法来识别和过滤超出模型最佳学习能力的训练样本。每个指令的复杂度使用以下公式衡量: $$ \text{C}(x,y) = \lambda_1 \cdot L_{\text{length}} + \lambda_2 \cdot \text{Loss}{\text{it}}(x, y), $$ 其中$\lambda_1$,$\lambda_2$是超参数,$L{\text{length}}$表示指令的长度,$\text{Loss}{\text{it}}(x, y)$是基础模型计算的损失: $$ \text{Loss}{\text{it}}(x,y)=\sum\limits_{i=1}^{|y|} \log P(y_i|x,y_{1:i-1}), $$ 其中$y_i$表示输出$y$中的第$i$个标记,$y_{1:i - 1}$表示直到第$i - 1$个标记的序列。我们实施了基于复杂度的分层协议,然后选择性地修剪超过经验确定的复杂度阈值的样本。
数据混合
在监督微调阶段,简单地聚合不同类型的数据可能会导致数据冲突,从而降低模型在特定领域的性能。为了缓解这个问题,我们根据每个数据源的特点分配数据比例,平衡通用数据和特定领域数据。此外,通过大量的增量实验,我们还根据训练性能和反馈实时动态调整数据比例,以达到最佳效果。具体使用的数据比例如下表所示:
类别 | 数量 | 比例 |
---|---|---|
通用英语 | 320万 | 39% |
通用中文 | 300万 | 36% |
数学 | 180万 | 22% |
代码 | 20万 | 3% |
总计 | 820万 | 100% |
训练设置
模型训练在由四个节点组成的分布式计算基础设施上进行,每个节点配备八个NVIDIA A800 GPU,并通过高速网络互连。我们使用的有效批量大小为512,最大序列长度为28K标记。优化过程在2个训练周期内进行,学习率为1e - 5。
偏好微调
偏好数据
我们的偏好数据由离线策略和在线策略数据源组合而成。
- 离线策略数据:我们汇总了一组高质量的公开可用数据集来构成这一部分。
- 在线策略数据:我们系统地整理了涵盖多个领域的专业数据集,包括科学问题、数学、编程、中文常识、幻觉和自我意识评估。
收集指令数据后,我们从监督微调模型中采样完成结果。对于有客观可验证答案的指令,我们使用大语言模型提取响应,其中正确的响应被指定为选择响应,而错误的响应被分类为拒绝响应。对于其余指令,我们使用奖励模型Skywork/Skywork - Reward - Llama - 3.1 - 8B - v0.2进行评分。高分响应被标记为选择,而低分响应被分类为拒绝。
构建的偏好数据最终数据集的组成如下:
类别 | 数量 | 比例 |
---|---|---|
离线策略 | 25.8万 | 69% |
在线策略 | 11.5万 | 31% |
总计 | 37.3万 | 100% |
偏好微调方法
基于监督微调模型,我们采用直接偏好优化(DPO)使模型与人类偏好对齐。模型训练2个周期,批量大小为128,学习率为5e - 7,$\beta$设置为0.1。这种配置在训练过程中表现出有效的收敛性,同时在训练效率和计算资源消耗之间保持平衡。
强化学习
在直接偏好优化模型的基础上,我们通过近端策略优化(PPO)进一步提升模型的性能,并使其与人类偏好更好地对齐。
数据准备
对于PPO训练,我们从DPO数据集中提取10000条具有挑战性的指令。这些指令代表了不同的任务类别,能够有效优化模型在各种场景下的性能。
奖励模型
考虑到我们模型的参数规模相对较小,以及训练高性能奖励模型所需的大量计算资源,我们选择利用开源奖励模型在训练过程中提供奖励信号。具体来说,我们使用了Skywork - Reward - Llama - 3.1 - 8B - v0.2模型,该模型在奖励建模方面表现出色。
训练方法
训练过程使用8个A800 GPU进行4个周期的训练。我们在OpenRLHF框架上进行训练,该框架为强化学习任务提供了灵活的环境。在训练阶段,我们遇到了一些技术挑战,如奖励作弊现象(表现为训练不稳定和输出长度崩溃)。为了解决这些问题,我们实施了一系列缓解策略:
- 评论家模型初始化和演员参数冻结:评论家模型从奖励模型初始化。此外,在训练的前15步中,演员模型的参数保持固定,以便评论家模型能够准确评估价值估计。
- 自适应KL控制器:我们采用自适应KL控制器,根据KL散度目标动态调整KL系数(beta),在训练过程中平衡探索和利用。
- 基于规则的奖励作弊惩罚:我们应用基于规则的惩罚来解决奖励作弊模式,如不完整的句子(这也有助于惩罚截断的响应,在我们的较小模型中通常包含冗余模式)、混合语言响应(如英语提示与中文字符)和单句响应(如“I hope this helps”)。这些识别出的模式是我们在广泛评估过程中观察到的系统性异常的一部分,尽管它们在各种查询中缺乏实质性内容,但仍显示出高奖励分数。
PPO训练中使用的具体超参数如下表所示:
超参数 | 值 |
---|---|
演员学习率 | $1 \times 10^{-6}$ |
评论家学习率 | $1 \times 10^{-5}$ |
训练批量大小 | 128 |
冻结演员步数 | 15 |
训练周期数 | 4 |
每个提示的样本数 | 4 |
提示最大长度 | 2048 |
生成最大长度 | 2048 |
初始KL系数 | 0.01 |
KL目标 | 0.06 |
通用优势估计λ | 0.95 |
折扣因子γ | 1.0 |
生成温度 | 1.0 |
奖励剪辑范围 | (-20, 10) |
学习率预热比例 | 0 |
学习率调度器 | 常数 |
评估
我们发布了从经过后训练的玉兰花迷你指令模型在各种基准测试任务中生成的评估数据,这与我们的预训练方法保持一致。
为了全面评估玉兰花迷你指令模型的性能,我们对其与其他规模和能力相似的模型进行了严格的比较分析。对于每个基准测试任务,我们始终选择最佳性能分数(来自我们的实证评估或已发表的结果)进行比较。
我们使用下表中列出的指标,其中分数越高越好。
核心技能 | 评估指标 |
---|---|
知识 | MMLU (0 shot, CoT) |
MMLU (5 shot) | |
TruthfulQA(0 shot) | |
推理 | ARC(0 shot) |
GPQA(5 shot) | |
数学 | MATH(0 shot, CoT) |
GSM8K(8 shot) | |
GSM8K(0 shot, CoT) | |
代码 | HumanEval(pass@1) |
HumanEval+(pass@1) | |
HumanEval(pass@10) | |
HumanEval+(pass@10) | |
MBPP(pass@1) | |
MBPP+(pass@1) | |
MBPP(pass@10) | |
MBPP+(pass@10) |
通用知识
我们采用MMLU和TruthfulQA作为基准来评估玉兰花迷你指令模型在基于知识的问答中的性能。对于MMLU,我们报告在无思维链的5 - shot标准设置和有思维链的0 - shot标准设置下子任务准确率的宏观平均值。对于TruthfulQA,我们报告在无思维链的0 - shot标准设置下子任务准确率的宏观平均值。如表所示,玉兰花迷你指令模型在常识推理任务中表现出与Qwen2.5和Llama3.2模型相当的性能。
推理
我们使用ARC基准评估玉兰花迷你指令模型的推理能力。实验结果表明,玉兰花迷你指令模型的性能优于Qwen2.5,在三个评估模型中保持中等性能水平。
数学
我们使用MATH和GSM8K基准评估玉兰花迷你指令模型的数学推理能力。对于MATH,我们报告在有思维链的0 - shot设置下子任务准确率的宏观平均值。对于GSM8K,我们报告在8 - shot设置和有思维链的0 - shot设置下的宏观平均准确率。实验结果表明,尽管玉兰花迷你指令模型的规模明显较小,但其在数学性能上优于Llama3.2。
代码
我们在四个既定基准(HumanEval、HumanEvalPlus、MBPP和MBPPPlus)上评估代码生成能力。实验结果表明,玉兰花迷你指令模型在所有基准测试中表现出色,在代码生成任务中优于可比模型。
基准测试 | 玉兰花迷你指令模型 | Llama3.2 - 3B - Instruct | Qwen - 2.5 - 1.5B - Instruct |
---|---|---|---|
MMLU (0 shot, CoT) | 53.6 | 60 | 57.4 |
MMLU (5 shot) | 52.7 | 63.4 | 66.5 |
TruthfulQA(0 shot) | 50.1 | 49.7 | 58.8 |
ARC(0 shot) | 51.8 | 78.6 | 47.8 |
GPQA(5 shot) | 30.1 | 32.6 | 29.8 |
MATH(0 shot, CoT) | 55.2 | 48.0 | 55.2 |
GSM8K(8 shot) | 81.8 | 43.4 | 73.2 |
GSM8K(0 shot, CoT) | 71.7 | 66.0 | 69.4 |
HumanEval(pass@1) | 67.7 | 51.5 | 61.6 |
HumanEval+(pass@1) | 61.6 | 45.2 | 47.0 |
HumanEval(pass@10) | 86.6 | 78.7 | 84.1 |
HumanEval+(pass@10) | 80.5 | 72.0 | 78.0 |
MBPP(pass@1) | 66.7 | 57.4 | 63.2 |
MBPP+(pass@1) | 56.6 | 47.8 | 52.0 |
MBPP(pass@10) | 85.7 | 80.4 | 88.1 |
MBPP+(pass@10) | 75.4 | 71.2 | 77.5 |
结论、局限性和未来工作
我们提出了玉兰花迷你指令模型,这是一个参数规模为24亿的强大小型语言模型,采用了监督微调(SFT)、直接偏好优化(DPO)和近端策略优化(PPO)策略进行完整的后训练过程。尽管玉兰花迷你指令模型在MMLU等知识密集型基准测试中表现出局限性,但我们的实验结果表明,它在多个通用任务中展现出具有竞争力的性能。我们期望我们的实证贡献将有助于开发更强大和更通用的大语言模型。未来的研究方向将集中在通过扩大训练数据收集来增强数据集的多样性和全面性,以提高推理能力。
🔧 技术细节
文档中关于训练过程(监督微调、偏好微调、强化学习)的数据来源、数据过滤、训练设置、奖励模型选择、超参数设置等内容均属于技术细节范畴。例如,在监督微调的数据过滤部分,详细介绍了去重、启发式过滤、基于质量的评分、基于复杂度的选择等策略;在强化学习部分,说明了遇到的技术挑战(如奖励作弊现象)及相应的缓解策略。
📄 许可证
- 本仓库中的代码、模型权重和优化器状态根据MIT许可证发布。
- 关于模型权重、中间优化器状态和训练数据使用的政策将在未来更新中公布。
- 局限性:尽管我们努力减轻安全问题并鼓励生成符合道德和法律的文本,但语言模型的概率性质仍可能导致意外输出。例如,响应可能包含偏见、歧视或其他有害内容。请不要传播此类内容。我们不对有害信息传播所产生的任何后果负责。
引用
如果我们的报告对您的研究有帮助,请引用:
@article{YuLan-Mini-Instruct,
title={YuLan-Mini-Instruct Technical Report},
author={RUCAIBox YuLan-Mini-Instruct Team},
url={https://github.com/RUC-GSAI/YuLan-Mini},
year={2025}
}
贡献者
玉兰花迷你指令模型团队
作者按字母顺序排列:费白、陈志鹏、高彦子鹏、顾宇凯、胡逸文、刘一宏、闵英倩、任瑞阳、宋华通、孙爽、文继荣、吴成浩、赵鑫、周坤、朱宇涛



