我们能否从 Cosmopedia 中创建具有教育价值的多轮合成数据集?

社区文章 发布于 2024 年 5 月 7 日

简而言之:我正在使用 Cosmopedia 作为起点,构建一个多轮数据集。你可以在 https://huggingface.co/datasets/davanstrien/cosmochat 找到当前版本。我将在公共场合进行这项工作。请随意嘲笑我提示中的所有错别字,或者提出改进建议!

是什么以及为什么?

合成数据集正在日益推动开源 LLM 的质量提升。一个最近的例子是 Cosmopedia

Cosmopedia 是一个合成教科书、博客文章、故事、帖子和 WikiHow 文章的数据集,由 Mixtral-8x7B-Instruct-v0.1 生成。该数据集包含超过 3000 万个文件和 250 亿个 token,是迄今为止最大的开放合成数据集。

该数据集的目标之一是重现 “Textbooks Are All You Need” 论文。该论文的简要结论是,通过大量投入用于训练这些模型的数据,可以潜在地提高 LLM(特别是参数有限的 LLM)的性能。

这种方法的直觉是,教科书可能是训练模型的非常有用的格式,因为它们旨在以密集和高效的格式传达信息。你可以在这篇博客文章中了解更多关于 Cosmopedia 的信息。

我们可以从这里创建聊天数据吗?

自 Cosmopedia 发布以来,我一直对从 Cosmopedia 构建聊天格式数据集感到好奇。之前的尝试在这里:davanstrien/cosmopedia_chat

特别是,由于教科书式内容信息量非常大,并且目标是以教学上有益的方式呈现高质量信息,因此 Cosmopedia 似乎可能是一种有用的格式,可以创建一种旨在建立在此教学方法基础上的合成聊天式数据集。

我们可以从这里创建高质量的多轮数据吗?

一些人觉得聊天模型有用,主要原因之一是它们能帮助学习新概念。这并非总是奏效,因为模型可能会自信地给出错误答案。暂且抛开这个问题,与模型聊天以了解更多关于某个主题的信息仍然可能是有益的。与内容静态且可能无法详细解决你遇到困难的文本不同,聊天模型可以被要求深入探讨特定领域。如果你不理解其答案,可以直言不讳地要求重新表述。你还可以提问以检查自己的理解,例如“这样说是否公平……”之类的问题。

许多现有开放数据集的局限之一是它们是单轮的,即问答式的。实际上,LLM 有用的原因之一恰恰在于它能超越最初的问答对。这就是我正在努力构建的。多轮数据对于提高语言模型在真实世界对话场景中的性能至关重要。与单轮问答对不同,多轮数据捕捉了人类对话的动态性质,使模型能够学习如何保持上下文、解决歧义、遵循对话流程、适应用户意图的变化,并参与复杂的交互。通过训练多轮数据,语言模型有望更好地扮演这种教学角色。

关于如何推进这方面工作(花哨的想法😅),我有很多想法,但大致目标是:

  • 创建多轮数据。目前,我专注于硬编码的轮次,但我正在思考如何更“有机地”确定特定聊天中合适的轮次数量。
  • 聊天的初始问题通过 Cosmopedia 中的文本生成
  • 初始问题应符合 Cosmopedia 中定义的受众水平(小学生或大学生)
  • 后续问题有时可能反映学生对知识缺乏理解,并试图测试模型澄清能力。其他时候,学生可能希望深入探讨。

在这项工作中,我正在使用出色的 distilabel 库。我将分享完整的管道和流程(一旦我整理好初始版本!),但目前提示大致如下。

生成初始问题的提示

def cosmopedia_to_question_prompt(text, audience) -> str:
    return f""""You will play a {audience}.
Based on some text I will show you, please write a question about the topic discussed which could be asked by a {audience}.
The question should focus on topics discussed in the text. You should write the question assuming the student has some familiarity with the topic but not the text itself.
<text>\n
{text.strip()}
</text>
If the text includes analogies, examples, metaphors, etc., you should not include them in the question unless it is reasonable to assume these would be commonly used in educational materials for a {audience}.
For example, if the text discusses the concept of gravity using the analogy of a bowling ball on a trampoline, you should not include the analogy in the question unless it is reasonable to assume that a {audience} would be familiar with this analogy.
Return only the question you would ask, not the text itself or any other information.
"""

生成后续问题的提示

def format_to_generate_second_question(questions_and_answer_messages, audience) -> str:
    student_understanding = [
        "a very poor understanding of the topic. This student may be confused or have misconceptions about the topic which will be expressed in their question.",
        "a poor grasp of the topic and wants to clarify their understanding.",
        "a good understanding of the topic. They are likely to follow up about a specific component of the answer given.",
        f"a very deep understanding of the topic and wants to explore the topic further. This student may ask questions beyond what would be expected from their level of study as a {audience}. They may make connections to other topics or ask about advanced concepts.",
    ]
    student_understanding = random.choice(student_understanding)
    messages_formatted = ""
    for message in questions_and_answer_messages:
        if message["role"] == "user":
            messages_formatted += f"Q: {message['content']}\n"
        if message["role"] == "system":
            messages_formatted += f"A: {message['content']}\n"
    return f"""Based on the conversation below, write a follow-up question from a student.
    <conversation>
    {messages_formatted}
    </conversation>
    Remember, the student is an {audience} with {student_understanding}. 
    If the response from the model is beyond what would be expected from a {audience}, reflect this in the question.
    Just respond with the question.
    """

到目前为止,这种方法产生的一个完整对话示例如下

聊天示例

第 1 轮

用户:将二阶常微分方程转换为一阶常微分方程组如何影响求解初始值问题的复杂性,以及对欧拉方法等数值方法有何影响?

助手:将二阶常微分方程(ODE)转换为一阶常微分方程组可以显著影响求解初始值问题的复杂性,并对欧拉方法等数值方法产生重要影响。

优点

  1. 问题的简化:通过将二阶常微分方程转换为一阶系统,我们降低了方程的阶数,使其更易于分析和求解。
  2. 数值方法更容易实现:一阶系统更适合数值方法,例如广泛用于求解常微分方程的欧拉方法。这些方法是为一阶系统设计的,因此将二阶常微分方程转换为一阶系统使得可以直接应用这些方法。
  3. 提高数值稳定性:一阶系统通常比二阶系统更稳定,这意味着数值解中的小误差不太可能呈指数增长。

缺点

  1. 增加维度:将二阶常微分方程转换为一阶系统时,我们引入了一个附加变量,这增加了问题的维度。这可能导致额外的计算成本和内存需求。
  2. 物理洞察力丧失:通过引入辅助变量,我们可能会对问题失去一些物理洞察力,因为新变量可能没有直接的物理意义。

对数值方法的影响

  1. 欧拉方法:欧拉方法,包括前向欧拉法和后向欧拉法,是为一阶系统设计的。通过将二阶常微分方程转换为一阶系统,我们可以直接应用这些方法。然而,问题维度的增加可能会导致额外的计算成本。
  2. 稳定性与精度:欧拉方法等数值方法的稳定性与精度受转换为一阶系统的影响。辅助变量的引入可能导致额外的误差源,这可能影响数值解的整体精度。
  3. 步长选择:欧拉方法等数值方法的步长选择可能会受转换为一阶系统的影响。为了保持稳定性和精度,可能需要更小的步长,这会增加计算成本。

示例

考虑二阶常微分方程

y''(t) + 4y(t) = 0

初始条件为 y(0) = 1 和 y'(0) = 0。我们可以通过引入辅助变量 z(t) = y'(t) 将其转换为一阶系统。

dz/dt = -4y dy/dt = z

初始条件为 z(0) = 0 和 y(0) = 1。现在,我们可以将欧拉方法应用于这个一阶系统。

总之,将二阶常微分方程转换为一阶系统简化了问题,并使其更适合欧拉方法等数值方法。然而,它也增加了问题的维数,并可能导致额外的误差源和计算成本。必须仔细考虑数值方法和步长的选择,以确保稳定性和精度。

第 2 轮

用户:“我还是有点困惑,把二阶常微分方程转换成一阶系统怎么会更容易求解呢?它不是增加了更多的变量和方程来处理吗?这怎么会更简单呢?”

助手:很高兴你要求澄清。

你说得没错,将二阶常微分方程转换为一阶系统确实会增加要处理的变量和方程。然而,关键点在于一阶系统更易于处理,并且无论从理论上还是数值上都更容易分析和求解。原因如下:

1. 简化理论:处理一阶系统时,有许多理论结果和工具可用于分析和求解它们。例如,一阶常微分方程的存在唯一性定理已得到充分确立,并且变量分离、积分因子和替换方法等技术也已发展成熟。相比之下,二阶常微分方程更具挑战性,并且可用的通用结果较少。

2. 更容易进行数值实现:一阶系统更适合数值方法,因为它们可以使用简单的迭代方案求解。例如,欧拉方法是一种简单直观的数值方法,专为一阶系统设计。当应用于一阶系统时,欧拉方法易于实现和理解。相反,将欧拉方法应用于二阶常微分方程需要更复杂的修改,这可能容易出错。

3. 数值方法复杂度降低:尽管将二阶常微分方程转换为一阶系统会增加更多变量和方程,但它降低了用于求解它们的数值方法的复杂度。许多数值方法,如龙格-库塔方法,都设计用于求解一阶系统。这些方法可以直接应用于转换后的系统,无需额外的修改。这简化了数值实现并减少了出错的可能性。

4. 更好的稳定性和准确性:一阶系统在数值求解时通常比二阶系统更稳定和准确。这是因为一阶系统不太容易出现振荡和超调,这可能导致数值不稳定。通过将二阶常微分方程转换为一阶系统,我们可以利用这些稳定性和准确性优势。

5. 边界条件更容易实现:求解二阶常微分方程时,边界条件的实现可能具有挑战性,尤其是当条件非齐次时。将常微分方程转换为一阶系统可以更容易地实现这些边界条件,因为它们可以直接并入系统中。

虽然将二阶常微分方程转换为一阶系统确实会增加更多的变量和方程,但简化理论、更容易进行数值实现、降低复杂性、更好的稳定性和准确性以及更容易实现边界条件等优点,使其成为求解许多常微分方程问题的有价值方法。

第 3 轮

用户:将二阶常微分方程转换为一阶系统,其优缺点之间的权衡如何影响数值方法和步长的选择,以及确定何时转换的收益大于复杂性的一些通用指导原则是什么?

助手:将二阶常微分方程转换为一阶系统的优缺点之间的权衡确实会影响数值方法和步长的选择。具体如下:

对数值方法选择的影响

  1. 稳定性考虑:如果转换后的一阶系统比原始的二阶常微分方程更稳定,那么使用能够利用这种稳定性的数值方法(例如,隐式方法(如后向欧拉法)或刚性常微分方程求解器)可能是有利的。
  2. 精度要求:如果需要高精度,可能需要更高阶的数值方法(例如,四阶龙格-库塔法)来弥补转换后系统增加的复杂性。
  3. 计算成本:如果转换后的系统很大或计算成本很高,即使牺牲一些精度,也可能倾向于使用更高效的数值方法(例如,欧拉法)。

对步长选择的影响

  1. 稳定性约束:转换后的系统中增加的变量和方程可能会引入额外的稳定性约束,这可能需要更小的步长来保持稳定性。
  2. 精度约束:可能需要更小的步长才能达到所需的精度,特别是当转换后的系统对数值误差更敏感时。
  3. 计算成本:为了降低计算成本,可能需要更大的步长,但这必须与精度和稳定性可能造成的损失相平衡。

判断何时转换有利的通用指南

  1. 刚度:如果二阶常微分方程是刚性的(即,特征值差异很大),则转换为一阶系统有助于提高稳定性和精度。
  2. 边界条件:如果边界条件复杂或非齐次,转换为一阶系统可以使其更容易准确地实现。
  3. 物理意义:如果转换后的系统具有明确的物理意义,则可能更容易理解和分析系统的行为。
  4. 计算成本:如果转换后的系统不是太大或计算成本不是太高,则转换的益处可能超过增加的复杂性。
  5. 问题结构:如果二阶常微分方程具有特定结构(例如,可分离的、线性的),则转换为一阶系统可能不是必需的,或者可能不会带来显著的好处。

何时避免转换

  1. 简单的二阶常微分方程:如果二阶常微分方程简单且可以直接求解,则转换为一阶系统可能没有必要。
  2. 低维系统:如果转换后的系统非常大或维数很高,则增加的复杂性可能不合理。
  3. 成熟方法:如果存在用于直接求解二阶常微分方程的成熟高效方法(例如,有限差分法),则转换为一阶系统可能没有必要。

总而言之,将二阶常微分方程转换为一阶系统的决定取决于具体的特性、数值方法的选择以及步长的考虑。通过权衡优缺点,您可以确定何时转换有利,并为问题选择最合适的数值方法和步长。

待办事项

接下来我想探索的步骤是

  • 目前,我觉得最后一轮对话并不总是很好地遵循用户的“角色”,即他们从对问题二的某个主题不理解转变为提出一个复杂的问题。我认为创建一个贯穿所有轮次提示的用户“角色”可能会很有趣。
  • 偏好数据:我很想把这个转化为一个偏好数据集,特别是为了评估模型在回复最后一轮对话时的表现,这一轮对话旨在提升模型向学生传达概念的能力。

我将在此 GitHub 仓库 中分享代码,并继续迭代 数据集。我将使用数据集的 社区标签 来跟踪想法和后续步骤。

社区

注册登录 发表评论