今天是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历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入