大模型微调数据随意选择会更有效?兼看渐进式检索FunnelRAG实现思路

文摘   2024-10-16 09:03   北京  

今天是2024年10月16日,星期三,北京,天气阴。

我们来看两个工作,关于大模型数据工程,在大规模数据集上进行监督微调(SFT)时数据选择的方法,发现随机选择几乎总是优于现有的数据选择技术。

一个是关于RAG进展, FunnelRAG:从粗糙到精细的渐进检索范式,会有一些收获。

供大家一起参考并思考。

一、大规模数据下监督微调(SFT)中的数据选择问题

最近的工作《Rethinking Data Selection at Scale: Random Selection is Almost All You Need》(https://arxiv.org/pdf/2410.09335,https://github.com/xiatingyu/SFT-DataSelection-at-scale)这个工作很有趣,探讨了在大规模数据集上进行监督微调(SFT)时,数据选择策略的有效性研究大规模数据下监督微调(SFT)中的数据选择问题。

针对大模型(LLMs),发现随机选择数据是一种有效的策略,并且在处理大规模数据时,大多数现有的数据选择方法都难以显著优于随机选择。

其强调在SFT中,数据选择的多样性比单纯追求高质量更为重要。此外,通过token长度过滤数据是一种稳定且有效的方法,尤其是对于较弱的基准模型。

有几个点可以看看。

1、已有的一些数据选择方法

自我评分方法分为两类:基于数据质量的方法和基于数据多样性的方法。

1)基于数据质量的方法

包括LESS、IFD、SelectIT和交叉熵等方法。这些方法通过评估数据点的复杂性、完整性、评分和影响等因素来选择数据。

LESS方法使用低秩梯度相似性搜索来选择有影响力的数据点。但是,LESS方法的影响评分计算依赖于目标任务的目标集设计,这在实际应用中难以实现,因为需要针对各种任务设计全面且多样的目标数据。

IFD方法引入了一个指令遵循难度(IFD)评分,用于评估每个指令样本的挑战性。但是,IFD方法确定的最终IFD评分依赖于响应的困惑度(ppl),但数据长度显著影响ppl值,导致选择的指令数据通常较短,平均仅42个token。

SelectIT方法基于LLMs的内在不确定性来选择高质量的数据点。但是,SelectIT方法需要在多个LLM上进行评分,随着数据集的增大,计算成本呈指数级增长,限制了其在大规模数据集上的应用。

交叉熵方法通过计算每个数据点的交叉熵来评估其质量,交叉熵值越高,数据质量越好。

2)基于数据多样性的方法

包括DiverseEvol和ZIP等方法。这些方法强调训练数据集的多样性。

DiverseEvol方法通过迭代采样训练子集来提高模型性能。通过迭代采样训练子集来提高性能,每次迭代中选择与现有训练数据点距离最大的新数据点。虽然DiverseEvol能够提高模型性能,但其时间和内存消耗非常大,每次迭代需要1-2天,总计5-7天才能完成数据选择,这在实际应用中是不可行的。

ZIP方法通过通过计算样本的压缩比率来选择数据,选择压缩比率最低的数据点进行训练。ZIP方法不需要GPU资源,但计算过程是贪婪的,逐步添加数据点到最终训练子集中。在大规模数据集上,ZIP的选择效果并不理想,尤其是在OpenHermes数据集上,表现不如随机选择。

2、关于多样性

基于多样性的选择策略优于基于质量的选择策略。通过结合K-means聚类过程,基于质量的方法在大多数情况下表现更好。

例如,在Llama3和Qwen2模型上,使用K-means聚类后的交叉熵方法分别提高了5%和3%的平均得分。

但是,例如,这个工作也存在着一些不足。例如,研究中使用的两个大规模数据集(Openhermes2.5和WildChat-1M)虽然规模较大,但仍然可能无法完全代表实际应用中的所有场景和数据类型。数据集的多样性和质量可能会影响研究结果的普适性。

此外,许多现有的数据选择方法依赖于小规模数据集,因此在处理大规模数据集时表现不佳。这表明这些方法在实际应用中可能需要进一步改进和优化。研究中提到的基于token长度的数据过滤方法虽然在某些情况下表现良好,但并不适用于所有语言模型,特别是那些对长文本训练不敏感的模型。

二、从粗糙到精细的检索粒度的渐进式检索FunnelRAG

现有的检索范式存在两个主要问题,一是平铺检索对单个检索器造成巨大负担;二是恒定粒度限制了检索性能的上限。

这的确是个问题,如下图所示:

**《FunnelRAG: A Coarse-to-Fine Progressive Retrieval Paradigm for RAG》(https://arxiv.org/pdf/2410.10293)**,采用从粗糙到精细的检索粒度,通过协作粗粒度到细粒度、大量到少量、低容量到高容量的检索流程,其实就是先聚类,召回最近的类,从类里拿文档做排序,做完排序后,再排序段落。变成,文档聚类簇->文档->段落三阶段。从大到小思路。

但问题来了,容易出现召回偏置。多样性差了。

我们可以看几个点:

1、FUNNELRAG框架中的渐进式检索的流程

渐进式检索旨在通过逐步减少候选规模、提高检索器容量来平衡检索的有效性和效率。

具体设计包括三个阶段:

1)检索阶段:使用稀疏检索器(如BM25)从大规模文档集中检索粗粒度的文档。例如,从21M的文档集中检索出约4K的粗粒度文档。

2)预排序阶段:使用交叉编码器模型对检索到的文档进行预排序,进一步缩小候选范围。这一阶段将粗粒度文档分割成文档级单元(约1K),并对其进行预排序。

3)后排序阶段:使用复杂的列表级模型对细粒度的文档进行后排序,最终得到高质量的检索结果。这一阶段将文档级单元分割成段落级单元(约100),并输入到低容量、中容量和高容量的检索器中进行处理。

2、FUNNELRAG框架中粗到细粒度分割实现及影响

粗粒度分割:在检索阶段,使用BM25从21M的文档集中检索出约4K的粗粒度文档。这些文档通常是多个相关文档的聚类结果。

其中,这个聚类算法,像singlepass:

细粒度分割:在预排序和后排序阶段,将粗粒度文档分割成更细粒度的单元。具体步骤包括:

预排序阶段:将粗粒度文档分割成文档级单元(约1K)。

后排序阶段:将文档级单元分割成段落级单元(约100),并输入到低容量、中容量和高容量的检索器中进行处理。

这种粗到细粒度的分割方式对检索性能有显著影响:

提高检索精度:细粒度检索能够更准确地定位到包含答案的文档,从而提高答案召回率。

减少计算负担:粗粒度检索减少了初始候选规模,降低了计算复杂度和时间成本。

负载均衡:通过逐步细分粒度,可以将复杂的任务分配给不同容量的检索器,实现负载均衡。

3、一个具体的例子

一个具体的例子如下:

但是,这个工作也存在一些问题,为了实现有效的检索,需要手工调整一些超参数,如最大聚类大小和每个阶段的候选项数量。这增加了系统的复杂性,并且可能需要专业知识来优化这些参数。

此外,尽管通过渐进式检索减少了候选项的数量,但在某些情况下,特别是当排名位置较低时,计算成本仍然较高。论文假设通过局部到全局的蒸馏方法可以有效传递检索信号,但这一假设的有效性尚未经过充分验证,可能需要在更多数据集上进行测试。

随着模型的复杂性增加,尽管候选项数量有限,但计算成本仍然可能成为一个问题。特别是在后排名阶段,需要处理大量的段落级单元。

总结

本文主要讲了两个工作,关于大模型数据工程,在大规模数据集上进行监督微调(SFT)时数据选择的方法,发现随机选择几乎总是优于现有的数据选择技术。

一个是关于RAG进展, FunnelRAG:从粗糙到精细的渐进检索范式,实际上,这个其实有偏置,如果涉及到动态更新,聚类的数量,性能这些都会带来其他影响。

为了实现有效的检索,需要手工调整一些超参数,如最大聚类大小和每个阶段的候选项数量。这增加了系统的复杂性,并且可能需要专业知识来优化这些参数。

参考文献

1、https://arxiv.org/pdf/2410.09335

2、https://arxiv.org/pdf/2410.10293

关于我们

老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。

加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入


老刘说NLP
老刘,NLP开源爱好者与践行者。主页:https://liuhuanyong.github.io。老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
 最新文章