AIxiv专栏是机器之心发布学术、技术内容的栏目。过去数年,机器之心AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,欢迎投稿或者联系报道。投稿邮箱:liyazhou@jiqizhixin.com;zhaoyunfeng@jiqizhixin.com
本文将介绍来自北京理工大学计算机科学与技术学院的流星雨研究计划。该计划旨在深入研究大模型自我进化的理论与方法,推动大模型的发展。
在人类个体能力提升过程中,当其具备了基本的技能之后,会自主地与环境和自身频繁交互,并从中获取经验予以改进。大模型自我进化研究之所以重要,正是源于该思想,并且更倾向于探究大模型自身能力的深度挖掘和扩展。基于这一趋势,北京理工大学 DIRECT LAB 正式启动了「大模型自我进化」的流星雨研究计划。这篇文章以代码大模型和垂域大模型进化为例,逐步介绍流星雨计划。
SRA-MCTS:推动代码大模型自我进化
论文标题:SRA-MCTS: Self-driven Reasoning Augmentation with Monte Carlo Tree Search for Code Generation 论文地址:https://arxiv.org/pdf/2411.11053 代码开源:https://github.com/DIRECT-BIT/SRA-MCTS 8B 模型的数据开源:https://huggingface.co/datasets/BinXD/SRA-MCTS-Llama-3.1-8B
无需外部监督:与传统方法不同,SRA-MCTS 完全依赖模型自身的推理能力进行数据生成和训练,避免了对人工标注数据或额外监督信号的依赖。 自我进化与持续提升:通过反复生成推理路径并进行自我训练,模型形成了一个正向反馈循环,实现了性能的持续提升,尤其在较小模型中也展现出强大的潜力。 提升复杂任务解决能力:文中的方法在多种规模的模型上均展现出了显著的性能提升,特别是在解决需要分析的任务时,SRA-MCTS 显著提高了成功率。 验证了小模型自我合成的潜力:实验分别在小模型(2B, 8B, 14B)上自我数据合成并进行训练,对比了 70B 模型的数据蒸馏结果。结果表明,小模型自我合成的数据训练结果可以超越大模型数据蒸馏的能力。
选择阶段:使用 UCB1 公式,从推理树中选择最优节点,作为推理的起点。 扩展阶段:基于选择的节点,生成新的推理步骤,形成新的推理计划。 评估与反思阶段:评估每个生成的推理步骤的质量,并通过反思机制修正推理过程,确保其正确性与连贯性。 反向传播阶段:通过反馈机制调整生成过程,强化推理路径的质量。
问题:请帮我写一段拓扑排序的代码。 思考过程:拓扑排序是针对有向无环图(DAG)的一种排序算法,它将图中的节点按照某种顺序排列,使得对于每一条有向边 (u, v),节点 u 在节点 v 之前出现。常见的拓扑排序算法有两种:Kahn 算法和深度优先搜索(DFS)算法。这里作者选择使用 Kahn 算法来实现,因为它更直观且容易理解。
Kahn 算法的基本思想是: 找出所有入度为 0 的节点,将它们加入队列。从队列中取出一个节点,将其加入拓扑排序结果中。对于该节点的所有邻接节点,减少其入度。如果某个邻接节点的入度变为 0,则将其加入队列。重复步骤 2 和 3,直到队列为空。如果最终拓扑排序的结果中包含所有节点,则说明图是 DAG;否则,图中存在环。
・ 找出所有入度为 0 的节点,将它们加入队列。 ・ 从队列中取出一个节点,将其加入拓扑排序结果中。 ・ 对于该节点的所有邻接节点,减少其入度。如果某个邻接节点的入度变为 0,则将其加入队列。 ・ 重复步骤 2 和 3,直到队列为空。 ・ 如果最终拓扑排序的结果中包含所有节点,则说明图是 DAG;否则,图中存在环。
from collections import deque, defaultdict
def topological_sort(graph):
# Step 1: 计算每个节点的入度
in_degree = {node: 0 for node in graph}
for node in graph:
for neighbor in graph[node]:
in_degree[neighbor] += 1
# Step 2: 将所有入度为 0 的节点加入队列
queue = deque([node for node in in_degree if in_degree[node] == 0])
# Step 3: 初始化结果列表
topo_order = []
# Step 4: 处理队列中的节点
while queue:
node = queue.popleft()
topo_order.append(node)
# 更新邻接节点的入度
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
# Step 5: 检查是否存在环
if len(topo_order) == len(graph):
return topo_order
else:
raise ValueError("Graph contains a cycle, topological sorting is not possible.")
推理转化为代码:在数据合成的阶段生成的自然语言推理步骤,经过大模型转化为具体的代码,实现从推理到执行的转化。 训练阶段:最终,生成的推理路径和代码会被结合起来,形成一个高质量的训练数据集,用于进一步微调大语言模型。
论文:https://arxiv.org/abs/2411.11933 Github 链接:https://github.com/DIRECT-BIT/METEOR
第一阶段:导师监督学习,旨在赋予模型基本的领域知识,让模型能够完成领域任务; 第二阶段:自我评估能力习得,通过借助通用大模型的指导,进一步迭代训练学习,赋予模型自我评判的能力; 第三阶段:自我提升训练,通过自我批判完成自我进化。