大模型开发和微调工具Llama-Factory-->数据处理

embedded/2024/12/2 22:54:38/

数据处理

dataset_info.json 包含了所有经过处理的 本地数据集 和 在线数据集。如果使用本地数据集, 务必在 dataset_info.json 中添加对应数据集及其内容的定义

目前支持 Alpaca 格式 和 ShareGPT 的格式

1.Alpaca

针对不同任务,数据集格式要求如下:

  • 指令监督微调
  • 预训练
  • 偏好训练
  • KTO
  • 多模态

1.指令监督微调

  1. 样例如下

    在这里插入图片描述

  2. 解释

    1. instruction 对应的内容是人类指令

    2. input 对应内容是人类输入

    3. output 对应内容是模型回答

      在进行指令监督微调时, instruction 列的内容会与 input 列对应内容拼接后作为最终人类的输入,即人类输入为 instruction\ninput。而 output 为模型回答

    4. 如果指定 system 列,对应内容将被作为系统提示词

    5. history 列是由多个字符串二元组构成的列表,分别代表历史消息中每轮对话的指令和回答。注意,在指令监督微调时,历史消息中的回答内容也会被用于模型学习

  3. 最终指令微调的格式要求如下

    [{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","system": "系统提示词(选填)","history": [["第一轮指令(选填)", "第一轮回答(选填)"],["第二轮指令(选填)", "第二轮回答(选填)"]]}
    ]
    
    • 样例如下

      [{"instruction": "今天的天气怎么样?","input": "","output": "今天的天气不错,是晴天。","history": [["今天会下雨吗?","今天不会下雨,是个好天气。"],["今天适合出去玩吗?","非常适合,空气质量很好。"]]}
      ]
      
  4. 对于上述的数据,dataset_info.json 的数据集描述应为

    "数据集名称": {"file_name": "data.json","columns": {"prompt": "instruction","query": "input","response": "output","system": "system","history": "history"}
    }
    

2.预训练数据

  1. 样例如下

    在这里插入图片描述

  2. 大语言模型通过学习未被标记的文本进行预训练,从而学习语言的表征。通常,预训练数据集从互联网上获得,因为互联网上提供了大量的不同领域的文本信息,有助于提升模型的泛化能力。 预训练数据集文本描述格式如下:

    [{"text": "document"},{"text": "document"}
    ]
    
  3. 在预训练的时候,只有 text 列中的内容(document)会用于模型学习

  4. 对于上述数据,dataset_info.json 的数据集描述为

    "数据集名称": {"file_name": "data.json","columns": {"prompt": "text"}
    }
    

3.偏好数据集

偏好数据集用于奖励模型训练、DPO训练 和 ORPO 训练。对于系统指令和人类输入,偏好数据集给出了一个更优的回答和一个更差的回答。

一些研究 表明通过让模型学习“什么更好”可以使得模型更加迎合人类的需求。 甚至可以使得参数相对较少的模型的表现优于参数更多的模型。

  1. 偏好数据集需要在 chosen 列中提供更优的回答,并在 rejected 中提供更差的回答,在一轮问答中,格式如下

    [{"instruction": "人类指令(必填)","input": "人类输入(选填)","chosen": "优质回答(必填)","rejected": "劣质回答(必填)"}
    ]
    
  2. dataset_info.json 的数据集描述为:

    "数据集名称": {"file_name": "data.json","ranking": true,"columns": {"prompt": "instruction","query": "input","chosen": "chosen","rejected": "rejected"}
    }
    

DPO(Direct Preference Optimization)和 ORPO(Off-Policy Preference Optimization)是两种用于偏好优化的训练方法,主要用于提升语言模型对用户偏好的响应能力。它们在强化学习(RLHF, Reinforcement Learning with Human Feedback)框架下使用。

1. DPO(Direct Preference Optimization):

  • 目标: 直接通过用户反馈优化模型输出的偏好,使模型更加符合用户的选择。
  • 方法: 不使用强化学习的奖励建模,而是直接在训练数据中根据人类偏好来优化。通过给定两种生成结果,用户给出偏好,模型学习去优化自己生成更符合偏好的结果。
  • 优点: 不依赖复杂的奖励函数设计,直接根据人类偏好进行优化,训练过程简单且高效。
  • 适用场景: 适合场景是有明确的偏好数据并且希望快速迭代和调整模型的偏好输出。

2. ORPO(Off-Policy Preference Optimization):

  • 目标: 在偏离当前策略的数据上,使用偏好信息优化模型,使其在长期上更加符合用户的期望。
  • 方法: 利用“离线”策略的偏好反馈,通过基于强化学习的优化手段来调整模型。 ORPO 使用先前收集的数据进行优化,而不需要像 DPO 那样直接使用偏好进行梯度优化。它与 DPO 不同的是,模型可以在已经采集好的数据上进行偏好训练,不需要实时获取偏好反馈。
  • 优点: 更适合在大规模历史数据上进行训练,训练更为稳健,可以更好地处理复杂的偏好优化问题。
  • 适用场景: 适合有大量历史偏好数据的情况,尤其是难以获取实时偏好反馈的场景。

两者主要区别在于:

  • DPO 是一种直接基于偏好梯度进行优化的策略,而 ORPO 通过强化学习的方式,在离线数据上进行优化。

4.KTO 数据集

KTO 数据集与偏好数据集类似,但不同于给出一个更优的回答和一个更差的回答,KTO 数据集对每一轮问答只给出一个 true/false 的 label。除了 instruction 以及 input 组成的人类最终输入和模型回答 output,KTO 数据集还需要一个额外的 kto_tag 列(true/false) 来表示人类反馈

  1. 一轮问答中的格式如下

    [{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","kto_tag": "人类反馈 [true/false](必填)"}
    ]
    
  2. dataset_info.json

    "数据集名称": {"file_name": "data.json","columns": {"prompt": "instruction","query": "input","response": "output","kto_tag": "kto_tag"}
    }
    

KTO 在这里指的是 “Knowledge Transfer Optimization”(知识迁移优化)相关的数据集。它用于优化模型在知识迁移过程中的能力,特别是在人机交互场景中,评估模型生成的答案是否符合人类的预期。

主要内容:

KTO 数据集不仅包含模型的生成结果,还包括人类的反馈,用来优化模型的响应能力。这种数据集设计类似于偏好优化数据集(Preference Optimization),但区别在于,KTO 不是让人类对两种回答进行排序,而是对每一轮问答通过 true/false 的标签直接评估模型的回答是否合格。

数据集结构:

  • Instruction: 人类的指令或提问。
  • Input: 人类最终的输入内容。
  • Output: 模型生成的回答。
  • kto_tag: 人类反馈(true/false),用于标注该模型的回答是否符合预期。

应用场景:

KTO 数据集特别适合用于模型优化,尤其是在模型需要从训练数据中学习如何更好地回应人类问题时。通过这种数据集,模型能够更高效地识别正确的反馈模式,从而提升在实际应用中的表现。这类数据集常用于大语言模型的强化学习阶段,用来替代复杂的奖励建模过程。

5.多模态数据集

多模态数据集需要额外添加一个 images 列,包含输入图像的路径。目前仅支持单张图像输入。

[{"instruction": "人类指令(必填)","input": "人类输入(选填)","output": "模型回答(必填)","images": ["图像路径(必填)"]}
]

dataset_info.json 描述为

"数据集名称": {"file_name": "data.json","columns": {"prompt": "instruction","query": "input","response": "output","images": "images"}
}

2.ShareGPT 格式

Note:

  • ShareGPT 格式中的 KTO数据集(样例)和多模态数据集(样例) 与 Alpaca 格式的类似。
  • 预训练数据集不支持 ShareGPT 格式。

1.指令监督微调数据集

与 alpaca 格式相比,sharegpt 格式支持更多的角色种类,如 human、gpt、observation、function 等。他们构成一个对象列表呈现在 conversations 列中。

样例如下:

{"conversations": [{"from": "human","value": "你好,我出生于1990年5月15日。你能告诉我我今天几岁了吗?"},{"from": "function_call","value": "{\"name\": \"calculate_age\", \"arguments\": {\"birthdate\": \"1990-05-15\"}}"},{"from": "observation","value": "{\"age\": 31}"},{"from": "gpt","value": "根据我的计算,你今天31岁了。"}],"tools": "[{\"name\": \"calculate_age\", \"description\": \"根据出生日期计算年龄\", \"parameters\": {\"type\": \"object\", \"properties\": {\"birthdate\": {\"type\": \"string\", \"description\": \"出生日期以YYYY-MM-DD格式表示\"}}, \"required\": [\"birthdate\"]}}]"
}

Note:
human 和 observation 必须出现在奇数位置,gpt 和 function 必须出现在偶数位置

dataset_info.json 描述为

"数据集名称": {"file_name": "data.json","formatting": "sharegpt","columns": {"messages": "conversations","system": "system","tools": "tools"}
}

2.偏好数据集

与 alpaca 类似

{"conversations": [{"from": "human","value": "老虎会吃哪一个,草还是树叶?"}],"chosen": {"from": "gpt","value": "我很高兴能帮助你解答问题!不过,我必须指出,这个问题本身可能没有意义。老虎是食肉动物,通常不吃草或树叶。它们的饮食主要包括大型有蹄动物、小型哺乳动物和鸟类。\n\n如果你提出这个问题是出于好奇或有特定原因,我很乐意帮助你找到更多关于老虎饮食习惯的信息,或者建议资源让你更多了解这些壮丽的生物。请告诉我如何进一步协助你!"},"rejected": {"from": "gpt","value": "一只老虎是食肉动物,这意味着它的饮食主要是肉类。老虎主要猎捕和吃其他动物,如鹿和野猪。它们不会选择吃草或树叶,因为这些不是它们自然饮食的一部分。"}
}

格式如下

[{"conversations": [{"from": "human","value": "人类指令"},{"from": "gpt","value": "模型回答"},{"from": "human","value": "人类指令"}],"chosen": {"from": "gpt","value": "优质回答"},"rejected": {"from": "gpt","value": "劣质回答"}}
]

dataset_info.json 的描述为

"数据集名称": {"file_name": "data.json","formatting": "sharegpt","ranking": true,"columns": {"messages": "conversations","chosen": "chosen","rejected": "rejected"}
}

3.OpenAI 格式

OpenAI 格式仅仅是 sharegpt 格式的一种特殊情况,其中第一条消息可能是系统提示词

[{"messages": [{"role": "system","content": "系统提示词(选填)"},{"role": "user","content": "人类指令"},{"role": "assistant","content": "模型回答"}]}
]

dataset_info.json

"数据集名称": {"file_name": "data.json","formatting": "sharegpt","columns": {"messages": "messages"},"tags": {"role_tag": "role","content_tag": "content","user_tag": "user","assistant_tag": "assistant","system_tag": "system"}
}

http://www.ppmy.cn/embedded/142440.html

相关文章

数据资产管理是什么?为什么重要?核心组成部分(分类分级、登记追踪、质量管理、安全合规)、实施方法、未来趋势、战略意义

文章目录 一、引言:数据的新时代二、什么是数据资产管理?2.1 定义2.2 核心功能 三、为什么数据资产管理至关重要?3.1 面对的数据管理挑战 四、数据资产管理的核心组成部分4.1 数据分类与分级4.2 数据资产登记与追踪4.3 数据质量管理4.4 数据安…

kafka数据在服务端时怎么写入的

学习背景 接着上篇,我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前,我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群,我们在这个集群上创建一个topic叫做shitu-topic&…

jvm-45-jvm dump 文件内存介绍+获取+堆内存可视分析化

拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露? 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现,进一步抽象 jvm-44-jvm 内存性能分析工具 Eclipse Memory Analyzer Tool (MAT) / 内…

基于STM32的传感器数据采集系统设计:Qt、RS485、Modbus Rtu协议(代码示例)

一、项目概述 项目目标与用途 本项目旨在设计并实现一个基于STM32F103RCT6微控制器的传感器数据采集系统。该系统通过多个传感器实时监测环境参数,并将采集到的数据传输至上位机进行处理和分析。系统的主要应用领域包括环境监测、工业控制、智能家居等。通过该系统…

【论文复现】从零开始搭建图像去雾神经网络

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 从零开始搭建图像去雾神经网络 A Two-branch Neural Network for Non-homogeneous Dehazing via Ensemble Learning创新点网络结构迁移学习子…

在windows上安装sqlite

sqlite是个轻量级的数据库,很多应用都采用sqlite作为数据库。 以下是在windows安装的步骤。 一 去官网下载安装包 官网地址 : https://www.sqlite.org/download.html 找到windows预编译二进制程序“Precompiled Binaries for Windows”,如下&#xf…

单链表---移除链表元素

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…

Springboot(四十六)SpringBoot3整合redis并配置哨兵模式

前边我有尝试在Springboot2.6框架中集成redis哨兵集群。但是呢,Springboot3中部署redis的配置和Springboot2中的配置完全不同。 我这里再来记录一下Springboot3中配置redis的全部代码。 上次我的redis是在centos服务器上直接安装的,这次在Springboot3的配置中,我的redis使用…