大家好,我是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

比赛排行榜:kaggle.com/competitions

1 Motivation




  1. Reward模型:简单来说就是用于判断LLM的输出哪个更好,辅助提升LLM的输出质量。它是一种用于强化学习的技术,用于改进生成式对话系统的性能,基本思想是通过奖励函数来引导模型生成更好的回复,
  2. Reward模型是强化学习提高LLM表现的关键之一。Reward模型该如何建模?可以利用那些数据?如何训练?大模型好还是小模型好?都还有待进一步探索。
  3. 如何尽可能低成本的训练好的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 难点分析


  1. 建模方法:题目要求我们对LLM生成的science-based的结果进行排序,其强烈依赖于STEM相关知识,如何对其建模非常关键,包括中后期大家发现引入外部知识(RAG)来进行增强可以极大的提升模型的上限。
  2. 建模数据:比赛只提供了200条测试数据,没有训练数据,同时待预测的数据大概4000+左右,20%在A榜,80%在B榜。
  3. 资源限制:比在只提供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分数链接
debertawithout context不利用检索的结果进行增强0.732kaggle.com/code/radek1/
debertawiki as context利用wiki百科的数据进行增强0.819kaggle.com/code/cdeotte
debertastem(270k)as context利用stem相关的高质量结果进行检索增强0.862kaggle.com/code/mbanaei
LLM(7b/17b)without context直接用LLM,不用检索增强,很快就遇到瓶颈了0.84kaggle.com/competitions
LLM(7b/17b)wiki as context利用wiki百科的检索数据来增强,同时基座模型用7B/13B左右的模型0.90+kaggle.com/competitions

总结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 有哪些好的检索方法?

方法说明LB链接
tfidf利用tfidf传统方法来做检索增强0.862kaggle.com/code/mbanaei
tfidf+embedding结合多类检索方法来做增强,甚至可以在检索测做TTS0.905tfidf方案:kaggle.com/code/mbanaei方案:kaggle.com/code/dangngu
bm25(elastic sedarch)利用bm25传统方法来做检索增强0.9+?(第4名用了多种检索增强的方法来做,最终PB分数0.927)kaggle.com/competitions
embedding model主要的考察点在用哪种embedding模型效果好?第一名尝试了MTEB Leaderboard上top-20模型,最终挑选了5个最好的模型模型0.90+kaggle.com/competitions
ranker model在检索的基础上,利用ranker模型进一步筛选更高质量的结果0.90+kaggle.com/competitions
检索位置的影响(选项ABCDE不同位置有影响)TTS增强:根据context或者答案的顺序来做TTS,增加多样性。有效果但是不太稳定。在final classification head添加每个选项的average logits,效果不错并且稳定。0.90+,上限比较高!kaggle.com/competitions

总结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 + RAGdeberta系列模型做微调后,结合RAG效果也不错,重点是需要优化检索效果4rd private:0.927kaggle.com/competitions
中等模型(7B/13B)Llama-2-7bMistral-7B-v0.1xgen-7b-8k-baseLlama-2-13b + finetuning + RAG7B/13B左右的模型,经过微调,同时结合RAG,在做融合,效果比较好1rdprivate:0.933kaggle.com/competitions
大模型(70B)debertas + Platypus(70B for hard question) + Xwin(70B) + reranker,其中Platypus(70B for hard question)以及reranker带来的提升比较大大模型主要是解决hard question,带来一定提升3rdprivate:0.928kaggle.com/competitions

总结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微调)kaggle.com/code/mbanaei
deberta + 微调 + RAG微调0.762(without RAG)0.90+(with RAG)kaggle.com/code/mewmlel
LLama7BMistral 7B不微调0.656(without RAG)0.853(with RAG)kaggle.com/code/zzy9901
7B LLama2 + 微调 + RAG微调0.84+(without RAG)0.90+(with RAG)kaggle.com/competitions
70B LLM + zero-shot + RAG不微调0.872(with RAG)kaggle.com/code/zulqarn
70B LLM + 微调 + RAG微调0.914(with RAG)kaggle.com/competitions

总结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提升挺大的。更高的数据质量:利用github.com/attardi/wiki收集更高质量的wiki数据数据质量,模型融合Platypus(70B for hard question)reranker筛选更高质量的context总结:相当于利用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),参考kaggle.com/code/strifon + 向量检索高质量数据:自己处理了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融合[ 0, 1, 2, 3, 4, 5][ 0, 6, 7, 8, 9, 10][ 0, 11, 12, 13, 14, 15][ 0, 16, 17, 18, 19, 20]private:0.920
15rd palce solution数据:6800k wikipedia + 270k检索方法:tfidf + sentence model(simcse训练)检索排序:6800k wiki -> sentence top1000 -> LBGRanker -> top30 -> sentence model -> top20 -> LB 0.885270k tfidf/sentence -> top5/top8 paragraphs模型:deberta检索优化+排序模型+检索侧TTSprivate:0.920,public:0.934

总结1:RAG检索对于最终效果非常重要。包括不断优化检索数据质量,利用多种检索策略(基于传统方法or基于向量),还可以通过ranker等方法筛选更好的结果。另外检索侧基于不同不用顺序的context做TTS也能带来不错的提升。

总结2:小模型微调效果也不错,大模型(70B)zero-shot能力非常强,大模型胜在通用能力。例如3rd方法采用小模型解决简单问题,大模型解决hard问题的融合策略。

总结3:7B/13B大小的模型可能会成为NLP竞赛的主力军。其模型上限效果不错,可能比deberta类似大小的模型效果更好,同时训练所需资源也较小。

详细解决思路可以参考:kaggle.com/competitions

五、总结


  1. RAG检索对于最终效果非常重要。包括不断优化检索数据质量,利用多种检索策略,基于传统方法(es,bm25,tfidf等),基于向量(开源方法,SimCSE训练),还可以通过ranker等方法筛选更好的结果都能带来不错的提升。
  2. 如何有效的检索上下文知识,如何有效的处理长文本知识是难点,还有待进一步探索。本次比赛发现,在检索侧基于不同组合,不同顺序的检索结果做TTS(一种数据侧做融合的方法)能带来非常不错的提升[4][8]。这意味着如果我们在检索侧,长文本理解侧可以做得更好,可能我们不会太依赖检索侧的TTS融合方法,从而降低推理成本。
  3. 大模型的zero-shot能力比较强,胜在通用能力不错。其意味着不微调就可以在很多任务上取得不错的效果。在本次竞赛中开源的70B模型+zero-shot+RAG效果0.875。
  4. 大模型for hard sample + 小模型for simple sample可能是一种不错的融合方式。利用了大模型的通用能力不错,在hard样本上也有着比较强的泛化能力,同时小模型易于训练,微调后在简单样本上表现好的特点。3rd place solution[9]就主要用的这种方法。
  5. 小模型(deberta等)特定领域做微调效果也有一定的发挥之力,同时其有成本优势。deberta微调+RAG可以到0.89左右,利用模型融合甚至可以到前几名0.92+。
  6. 7B/13B大小的模型可能会成为NLP竞赛的主力军。其模型上限效果不错,可能比deberta类似大小的模型效果更好,同时训练所需资源也较小。
  7. 强大的工程能力对LLM的继续发展也非常有用。例如让模型一层一层推理在16GB内存的GPU运行70B大模型[7],以及第一名方案中,对context+prompt结果做缓存,可以减少大量重复上下文或者系统消息(system message)的tokens数量,从而优化LLM推理时间[4]。
  8. 总结提分点: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?towardsdatascience.com/

[3] 利用tfidf传统方法检索相关文档:kaggle.com/code/hxshine

[4] 1rd Place Solution:kaggle.com/competitions

[5] 大模型Kaggle比赛首秀冠军方案总结:https://mp.weixin.qq.com/s/mhLOYWA9KEDANVdkoUpP-Q

[6] 15rd place solution: kaggle.com/competitions

[7] 利用16GB内存运行70B大模型:kaggle.com/code/zulqarn

[8] 4rd Place Solution:kaggle.com/competitions

[9] 3rd Place Solution:kaggle.com/competitions

七、更多文章精读

ICLR 2023 | Self-Consistency: Google超简单方法改善大模型推理能力

LLama2详细解读 | Meta开源之光LLama2是如何追上ChatGPT的?

大模型开源之光LLaMA2今天发布了,再来读下LLaMA1原文吧

Meta AI | 指令回译:如何从大量无标签文档挖掘高质量大模型训练数据?

TOT(Tree of Thought) | 让GPT-4像人类一样思考

OpenAI | Let’s Verify Step by Step详细解读

进技术交流群请添加我微信:FlyShines

请备注昵称+公司/学校+研究方向,否则不予通过


如果觉得文章能够帮助到你,点赞是对我最好的支持!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐