首页 > 其他分享 >SmolLM: 一个超快速、超高性能的小模型集合

SmolLM: 一个超快速、超高性能的小模型集合

时间:2024-08-03 09:29:07浏览次数:18  
标签:训练 模型 token SmolLM 高性能 集合 数据 我们

简介

本文将介绍 SmolLM。它集合了一系列最尖端的 135M、360M、1.7B 参数量的小模型,这些模型均在一个全新的高质量数据集上训练。本文将介绍数据整理、模型评测、使用方法等相关过程。

引言

近期,人们对能在本地设备上运行的小语言模型的兴趣日渐增长。这一趋势不仅激发了相关业者对蒸馏或量化等大模型压缩技术的探索,同时也有很多工作开始尝试在大数据集上从头训练小模型。

微软的 Phi 系列、阿里巴巴的 Qwen2 (小于 2B 参数量) 以及 Meta 的 MobileLLM 均展示了这样的结论: 如果设计得当、训练充分,小模型也可以获得很好的性能。然而,这其中关于数据整理、训练细节的相关信息大多都未被披露。

在本文中,我们将介绍 SmolLM。这是一个包含一系列最顶尖的小语言模型的集合,这些模型的参数量包括 135M、360M 和 1.7B。这些模型基于 SmolLM-Corpus 这一仔细整理的高质量数据集而构建,该数据集包含以下三个子集:

  • Cosmopedia v2: 通过 Mixtral 模型合成的、包含课文和故事等内容的数据集 (token 数量为 28B)
  • Python-Edu: 数据样本取自 The Stack 数据集、根据教育价值打分 筛选出来的数据集 (token 数量为 4B)
  • FineWeb-Edu: FineWeb 数据集经过去重且 根据教育价值打分 筛选出来的数据集 (token 数量为 220B)

我们的评测结果显示,在对应的参数量区间内,SmolLM 的模型在一系列常识性推理和世界知识评测标准上均超越了现有的模型。在本文中,我们将介绍训练语料中三个子集的整理方法,并讨论 SmolLM 的训练和评测过程。

SmolLM 的模型在不同推理和常识评测标准上的测试结果

数据整理

Cosmopedia 数据集: 从 v1 到 v2

Cosmopedia v2 是 Cosmopedia 数据集的增强版。Cosmopedia 是当前最大的合成数据集,常被用来进行与训练。它包含超过三百万的课文、博客、故事等数据,这些数据均由 Mixtral-8x7B-Instruct-v0.1 模型生成。绝大部分数据是通过这种方式生成的: 搜集网页内容 (称为“种子样本”),提供内容所属的主题类别,然后让模型扩写来生成。如图 1 就展示了其中的一个样本示例。 这里我们使用大量网络样本来提高数据的多样性,并扩展提示词的话题范围。这篇文章 详细介绍了 Cosmopedia 数据集。

图 1: Cosmopedia 提示词示例.

为了在 v2 版的数据集中进一步优化数据质量,我们曾尝试过以下两种策略:

  • 针对同一提示词,使用多个高性能模型去生成数据
  • 优化提示词本身

针对第一种策略,我们曾尝试了 llama3-70B-Instruct、Mixtral-8x22B-Instruct-v0.1 以及 Qwen1.5-72B-Chat,但当我们在这些生成数据上训练后,我们发现效果提升很有限。因此,下文我们将聚焦于第二种策略: 我们是怎样改进提示词的。

寻找更好的主题和种子样本

每个提示词都包含三个主要部分: 主题、种子样本和生成风格,这三部分确定了意向受众和我们希望模型生成的内容的类型。

为确保生成的一致性,我们需要将相关性强的种子样本归类到对应的主题里面。在 Cosmopedia v1 里,我们通过对 FineWeb 里的样本进行聚类,来确保主题和对应的样本是一致的 (如图 2)。但这种方法有两点局限性:

  1. 这些主题虽然很全面地反映了 web/FineWeb 数据的聚类结果,但可能并没有全面反映真实世界的科目主题分布。
  2. 每个聚类内部的样本并没有被进一步过滤,所以可能包含很多低质量样本。

图 2: FineWeb 的聚类结果

因此,在 v2 版数据集中,我们使用 BISAC 书籍分类 定义的 3.4 万个主题来代替无监督的聚类。 BISAC 已被作为一个通用标准,来给书籍进行科目分类。所以使用这种方法不仅能全面涵盖各类主题,也可以使得我们使用的主题在教育价值层面更有专业性。具体而言,我们先使用 BISAC 里 51 个大类中的 5000 个主题,让 Mixtral 模型针对每个主题生成它的多种二级子类。下图就展示了最终各个大类别下的子类主题数量分布。

图 3: 不同大类下面的主题数量的统计直方图

在定义好了主题后,我们还需要找到和主题相关的数据条目。和使用搜索引擎类似,我们制作了一个搜索工具,用来检索和每个主题有强相关性的数据。我们使用 BISAC 的大类和子类主题作为搜索的关键词,在 FineWeb 数据集的 CC-MAIN-2024-10CC-MAIN-2023-50 文件夹中进行搜索,两个文件夹包含有超过 5.2 亿的样本。对于每个搜索关键词,我们检索出 1000 条最接近的数据条目。相关代码可以见 这里

最终,我们集成了涵盖 3.4 万个主题的 3400 万条数据。接下来需要确定的是,哪种生成风格效果最好。

图 4: “Medical” 大类下的子类主题和对应的网页数据样本.

生成风格

为了确定最有效的生成风格,我们通过训练 1.8B 模型进行了对比实验,其中我们使用不同的 Cosmopedia v1 子集数据,共计有 80 亿 token 的数据量。在生成训练数据时,我们只生成 20 亿 token 的数据量,训练 4 轮,以此来节省时间 (使用 Mixtral 生成 20 亿 token 需要大约 1000 个 GPU 小时)。训练和评测的各项配置和 FineWeb ablation models 一致。每个训练我们都跑两遍,每次用不同的随机种子,最终评测分数取两次的平均。

至于训练结果对比,我们对比了 Cosmopedia v1 的这些子集:

我们发现,当训练文本是基于 stanford 和 openstax 的主题和种子样本时,总体的性能最好,其 MMLU 和 ARC 指标均高于两个 web 样本集。而 stories 仅仅有助于常识性的相关指标。在实现了 v2 版数据集检索新主题和种子样本的代码后,我们也可以对比这次实验的指标数据,来判断我们新生成的提示词的质量好坏。

接下来,我们还要探索哪种受众风格最好。我们使用相同的课文类提示词生成课文内容,但针对两种目标受众: 中学生和大学生。我们发现,在针对中学生受众的生成数据上训练,模型在除了 MMLU 的各项指标上取得了最好的分数。一个合理的解释是,这些指标一般都是对初级或中级的科学知识进行考察,而 MMLU 则包含了针对高级甚至专家级知识的问题。

不同受众的课文数据上的评测结果

不同受众的课文数据上的评测结果

对于 v2 版本数据,我们生成的数据中,40% 面向中学生受众,30% 面向大学生受众,剩下 30% 混合了各种不同受众群体,且融合了 v1 中 stories、stanford 等风格的课文风格。除此之外,我们还生成了 10 亿代码相关的课文,这部分数据基于 AutoMathText 数据集的 Python 代码部分。

最终,我们生成了 3900 万合成数据,按 token 数量算,规模达到了 20 亿,涵盖课文、故事、文章、代码,假想受众的多样性也很高,涵盖主题超过 3.4 万。

FineWeb-Edu 数据集

FineWeb-Edu 数据集由我们在几个月前随着 FineWeb 数据集的技术报告 公开,它包含 1.3 万亿 的 token。其内容来自教育相关的网页,这些网页信息从

标签:训练,模型,token,SmolLM,高性能,集合,数据,我们
From: https://www.cnblogs.com/huggingface/p/18340040

相关文章

  • Python,Maskrcnn训练,cannot import name ‘saving‘ from ‘keras.engine‘ ,等问题集合
    Python版本=3.9,tensorflow=2.11.0,keras==2.11.0问题一、module'keras.engine'hasnoattribute'Layer'Traceback(mostrecentcalllast):File"C:\Users\Administrator\Desktop\20240801\代码\test.py",line16,in<module>......
  • Java常用集合类的接口方法
    ......
  • 位图--类似于数组,用于整数的集合
    位图(Bitmap)是一种数据结构,它使用位(bit)来表示信息,通常用来表示一组元素的集合。在位图中,每个位对应集合中的一个元素,如果位的值为1,则表示该元素存在或被选中;如果位的值为0,则表示该元素不存在或未被选中。位图因其高效的内存使用和快速的查找、插入、删除操作而广泛应用于各种场......
  • 常用快捷键集合
    常用VS运行调试程序快捷键编译.编译程序:Ctrl+F7运行.运行程序:Ctrl+F5打断点:F9启动调试并运行到断点位置:F5单步执行:F10单步进入函数:F11结束调试:Shift+F5清除项目中的所有断点CTRL+SHIFT+F9跳出执行当前执行点所处函数的剩余行 SHIFT+F11常用VS编辑程序......
  • Python:第三课:重要API - 集合类
    列表-list可以用来存储内容可变长度可变类型可以不同有序的数据的数据结构。类似于java中的List列表的基本使用:##定义列表l1=[1,2,3,"a","b","c",True,False]##访问列表print(l1[4])print(l1[3:6])print(l1[3:])print(l1[:6])print(l1[-2])##更新列表l1[4......
  • C#中常用集合类型
    在C#中,集合是用于存储和操作一组数据项的数据结构。这些集合通常位于 System.Collections 和 System.Collections.Generic 命名空间中。下面我将概述C#中几种常用的集合类型及其特点:1. System.Collections 命名空间中的集合这个命名空间中的集合类型不支持泛型,因此在......
  • Java集合
    单列集合思维导图遍历方式适用场景双列集合可变参数Collections工具类常用API......
  • java集合的三种遍历方式
    一、迭代器遍历 在遍历过程中,想删除元素可以使用迭代器遍历ps:遍历过程中不能用集合的方法进行遍历,可以用指针的remove方法进行遍历二、增强for遍历idea快捷方式集合名字.for加回车。方法的底层也是利用迭代器三、lambda表达式遍历完整格式简单格式......
  • InvalidDimensionException:嵌入维度 384 与集合维度 3 不匹配
    我尝试在ChromaDB上使用语义搜索方法,然后出现错误“InvalidDimensionException:嵌入维度384与集合维度3不匹配”我的文件没有任何问题,供您参考,该文件是.CSV并且它已经有嵌入。我尝试使用以下代码执行语义搜索方法:fromchromadb.configimportSettingsfromchrom......
  • 【笔记】计数选讲:容斥、LGV、集合幂级数、GF 2024.8.2
    今天写的很乱。[HEOI2013]SAO容斥。因为我们已经知道父亲\(<\)儿子时的情况(\(n!/\prod_isiz_i\),也适用于森林),那么儿子\(<\)父亲的情况就容斥掉,无限制的就当作那条边不存在。树上背包,记录当前节点为根的连通块大小和容斥系数的积。*[ECFinal23A]DFSOrder4转写为:统计多......