Kaggle大模型竞赛优胜方案总结与思考
大家好,我是HxShine。
LLM的Reward模型该如何训练呢?今天对Kaggle LLM比赛LLM Science Exam 的一些优胜方法做一个总结,这是Kaggle竞赛平台第一次举办LLM相关比赛,赛题就是探索如何训练一个science-based Reward Model。
优胜方案中,如何利用RAG(检索增强)方法提高模型的上限,如何通过传统方法以及向量检索方法提高检索知识的质量,如何使用LoRA,QLoRA等技术对LLaMa2等系列进行微调,甚至在16GB内存的GPU上对70B大小的LLM进行推理[7]等很多技术都值得我们学习,相信大家看完会有所收获。
一、概述
Title:Kaggle - LLM Science Exam Use LLMs to answer difficult science questions
比赛排行榜:https://www.kaggle.com/competitions/kaggle-llm-science-exam/leaderboard
1.Motivation
- Reward模型:简单来说就是用于判断LLM的输出哪个更好,辅助提升LLM的输出质量。它是一种用于强化学习的技术,用于改进生成式对话系统的性能,基本思想是通过奖励函数来引导模型生成更好的回复,
- Reward模型是强化学习提高LLM表现的关键之一。Reward模型该如何建模?可以利用那些数据?如何训练?大模型好还是小模型好?都还有待进一步探索。
- 如何尽可能低成本的训练好的Reward模型?OpenAI的Reward模型用的是6B左右的模型[1],成本更低的Reward模型方案也值得探索,该比赛通过限制GPU数量和推理时间来挖掘成本低,精度高的Reward模型训练方案。
2.Definition
赛题:从大模型生成的5个候选结果挑选3个最好的结果。即对于每一个问题prompt,LLM生成A、B、C、D、E五个答案,正确的答案answer只有一个,从LLM生成的5个结果中,选择前三的答案进行输出。其利用MAP@3计算分数。下面给出一个样例数据:
Prompt:
Which of the following statements accurately describes the impact of Modified Newtonian Dynamics (MOND) on the observed ""missing baryonic mass"" discrepancy in galaxy clusters?
A:
MOND is a theory that reduces the observed missing baryonic mass in galaxy clusters by postulating the existence of a new form of matter called "fuzzy dark matter."
B:
MOND is a theory that increases the discrepancy between the observed missing baryonic mass in galaxy clusters and the measured velocity dispersions from a factor of around 10 to a factor of about 20.
C:
MOND is a theory that explains the missing baryonic mass in galaxy clusters that was previously considered dark matter by demonstrating that the mass is in the form of neutrinos and axions.
D:
MOND is a theory that reduces the discrepancy between the observed missing baryonic mass in galaxy clusters and the measured velocity dispersions from a factor of around 10 to a factor of about 2.
E:
MOND is a theory that eliminates the observed missing baryonic mass in galaxy clusters by imposing a new mathematical formulation of gravity that does not require the existence of dark matter.
Answer:
D
评价指标:MAP@3: Mean Average Precision @ 3,𝑀𝐴𝑃@3=1𝑈∑𝑢=1𝑈∑𝑘=1𝑚𝑖𝑛(𝑛,3)𝑃(𝑘)×𝑟𝑒𝑙(𝑘)
资源要求:CPU或者GPU推理时间都不能超过9小时,不能接入外部网络。
训练数据:200条评估数据。
测试集:大概4000条数据。
3.难点分析
- 建模方法:题目要求我们对LLM生成的science-based的结果进行排序,其强烈依赖于science相关知识,如何对其建模非常关键,包括中后期大家发现引入外部知识(RAG)来进行增强可以极大的提升模型的上限。
- 建模数据:比赛只提供了200条测试数据,没有训练数据,同时待预测的数据大概4000+左右,20%在A榜,80%在B榜。
- 资源限制:比在只提供2*T4或者1*P100的GPU,时间限制为不超过9小时。
二、Methods
1.RAG vs Finetuning?[2]
RAG:这种方法将检索(或搜索)的能力集成到LLM中。它结合了一个检索系统和一个大模型,前者从大型语料库中获取相关文档片段,后者使用这些片段中的信息生成答案。本质上,RAG 帮助模型“查找”外部信息以改进其响应。
微调:这是采用预先训练的 LLM 并在较小的特定数据集上对其进行进一步训练的过程,以使其适应特定任务或提高其性能。通过微调,我们根据数据调整模型的权重,使其更适合我们应用程序的独特需求。
RAG+微调:在外部知识要求高的情况下,优先RAG,需要模型适配(风格行为词汇)等,就需要微调,两者要求都高的话,需要结合使用[5]。
三、关键优化思路总结
总体上,RAG + LLM结合的模型可以在知识来源、检索方法、基座模型及其尺寸、是否需要微调等多个方面进行优化,针对本次比赛,对我收集到的一些方法进行对比,方便大家参考。
1.检索增强与检索质量为王!
说明:主要探索不用RAG检索增强以及用了RAG检索增强的效果差异,如果不用RAG,模型很快就会到达瓶颈。
基座模型 | 方法 | 说明 | LB分数 | 链接 |
deberta | without context | 不利用检索的结果进行增强 | 0.732 | https://www.kaggle.com/code/radek1/new-dataset-deberta-v3-large-training |
deberta | wiki as context | 利用wiki百科的数据进行增强 | 0.819 | https://www.kaggle.com/code/cdeotte/how-to-train-open-book-model-part-1 https://www.kaggle.com/code/cdeotte/how-to-train-open-book-model-part-2 |
deberta | stem(270k)as context | 利用stem相关的高质量结果进行检索增强 | 0.862 | https://www.kaggle.com/code/mbanaei/86-2-with-only-270k-articles |
LLM(7b/17b) | without context | 直接用LLM,不用检索增强,很快就遇到瓶颈了 | 0.84 | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446422 |
LLM(7b/17b) | wiki as context | 利用wiki百科的检索数据来增强,同时基座模型用7B/13B左右的模型 | 0.90+ | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446422v |
总结1:没有检索增强RAG的引入,很快达到性能瓶颈。没有引入RAG,分数大概是0.73~0.84,第一名的解决方案[4]也提到如果没有检索增强,很快就遇到性能瓶颈,所以他们在RAG检索以及质量优化上都做了不少工作。
总结2:知识以及知识的质量非常关键,几乎是本场比赛的决定因素之一。例如同样的模型(deberta系列),270k的高质量数据LB分数可以到0.862左右,wiki的上下文LB分数只能到0.819左右,同时without context情况下LB只有0.732。另外第一名的解决方案[4]也探索了多种embedding的方案来检索高质量的上下文。15rd place solution[6]几乎把全部精力都放在检索端。
2.有哪些好的检索方法?
总结1:传统检索方法效果也不错。在LLM领域,向量检索不一定比传统检索方法tfidf以及bm25效果好,特别是没有经过垂直领域的训练的embedding模型。例如86-2-with-only-270k-articles[2]中利用tfidf检索,效果比向量检索还稍微好一点。同时4th[2]方法,用elastic_search来检索文档(原理是bm25算法),也取得一个不错的效果。
总结2:检索的质量非常重要。为了提高检索质量,86-2-with-only-270k-articles[2]方法过滤筛选了270k相关的数据,效果相对于原始的wiki数据有了明显的提升。第一名的解决方案[4]提到筛选更相关的一些数据用处不大,可能是其挑选的embedding模型效果不错了,不会检索出质量不太好的结果出来。第15名的方法[6]利用ranker模型进一步筛选高质量的检索结果来提高最终表现。
总结3:检索侧可以用到的优化的方法:传统检索方法(es,tfidf,bm25,Lucene等)+ 向量检索(开源embedding模型, SimCSE[6])+ 训练Ranker模型[6]。
3.基座模型该如何选择?
方法 | 模型 | 说明 | 最高排名 | 链接 |
传统模型 | deberta + finetuning + RAG | deberta系列模型做微调后,结合RAG效果也不错,重点是需要优化检索效果 | 4rd private:0.927 | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446307 |
中等模型(7B/13B) | Llama-2-7b Mistral-7B-v0.1 xgen-7b-8k-base Llama-2-13b + finetuning + RAG | 7B/13B左右的模型,经过微调,同时结合RAG,在做融合,效果比较好 | 1rd private:0.933 | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446358 |
大模型(70B) | debertas + Platypus(70B for hard question) + Xwin(70B) + reranker,其中Platypus(70B for hard question)以及reranker带来的提升比较大 | 大模型主要是解决hard question,带来一定提升 | 3rd private:0.928 | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446358 |
总结1:小模型微调+高质量的检索结果上限也不错。第四名最终只用了deberta模型,另外在检索测利用es等方法做了很多优化,在检索侧做了TTS,最终拿到了第四名。
总结2:大模型微调(7B或者13B左右的模型)可能比小模型微调的上限更高。第一名利用7B左右的模型微调+RAG,一直摇摇领先。
总结3:70B模型zero-shot通用效果就不错,但是在有些方面还打不过微调后的小模型。70B+zero-shot模型大概能达到0.872,总体上表现还不错,但是离要拿到奖牌还有一定距离,微调70B左右的模型效果可能更好,但资源需求也更大,并且不方便做模型融合。
总结4:基座模型可能没那么重要,具体效果的话大概如下:7b/13b + fine-tuning > deberta + fine-tuning > 70b + zero-shot。
4.是否需要对模型在该领域数据上进行微调?
方法 | 是否微调 | 分数 | 链接 |
longformer/deberta + RAG | 不微调 | 0.862(with RAG, longformer 未微调) 0.89(with RAG, deberta微调) | https://www.kaggle.com/code/mbanaei/86-2-with-only-270k-articles |
deberta + 微调 + RAG | 微调 | 0.762(without RAG) 0.90+(with RAG) | https://www.kaggle.com/code/mewmlelswm/lb-0-762-train-4-fold-and-ensemble https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446307 |
LLama7B Mistral 7B | 不微调 | 0.656(without RAG) 0.853(with RAG) | https://www.kaggle.com/code/zzy990106/llama-7b-infer https://www.kaggle.com/code/goelyash/llm-science-mistral-7b |
7B LLama2 + 微调 + RAG | 微调 | 0.84+(without RAG) 0.90+(with RAG) | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446358 |
70B LLM + zero-shot + RAG | 不微调 | 0.872(with RAG) | https://www.kaggle.com/code/zulqarnainali/explained-platypus2-70b-wikipedia-rag |
70B LLM + 微调 + RAG | 微调 | 0.914(with RAG) | https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446414 |
总结1:微调特别是小模型微调,能带来不错的提升。deberta模型微调+模型融合也能到0.927左右的分数,和其他模型的最终结果差异没那么大。
总结2:7B/13B左右的模型微调上限可能高于deberta系列模型的微调。第一名提到其7B左右的模型微调效果就已经很不错了(LB 0.92+),融合deberta模型已经不能带来提升了。
总结3:70B大小的模型其zero-shot能力已经相当不错了【需要结合RAG】。开源70B模型+zero-shot+RAG能达到PB 0.872的分数,效果还不错。
四、优胜方案要点分析
leaderboard | 方法概述 | 关键因素 | 分数 |
1rd place solution | 基座模型:Llama-2-7b,Mistral-7B-v0.1,xgen-7b-8k-base,Llama-2-13b + 是否微调:finetuning 检索增强:1. 探索MTEB top20 embedding模型,挖掘最好的5个。2. 探索更高的数据质量。3. 检索侧做TTS融合。 验证策略:6k STEM数据。 工程:推理加速,包括对context+prompt结果做缓存,优化推理速度,从而可以进行多模型融合。 | 检索质量,基座模型,工程能力 | private:0.933 |
3rd place solution | 基座模型:debertas + Platypus(70B for hard question) + Xwin(70B) 排序模型:reranker +0.912->0.927提升挺大的。 更高的数据质量:利用https://github.com/attardi/wikiextractor收集更高质量的wiki数据 | 数据质量,模型融合
总结:相当于利用70B模型有更好的通用能力来解决小模型表现不太好的case从而进行融合。 | private:0.928 |
4rd place solution | 基座模型:Deberta v3 Large 检索方法:Elasticsearch 检索排序:edit distance + sentence-transformers | 检索质量:高质量的检索结果,以及在检索侧做很多TTS优化融合工作带来的提升。 | private:0.927 |
5rd place solution | 基座模型:Mistral 7B + Llama-70B 微调方法:QLoRA 检索方法:BM-25(Lucene),参考https://www.kaggle.com/code/strifonov/pyserini-scibert + 向量检索 高质量数据:自己处理了wikipedia的数据 增强方法:TTA 融合方法:7B模型简单问题(40%),70B模型苦难问题(60%),更长的context+70B模型预测前两个困难样本(5%) | 融合方法:困难问题用70B模型来解决 检索质量:BM25 + 向量检索结合 TTA增强等 | private:0.926, public:0.928 |
7rd palce solution | 基座模型:Deberta + LLM 检索方法:tfidf + sentence-transformer 验证集:130k STEM数据 训练:QLoRA SFT训练(7B/13B) 多级模型融合方法:简单模型解决阈值高的问题,模型融合解决稍微复杂一点的问题,LLM模型融合解决hard example | 融合方法+检索方法 | private:0.925, public:0.931 |
10rd palce solution | 数据:dumps数据,cirrus数据,270k两种数据。 检索方法:tfidf+向量(bge,gte,e5) 切片方法:sliding window,top 10 chunks 模型:deberta | 检索质量 | private:0.922 |
14rd palce solution | 数据:cirrussearch wiki dump(质量更好点) 检索:向量检索(gte,bge,e5) 模型:deberta 256 融合:TTA(检索结果) | 检索结果融合:不同排序的context融合
| private:0.920 |
15rd palce solution | 数据:6800k wikipedia + 270k 检索方法:tfidf + sentence model(simcse训练) 检索排序:
模型:deberta | 检索优化+排序模型+检索侧TTS | private:0.920,public:0.934 |
总结1:RAG检索对于最终效果非常重要。包括不断优化检索数据质量,利用多种检索策略(基于传统方法or基于向量),还可以通过ranker等方法筛选更好的结果。另外检索侧基于不同不用顺序的context做TTS也能带来不错的提升。
总结2:小模型微调效果也不错,大模型(70B)zero-shot能力非常强,大模型胜在通用能力。例如3rd方法采用小模型解决简单问题,大模型解决hard问题的融合策略。
总结3:7B/13B大小的模型可能会成为NLP竞赛的主力军。其模型上限效果不错,可能比deberta类似大小的模型效果更好,同时训练所需资源也较小。
详细解决思路可以参考:https://www.kaggle.com/competitions/kaggle-llm-science-exam/leaderboard
五、总结
- RAG检索对于最终效果非常重要。包括不断优化检索数据质量,利用多种检索策略,基于传统方法(es,bm25,tfidf等),基于向量(开源方法,SimCSE训练),还可以通过ranker等方法筛选更好的结果都能带来不错的提升。
- 如何有效的检索上下文知识,如何有效的处理长文本知识是难点,还有待进一步探索。本次比赛发现,在检索侧基于不同组合,不同顺序的检索结果做TTS(一种数据侧做融合的方法)能带来非常不错的提升[4][8]。这意味着如果我们在检索侧,长文本理解侧可以做得更好,可能我们不会太依赖检索侧的TTS融合方法,从而降低推理成本。
- 大模型的zero-shot能力比较强,胜在通用能力不错。其意味着不微调就可以在很多任务上取得不错的效果。在本次竞赛中开源的70B模型+zero-shot+RAG效果0.875。
- 大模型for hard sample + 小模型for simple sample可能是一种不错的融合方式。利用了大模型的通用能力不错,在hard样本上也有着比较强的泛化能力,同时小模型易于训练,微调后在简单样本上表现好的特点。3rd place solution[9]就主要用的这种方法。
- 小模型(deberta等)特定领域做微调效果也有一定的发挥之力,同时其有成本优势。deberta微调+RAG可以到0.89左右,利用模型融合甚至可以到前几名0.92+。
- 7B/13B大小的模型可能会成为NLP竞赛的主力军。其模型上限效果不错,可能比deberta类似大小的模型效果更好,同时训练所需资源也较小。
- 强大的工程能力对LLM的继续发展也非常有用。例如让模型一层一层推理在16GB内存的GPU运行70B大模型[7],以及第一名方案中,对context+prompt结果做缓存,可以减少大量重复上下文或者系统消息(system message)的tokens数量,从而优化LLM推理时间[4]。
- 总结提分点:RAG【检索方法,排序方法,TTS策略】 >> 13b+微调 > deberta/longformer + 微调 > 70b zero-shot。
六、References
[1] Ouyang L, Wu J, Jiang X, et al. Training language models to follow instructions with human feedback[J]. Advances in Neural Information Processing Systems, 2022, 35: 27730-27744.
[2] RAG vs Finetuning — Which Is the Best Tool to Boost Your LLM Application?https://towardsdatascience.com/rag-vs-finetuning-which-is-the-best-tool-to-boost-your-llm-application-94654b1eaba7
[3] 利用tfidf传统方法检索相关文档:https://www.kaggle.com/code/hxshine/86-2-with-only-270k-articles?scriptVersinotallow=144092114
[4] 1rd Place Solution:https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446422
[5] 大模型Kaggle比赛首秀冠军方案总结:https://mp.weixin.qq.com/s/mhLOYWA9KEDANVdkoUpP-Q
[6] 15rd place solution: https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446816
[7] 利用16GB内存运行70B大模型:https://www.kaggle.com/code/zulqarnainali/explained-platypus2-70b-wikipedia-rag
[8] 4rd Place Solution:https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446307
[9] 3rd Place Solution:https://www.kaggle.com/competitions/kaggle-llm-science-exam/discussion/446358
本文转载自NLP PaperWeekly,作者: NLP PaperWeekly