聊聊大模型训练数据——大模型接受的训练数据格式是怎么样的?


聊聊大模型训练数据——大模型接受的训练数据格式是怎么样的?

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

在众多的中间件,比如LLaMAFactory、ms-swift、MindSpeed-LLM中,都会有一个很容易忽略的过程,那就是数据的处理;训练数据集按一个的格式组装好数据后,中间件会处理数据,将其转换成规定的格式,然后再做token化,最后再做embedding。
训练格式一般是alpaca、sharegpt两种格式;如下所示:
但最终在中间件中会处理成如下格式:
当然在不同的中间件中,可能会有些微的差别;但json内部的节点一般都是一致的;一般都是role、content节点。
为什么对话模板内的JSON节点基本都是一致的呢?又是由什么决定的呢?

而在这个jinja模板引擎内,就会解析训练数据的结构,提取信息,从而组装对话模板,这个对话模板就是LLM要求的格式内容。
以MindSpeed-LLM为例,最终经过数据处理后,再引用chat_template模板解析,最终会输出这样的数据:
经过之前的数据处理后,最后数据要喂给LLM作训练的;而这里的数据,要做两步处理:tokenizer—>embedding。即,首先是将文本数据token化,然后向量化。
以MindSpeed-LLM为例,代码处理如下:
然后就会组装一个ids的结构,如下
在这一步,暂时没有涉及到embedding向量化处理,暂时不提及;但是讲一下为什么要embedding。
token化后得到的input_ids是一系列整数,每个整数代表词汇表中的一个特定token。这些整数本身只是简单的标识符,不包含语义信息,模型无法直接从这些整数中学习到语言的特征和模式。例如,“苹果”对应的input_id是一个数字,但这个数字本身并不能体现“苹果”是一种水果、有红色或绿色等属性。
向量化处理(Embedding)的作用
引入语义信息:Embedding层会将每个input_id映射到一个固定长度的向量空间中,这样每个token就可以用一个向量来表示。这些向量能够捕捉到token之间的语义关系,比如语义相近的词在向量空间中距离较近。例如,“苹果”和“香蕉”的向量在空间中可能会比较接近,因为它们都属于水果类别。
适合模型处理:神经网络模型更擅长处理向量数据。通过将input_ids转换为向量,模型可以对这些向量进行各种数学运算,如矩阵乘法、卷积等,从而学习到语言的特征和模式。
降低维度:词汇表通常非常大,直接使用input_ids会导致模型的输入维度非常高。而Embedding可以将高维的离散输入转换为低维的连续向量,减少模型的计算量和参数数量。
总的来说,大模型的训练数据是以chat_template模板引擎文件中的格式要求为主的,中间件会将训练数据预处理转换为对应的格式;其次就是经过token化后,转成固定的ids与mask标记,最终过一遍embedding。
这个数据处理流程是比较关键的,属于原理部分,但大多数人都会忽略,不过对于AI训练、数据准备来说,还是很有必要了解的。


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录