前言
我带队的整个大模型项目团队超过40人了,分多个项目组,每个项目组各自做好各自的任务规划/拆解/分配/并行/跟踪,具体而言
- 每个项目组都是全职带兼职,且都会每周确定任务/目标/计划
- 然后各项目组各自做任务拆解,有时同组内任务多时 则2-4人一组 方便并行和讨论,每周文档记录当周工作内容,平时群内随时讨论,1-2周一次语音会
- 最后通过相关课程不断招募各项目组成员
比如在我司审稿项目之前的工作中,我们依次想尽各种办法微调以下模型(我之外,包括且不限于阿荀、朝阳、apple、三太子、文弱、鸿飞、不染、贾斯丁等)
- 七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV
- 七月论文审稿GPT第2版:用一万多条paper-review数据集微调LLaMA2 7B最终反超GPT4
- 七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势
- 七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma
- 七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b,对GPT4胜率超过80%
如上面「第五篇 Mixtral-8x7b微调一文」的文末回复一读者的评论所说,“近期 我们一方面 等llama2 70b的结果,一方面 准备提高下数据的质量了”,故有了本文
而如何提高数据质量呢,便是我和我司审稿项目组在24年3月底登杜甫江阁时所确定的:
- 一个是提高review的质量(从而考虑到可以提高GPT对一篇篇paper的多个review做多聚一摘要出来的大review的质量,由于是让GPT根据设计的prompt做多聚一的摘要操作,故可以优化下该prompt)
- 一个是看有没办法可以拿到review出来之前更早期的论文版本
总之,对于4月和整个Q2而言,除了RAG 2.0版(含通用文档理解)、机器人、两个agent项目之外,论文项目组也有9个事待并行推进:1 70b的微调、2 清洗prompt的优化、3 论文早期版本的爬取、4 review特异性的增强、5 论文评分、6 审稿新数据爬取、7 金融审稿模型的微调、8 论文翻译、9 论文检索 idea提炼
最终本文包含以下4种情况(如果不是特别明白,没事,看完就好了)
- 情况1之晚4:晚期paper-4方面review (对应之前的版本)
此前所有的版本 都没动过paper数据、review数据,比如以下所有版本皆如此
七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV
七月论文审稿GPT第2版:用一万多条paper-review数据微调LLaMA2 7B最终反超GPT4
七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势
七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma
七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b,对GPT4胜率超过80%
七月论文审稿GPT第4.5版:通过15K条paper-review数据微调Llama2 70B(含各种坑与弯路) - 情况2之晚7:晚期paper-7方面review (对应下文的1.2节)
摘要prompt变了:review变了(审稿意见出来7个方面),这是上一节《1.1 数据清洗:让GPT对Review做多聚一操作的摘要prompt的优化》的情况
得到的版本如上所说,定义为七月论文审稿GPT第4.5版 - 情况3之早4:早期paper-4方面review (对应下文的2.2节)
paper爬的更早期的论文版本
但摘要prompt不变:即review不变(推理时 审稿意见出来4个方面)
且可以对上面情况1中第2版的基线做拔高,即是很需要直接和之前的胜率 做对比的
得到的版本定义为七月论文审稿GPT第4.6版 - 情况4之早7:早期paper-7方面review (对应下文的2.3节)
paper爬的更早期的论文版本
摘要prompt变成新的:即review变了(推理时,审稿意见出来7个方面)
得到的版本定义为七月论文审稿GPT第4.8版
第一部分 数据清洗:对摘要prompt的优化
1.1 让GPT对Review做多聚一操作的摘要prompt的优化
1.1.1 我司目前所有审稿数据的全部细节
如本文开头所说,当我们把各种模型都微调一遍之后,发现最终还是得回归到我司爬的数据上
首先,在数据的爬取时间点上,在针对review做多聚一之前,只是经过简单初筛(比如去除过短的review)后的总paper数-30186份,通过两次先后爬取到:
- 2023Q4(含全部会议,2018-2023):爬取23176份
后续如果做了更多数据处理之后(比如多聚一和去除长尾之后),数据量便会从23176篇带多条review的paper降到了15566条paper-review(一篇paper对应一条大review),后去掉了其中的一条异常数据,最终数据总数为15565条,详见此文:七月论文审稿GPT第2版:用一万多条paper-review数据集微调LLaMA2 7B最终反超GPT4 - 2024Q1(含全部会议,2017-2024):爬取7010份
和上面Q4的23176份数据一样(只去除了过短的review),尚未做多聚一和去除长尾数据等操作
其次,在数据的组成上,这30186份里面,ICLR、NeurIPS这两个会议的总数是24210份「当然,这个数据量如上面说的,是在多聚一之前的(也就是只去除了Review过短项后的),后续还会根据是否有对应paper、去除无效内容等进一步过滤,还会再少一截」,包括
- 15877份ICLR(2017-2024,从某paperreview网页访问可以访问到2013 2014 2016的iclr,但相关的详细数据接口没有暴露这部分年份的数据,所以只能取到2017-2024的iclr)
- 8333份NIPS(2019 2021 2022 2023,至于2024年的在24年4月初时paper和review都还没有内容 )
而这24210份,又都是什么时候爬的呢?
- 2023Q4爬到的(含ICLR 2018-2023共14224份、NeurIPS 2019-2022共6347份)-20571份
- 2024Q1爬到的(含ICLR 2017/2021/2024共1653份、NeurIPS 2019/2021/2022/2023共1986份)-3639份
相当于如下表所示
ICLR | NeurIPS | |
两者总计24210份 | 15877份ICLR(2017-2024) | 8333份NIPS(2019-2023) |
23年Q4爬取的20571份 | 2023Q4爬到的ICLR 2018-2023,共14224份 | 2023Q4爬到的NeurIPS 2019-2022,共6347份 |
24年Q1爬取的3639份 | 2024Q1爬到的ICLR 2017/2021/2024,共1653份 | 2024Q1爬到的NeurIPS 2019/2021/2022/2023,共1986份 |
最后,让鸿飞爬取NIPS官方源的review数据(这部分数据唯一的不足是paper和review均没带具体日期:即没带年月日)
- 共爬取有2485篇(2014-2020,21年review项都是导向了某paperreview网站,22年、23年均没有提供review这一选项,24年数据的话截止到24年4月初就完全还没有存在内容,且是paper和review都不存在 ),初步去掉与上面30186份中重叠的18篇,最终剩余2467篇
- 至于NIPS 2013的数据则还待爬
1.1.2 对review做多聚一摘要prompt的优化
那怎么提高数据质量呢?其中一个便是提高review的质量
在我们之前的一系列工作中,我们针对一篇篇论文的多个review做多聚一,且摘要出多个要点,从而,一篇paper 一条review,最后,就可以弄成qa对 去微调开源模型
而之前5k 15k条paper-review数据对中的review,就是根据旧prompt 通过GPT3.5 16K摘要出来的,但之前的旧prompt 比较简单,就4个点
- 重要性和新颖性
- 可能被接收的原因
- 可能被拒绝的原因
- 其他改进建议
现在,想把review摘要的更好些,好提高微调效果,说白了,如果摘要出来的review质量不够高,会非常影响咱们微调模型的效果
总之,咱们的核心目标还是
不断逼近顶会审稿人的视角,以一针见血指出论文的问题、闪光点,从而侧面帮助作者修订论文
在经过反复看一系列论文的review意见之后我个人的反复琢磨,以及七月平台上一系列顶会审稿人对审稿的意见,外加和审稿项目组阿荀、朝阳等人的反复讨论之后,暂定把摘要prompt优化如下(至于完整的prompt设计见七月官网的:大模型商用项目之审稿微调实战营)
- "1 How to evaluate the idea of the paper, such as its importance, novelty, or what significant problem it solved, and what new methods or structures it proposed ": List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description.
- "2 Compared to previous similar works, what are the essential differences":XXX.
- "3 How to evaluate the experimental results in the paper":XXX.
- "4 Possible reasons for its acceptance":XXX.
- "5 Possible reasons for its rejection":XXX.
- "6 Other suggestions for improving the quality of the paper":XXX.
- "7 Other important review comments":XXX.
总的思路就是,对于一篇paper,先看它的重要性、新颖性以及与众不同之处;接着看实验是否充分有说服力,然后总结闪光点、不足;最后看如果改进,看往哪几个方面做改进
1.1.3 对新prompt下gpt-3.5-turbo-1106摘要的测试:看是否有幻觉情况
prompt确定好之后,为了验证是否靠谱,便可以针对较短的2-3条review做摘要试下,但怎么选取较短的review呢?
可以从数据集里的c_content_str里看下,比如通过空格切分或者nltk.tokenize.word_tokenize()切分来统计长度,选排得比较短的几篇,具体操作流程是
- 将同篇paper(同个id)的c_content_str拼接起来
- 然后统计长度
- 根据长度排序,取较短又相对有一点内容的几篇review
最终,朝阳测了大概10个例子,发现在新的prompt下,gpt-3.5-turbo-1106对于阿旬已经处理好的较短的review数据基本没有胡编乱造的情况出现,对于无法摘要的点会正常返回空 (暂基于“之前博客中一直说的gpt3.5 16k”,也就是继续统一用gpt-3.5-turbo-1106,下图的图源是:https://platform.openai.com/docs/models/gpt-3-5-turbo)
不过我个人认为还可以对伪词数小于120的再截断下,一方面发现伪词数104的有60多条都是一样的,且没有实质性的内容,截图如下
另一方面,对于新的prompt的7点来讲,如果内容太少总结出的摘要内容也会较少
后续确实还是用更加严格的长度限制合适些,甚至可以限制更大的长度,优先保证质量,一方面可以保证review信息充足,另一方面可以缓解摘要幻觉
1.2 情况2之晚期paper-7方面review:通过新prompt针对1.5K、15K份数据分别做多聚一的摘要操作
接下来的内容,包括
- 1.1.4.1 通过1.5K规模的晚期paper-7方面review数据微调llama2 7B
- 1.1.4.2 通过15K规模的晚期paper-7方面review数据微调llama2 7B
- 1.4.4.3 没微调成功的第一个原因探讨:训练集大项描述格式没和微调prompt大项描述对齐
- 1.4.4.4 没微调成功的第二个原因探讨:超过50%的数据在accepted是没项的、大概20%的数据在rejected是没项的
- 1.4.4.5 通过7要点摘要prompt第4版重新摘要整理7方面review数据
1.2.1 通过1.5K规模的晚期paper-7方面review数据微调llama2 7B
接下来,我们便可以通过Q4那份23176的数据尝试下,具体而言
- 微调数据的准备(paper不变 review变)
先抽取其中的1557篇paper,然后用新的prompt,针对这部分训练集paper的人工review重新做下多聚一的摘要操作(其实就是把线上营中的1.5k篇paper的人工review重新做了下 多聚一,输出7方面review) 然后,我们就得到了如下图所示的paper-review数据集 - 实际微调:针对训练集中的paper做review预测,与人工review之间做loss
然后微调下llama2 7b,看下work的效果(注意,这里的1.5k都是选的有内容的,故不用再做去除长尾的操作)
当然 微调时让llama2 7b针对训练集中1500多篇paper做review预测的prompt也是相应要用新的「微调prompt」
且虽然这个「微调prompt」的重要性不如数据的重要性大「毕竟当数据量大了上去之后(比如从1.5K到15K),模型会领悟的更多了,类似想作诗,熟读唐诗30首,肯定不如熟读300首(比如30首 模型领悟能力30分,300首 模型领悟能力90分)」instruction = "You are a professional machine learning conference reviewer who reviews a given paper and considers 7 criteria: ** how to evaluate the idea of the paper **, ** compared to previous similar works, what are the essential differences **, ** how to evaluate the experimental results in the paper **, ** possible reasons for its acceptance **, ** possible reasons for its rejection **, ** other suggestions for improving the quality of the paper **, and ** Other important review comments **. In these 7 different criteria, based on the content of the paper, you can list out as many sub-items as possible under each criterion, but do not fabricate content. The given paper is as follows.\n\n\n".strip()
但数据量大上去之前,我认为还可以通过更丰富的prompt让模型领悟到更多「比如让模型领悟能力50分,虽然没90分,但也是进步了」 - 为了让llama2 7B PK GPT4-1106,故让它两分别针对测试集中的paper做推理
让上面微调后的llama2 7b,在新的「推理prompt」下针对测试集中的paper做推理,得到llama2 7b的review结果
让GPT4-1106,在新的「推理prompt」下,针对测试集中的paper做推理,得到GPT4-1106的review结果
最后把咱们之前的测试集中的人工review,也基于新的「多聚一prompt」通过GPT3.5 16k做下摘要(输出7方面review),作为ground Turth - 模型评估
需要注意的是,在评估阶段的处理过程中,需要提取review的子项来进行比较,由于新的prompt关于摘要的描述相对较长,故如果基于原来的代码
对新prompt生成的review,可能会出现把摘要描述也算作是子项的情况,如下图红框所示:def add_order(review_text): # 输入单条review文本,返回处理得到的(项数, 带序号的子项文本) mark = 1 ordered_items = [] for line in review_text.split("\n"): item = line.strip() if len(item) > 50: ordered_item = "{}. {}".format(mark, item) ordered_items.append(ordered_item) mark += 1 else: continue return (mark-1, "\n".join(ordered_items))
而实际上的项数只有13项,如下:
那具体应该怎么修改呢?详见七月官网的《大模型商用项目之审稿微调实战营》
1.2.2 通过15K规模的晚期paper-7方面review数据微调llama2 7B
再往下,我们再用Q4那份15K的数据试下,从而就需要把15K数据中的人工review都用新的多聚一摘要prompt生成新的ground truth(输出7方面review)
对于这部分晚期paper-7方面review的数据,分别用llama2、llama3的分词器得到的长度统计情况如下「1 毕竟从4方面review到7方面review了,故新Review下,llama2大部分比先前稍长(先前高频位于8k左右,如今高频位于9k左右),但统计最长的数据后,依然发现模型的长度只要有12288便足够了,2 基于llama3的tokenizer时,其之所以整体所需的tokens数更少,在于llama3具有更大的词表,比llama2的tokenizer具有更大的文本压缩率,从而使用12288也足矣。3 至于llama3的更多介绍详见:一文速览Llama 3及其微调:从如何把长度扩展到100万到如何微调Llama3 8B」
数据整理好了,接下来又可以愉快的微调了
- 先是通过这份15K规模的「晚期paper-7个方面的review」继续通过longqlora微调咱们的llama2 7B:对比「其对15K份paper的review预测」与「人工review(即新的ground truth)」之间的差异,建loss,得到的版本定义为七月论文审稿GPT第4.5版
- 然后评估时,让第2版微调后的llama2 7B、本第4.5版微调后的llama2 7B分别通过新推理prompt对测试集中的晚期paper做推理(没错,针对同一批的晚期paper,毕竟,不论哪种情况,推理时,所有模型肯定都是针对同一份paper推理 )
- 最后把这两者的推理结果依次与「测试集中人工review在新的多聚一摘要prompt下的7方面review结果」做匹配
当然,由于情况1的第二版llama2 是通过晚期paper-4方面review微调得到的,而如果微调的是4方面review的话,仅通过修改prompt是出不来7方面review的,即情况1模型仍然输出的它原本4方面的review
最终在得到胜率图后,还是发现了问题,即下面这个情况2模型的胜率对比图(此图PK的是命中数),属实有些奇怪 左边新的是基于晚期paper-7方面review微调得到的(情况2之晚7)
右边旧的是基于晚期paper-4方面review微调得到的(情况1之晚4)
前者竟然输于后者 - 只有PK命中率的时候,情况2的模型才能挽回颜面 甚至出现了下图这个胜率对比情况(PK命中率),则只能用文弱说的“llama2的输出项太少了”来解释,所以不容易命中,相当于只有命中率 才算碾压gpt4,但也碾压的过于夸张
1.2.3 没微调成功的第一个原因探讨:训练集大项描述格式没和微调prompt大项描述对齐
以上的结果说明,情况2的模型目前并没有微调成功,在细究原因之后,其中第一个原因的探讨如下
首先,经文弱、朝阳统计发现
- 带4方面review的训练集中的子项项数为7.94 ≈ 8
- 带7方面review的训练集中的子项个数为8.45
- 下面两张是针对带7方面review的测试集推理出来子项统计,可以跟上面的训练集做个对比 可以发现,各项数都有不同幅度的衰退,但是accept那一项尤其衰退的厉害:从0.55(训练集中对应的子项数)降低到了0.08(针对测试集推理得到的子项数)
以上统计数据告诉我们,7方面review训练集的平均子项数上,相比4方面review训练集的平均子项 并没有少,但推理7方面review时出来的平均子项减少了
这个可能证明了「训练集的大项描述与微调prompt的大项描述在格式上的是否对齐」有一定关系,相当于没对齐的话,微调时 没有学到位,从而实际推理时表现不佳,具体而言
- 训练数据集的大项描述是比较复杂一点的,比如下图是训练集中某篇paper对应的人工review(通过gpt3.5-1106做多聚一摘要出来的7方面review)
- 然微调prompt的大项描述比较精简一点
故我们把训练集的大项描述给精简一下,以在大项描述的精简程度上和微调prompt的大项描述对齐instruction = "You are a professional machine learning conference reviewer who reviews a given paper and considers 7 criteria: ** how to evaluate the idea of the paper **, ** compared to previous similar works, what are the essential differences **, ** how to evaluate the experimental results in the paper **, ** possible reasons for its acceptance **, ** possible reasons for its rejection **, ** other suggestions for improving the quality of the paper **, and ** Other important review comments **. In these 7 different criteria, based on the content of the paper, you can list out as many sub-items as possible under each criterion, but do not fabricate content. The given paper is as follows.\n\n\n".strip()
这里面有个问题是,为啥咱们不考虑把后者微调prompt复杂一下,以对齐呢?
虽然,我们是更多让模型在微调过程当中去根据数据去领悟,但其实如果要是微调prompt更全面的话,那对数据的领悟是不可以引导模型领悟的更好
对此,阿荀觉得训练的时候给到模型什么样的输出它就学习什么,至于instruction或者说prompt只是一个用来匹配对应任务的前缀,训练过程不需要“few shot推理”、自然也就没有“引导”的含义,这也是没有专门针对微调的prompt研究出现的原因
只是说可以把两头的情况稍微对齐下、不出现冲突,那如果要考虑选哪边做出让步,更多的内容会引入更多的学习难度,肯定是简化学习难度更直接
最终,在把训练集的大项描述和微调prompt的大项描述在格式上对齐之后(左图中的38.60%是情况2之晚7模型没对齐时相比情况1之晚4模型的胜率 PK 右图中的52.63%是情况2之晚7模型已对齐时相比情况1之晚4模型的胜率),收获了一个小进步
// 至于具体具体实现的对齐?暂「七月官网的大模型商用项目之审稿微调实战营」中见
1.2.4 没微调成功的第二个原因探讨:摘要出来的数据中,超过50%的数据在accepted是没项的、大概20%的数据在rejected是没项的
我们微调完之后,在拿情况4模型 对YaRN论文推理时,发现其中7个大项中竟然有2个大项为空(之前L20 八卡是这个结果,现在L20 单卡也是这个结果)
这肯定无法忍
为了进一步验证心中所想,阿荀再对7方面review中专门的accepted和rejected两大项仔细深究后发现,摘要出来的数据中,有超过50%的数据在accepted是没项的、大概20%的数据在rejected是没项的
追溯原因可能是多聚一模型曲解了prompt的含义或prompt表述不佳,使得模型可能普遍认为accepted和rejected的理由是“绝对的”、“谨慎的”,以及“要么accepted,要么rejected”
对于上面阿荀说的“有超过50%的数据在accepted是没项的、大概20%的数据在rejected是没项的”的这个问题,考虑到那之前4方面review 没有这个问题(之前4方面review中,可能被接受的原因以及可能被拒绝的原因,这两个大项当中的子项,基本都是两个子项)
于是可以让7方面review的摘要prompt去趋近4方面review的摘要prompt,总之,看来我们得重新做一下新review的摘要了(我就说为何情况2 情况4的表现为何没达预期,好在大家一块探讨之下,果然还是有原因的,只是没想到原因出在了这个7方面review的训练集当中的很多accepted和rejected两大项为0,最终归根到摘要prompt的问题)
接下来,特把之前摘要出4方面review的prompt,以及后来摘要出7方面review的prompt拿出来仔细对比下
- 摘要出4方面review的prompt
""" Your task: Compose a summary of some given reviews from a Machine Learning Conference written by reviewers. The given reviews is between the "######". ###### {reviews_of_the_paper} ###### You just need to use the following JSON format for output, **but don't output opinions that don't exist in the original reviews. if you're not sure, return an empty dict**: {{ 'Significance and novelty': List multiple items by using Dict, The key is a brief description of the item, and the value is a detailed description of the item. 'Potential reasons for acceptance': List multiple items by using Dict, The key is a brief description of the item, and the value is a detailed description of the item. "Potential reasons for rejection": List multiple items by using Dict, The key is a brief description of the item, and the value is a detailed description of the item. 'Suggestions for improvement': List multiple items by using Dict, The key is a brief description of the item, and the value is a detailed description of the item. }} """
- 摘要出7方面review的prompt
""" Your task is to summarize some reviews of a paper from a machine learning conference, written by reviewers. These reviews are located between "######". However, do not include any opinions that do not exist in the original review. If you are not sure, you may return an empty dictionary. ###### {reviews_of_the_paper} ###### You should output according to the following JSON format, and please pay attention again that when summarizing the original review, for any question, if the required answer does not exist in the original review, the corresponding question can be left unanswered. {{ 'How to evaluate the idea of the paper, such as its importance, novelty, or what significant problem it solved, and what new methods or structures it proposed': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'Compared to previous similar works, what are the essential differences, such as any fundamental differences, improvements, innovations': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'How to evaluate the experimental results in the paper, such as their persuasiveness, accuracy, effectiveness? Whether they are satisfactory or not, and the reasons or basis for that': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'If the paper is to be accepted, the possible reasons for its acceptance, such as its current advantages and highlights': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'If the paper is to be rejected, the possible reasons for its rejection, such as the obvious shortcomings and defects in the current paper, and which aspects urgently need rapid improvement': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'Other suggestions for further improving the quality of the paper': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. 'Other important review comments': List multiple items in a dictionary, where the key is a brief description of the item, and the value is a detailed description. }} """
阿荀一开始提议,是不是应该把accepted和rejected那两个大项的if什么的给去掉(即去掉“If the paper is to be accepted”,具体完整prompt见七月官网的大模型商用项目之审稿微调实战营 ),我则表示,可以试一下,然后看下 实际出来的摘要结果中,子项的数量咋样
比如可以先针对1.5K条review:如果表现ok,则上15K条review;如果表现不ok,咱们也能快速改
至于选择对人工review做多聚一摘要出7方面要点的模型,阿荀继续用gpt3.5-1106,青睐则用gpt4-1106
于是,我们就针对prompt的各种写法而做了一系列对比实验,过程中也经历了各种头脑风暴
最终,如下表格所示(如阿荀所说,目前看来不举例效果好点应该是个共识,其他情况就是“斯坦福的任务描述不适合用if”、“非斯坦福适合if”效果好点,至于为什么会存在这样搭配才有效就比较难以通过常识解释了)
版本 | 任务定义的描述 | 大项有无举例 | 有无if | 评分(10分制) |
原始版本之4要点摘要prompt | 斯坦福的任务要求 | 大项无举例 | 无if | |
7要点摘要prompt 第1版 | 任务要求自定义 | 大项有举例 | 保留if | 4.5分 |
7要点摘要prompt 第2版 | 任务要求自定义 | 大项有举例 | 没有if | 5.5分 |
to 阿荀:7要点摘要prompt 第3版 | 任务要求改成和斯坦福一致 | 大项有举例 | 保留if | 最差,2分 |
to 朝阳:7要点摘要prompt 第4版 (完整prompt见七月的审稿微调实战营) | 任务要求改成和斯坦福一致 | 大项不再举例(Potential) | 没有if | 最好,9分 |
to 阿荀:7要点摘要prompt 第5版 | 任务要求改成和斯坦福一致 | 大项不再举例(possible) | 保留if | 较差,4分 |
阿荀:7要点摘要prompt 第5.5版 | 任务要求改成和斯坦福一致 | 大项不再举例(Potential) | 保留if | 较差,4分 |
to 朝阳:7要点摘要prompt 第6版 | 任务要求自定义 | 大项不再举例(possible) | 保留if | 较好,7分 |
朝阳:7要点摘要prompt 第6.5版 | 任务要求自定义 | 大项不再举例(Potential) | 保留if | 较好,7分 |
于此,经过这一系列实验,也算能理解,有的公司 设立提示工程师,还是有必要的,你看,我们各种为各种prompt倒腾,比如微调/训练prompt、推理prompt、摘要prompt..
1.2.5 通过7要点摘要prompt第4版重新摘要整理7方面review数据
24年6.12日,在经过上节所述的prompt
to 朝阳:7要点摘要prompt 第4版
(完整prompt见七月的审稿微调实战营)
任务要求改成和斯坦福一致
大项不再举例(Potential)
没有if
最好,9分
阿荀重新摘要出来7方面的review数据之后,发现结果是符合预期的,具体如下三点所述
- 在总项数分布上
绝大部分数据的总项数为10项左右 - 在accepted项数分布上
仅存在少量数据无accepted项 - 在rejected项数分布上
仅存在少量数据无rejected项
随后,朝阳微调出来一个版本,然后做推理之后,竟又出问题了,即推理测试集时出现了不少空项(甚至推理有的paper时,出现7项都是空项的结果),即模型对某个大项不输出
于是我们又开始各种找原因,比如
- 我们发现阿荀摘要数据时,用的v4 prompt,其中这个要点'Potential reasons for acceptance'的关键词是Potential
而朝阳训练、推理 让模型输出的时候,其中这个要点'possible reasons for its rejection'用的关键词都是possible(分别如下两图所示) 对于这一点,我们打算把通过v4版prompt摘要出来的训练数据给到模型学习时,把其对应的摘要prompt与后来的训练prompt、推理prompt对齐
说白了,虽然我们是通过上面v4版prompt摘要出来的训练数据,所以大项描述是那样描述(比如其中这个要点'Potential reasons for acceptance'的关键词是Potential),但考虑到llama2 可能对摘要prompt的那个大项描述学习的不是特别好,故把训练数据中的大项描述和后面训练prompt、推理prompt对齐下(使得训练数据中的大项描述,和训练prompt、推理prompt一样,其中这个要点'possible reasons for its rejection'用的关键词都是possible) - 上面第一点,我们有
摘要数据时,用的v4 prompt,其中这个要点'Potential reasons for acceptance'的关键词是Potential
训练、推理 让模型输出的时候,其中这个要点'possible reasons for its rejection'用的关键词都是possible
在上面第一点,让前者摘要prompt去对齐后者训练和推理prompt,使得都是possible
接下来再试下,让后者训练和推理prompt去对齐前者摘要prompt,使得都是Potential
不过,考虑到毕竟llama3的能力强于llama2,所以我司用阿荀通过v4版摘要prompt摘要出来的数据(且训练和推理prompt对齐摘要prompt),改成去微调llama3了,详见此文《七月论文审稿GPT第5版:拿我司七月的早期paper-7方面review数据集微调LLama 3》的第五部分 论文审稿GPT第5版:通过15K的早期paper-7方面review数据集(情况4)微调llama3
第二部分 数据溯源(paper变 review先不变后变):论文早期版本的爬取
2.1 4种情况的导火线:爬取论文所对应的最早版本近3万篇,这样和review的匹配程度 才能更高
我们之前爬的paper-review数据中,paper大部分都是根据某个或某几个review意见而修改后的版本,相当于paper是新paper,可review还是旧review,相当于没法做到paper与review的100%匹配,这个问题曾一度困扰我们
包括来自厦门大学NLP实验室的这篇论文《MOPRD: A multidisciplinary open peer review dataset,其对应数据地址为dataset》也提到了这个问题:
“大多数提供公开访问同行评审数据的期刊只呈现其论文的已发表版本,而原始手稿通常是保密的。没有原始手稿,许多与开放同行评审相关的研究将变得不可能。 例如,基于修订来研究审稿意见将毫无意义。毕竟在修订中,已经采纳了审稿意见,并解决了原始手稿中的相关问题。总之,如果没有可靠地与原始手稿进行比较,将无法充分理解审稿意见的有效性,对于开放同行评审的研究,审稿意见将变得不太有效 ”
顺带,意外收获了一个可以获取各个学科审稿意见的网站,即:PeerJ
4.3日,我又开始反复琢磨之前阿荀爬下来的review数据
结果意外发现可爬到review对应的论文早期版本
从而,也就解决了审稿项目的这个「paper与review匹配度不足」的大问题,毕竟我们要的就是这种论文所对应的最早的审稿版本,这样和review的匹配程度 才能更高(至于如何具体爬取见七月官网的:大模型商用项目之审稿微调实战营)
如此,便出现了本文开头所述4种情况中的第3种情况
- 情况1之晚4:晚期paper-4方面review (对应之前的版本)
此前所有的版本 都没动过paper数据、review数据,比如以下所有版本皆如此
七月论文审稿GPT第1版:通过3万多篇paper和10多万的review数据微调RWKV
七月论文审稿GPT第2版:用一万多条paper-review数据微调LLaMA2 7B最终反超GPT4
七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势
七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma
七月论文审稿GPT第4版:通过paper-review数据集微调Mixtral-8x7b,对GPT4胜率超过80%
七月论文审稿GPT第4.5版:通过15K条paper-review数据微调Llama2 70B(含各种坑与弯路)- 情况2之晚7:晚期paper-7方面review (对应上文的1.2节)
摘要prompt变了:review变了(审稿意见出来7个方面),这是上一节《1.2 情况2之晚期paper-7方面review:通过新prompt针对1.5K、15K份数据分别做多聚一的摘要操作》的情况
得到的版本如上所说,定义为七月论文审稿GPT第4.5版- 情况3之早4:早期paper-4方面review (对应下文的2.2节)
paper爬的更早期的论文版本
但摘要prompt不变:即review不变(推理时 审稿意见出来4个方面)
且可以对上面情况1中第2版的基线做拔高,即是很需要直接和之前的胜率 做对比的
得到的版本定义为七月论文审稿GPT第4.6版- 情况4之早7:早期paper-7方面review (对应下文的2.3节)
paper爬的更早期的论文版本
摘要prompt变成新的:即review变了(推理时,审稿意见出来7个方面)
得到的版本定义为七月论文审稿GPT第4.8版
考虑到如阿荀所说,“新的paper有近3万篇量比较大,可能应该是先挑好做好多聚一的review了,决定要用哪些paper了再解析好点,不然paper解析可能要花挺长时间,有的paper解析出来也不一定能用上”
故接下来,先尝试第三种(最后再尝试第四种):毕竟第三种情况中的review是旧有现成的(即之前23年Q4时通过旧prompt已多聚一处理好的 ),解析其所对应的更早期的paper就行
2.2 情况3之早期paper-4方面review:先根据Q4的15K来解析对应的早期paper
如本第一部分开头所述的数据细节所说,23年Q4,我司爬了23176篇带多条review的paper,但做了多聚一和去除长尾之后便会降到15565条paper-review(一篇paper对应一条大review)
- 针对这份数据,原有的review保持不变,但我们要爬paper所对应的更早期的版本,确保paper的上传日期在所有review之前,比如如果review是24年5.7日的,那么我们希望paper是24年5.6日或之前的(如此才能保证paper与review有更高的匹配程度)
- 项目组同事阿荀经过爬取(至于如何爬取论文早期版本的代码,见七月官网的大模型商用项目之审稿微调实战营)、整理,发现97%的paper都有多个PDF版本(之前23年Q4时,只取了review页面默认的一个PDF版本),这可是好事啊
类型 | 数量(总计15565) | 释义 | |
revision | 15185 | paper数据属早期修订版本 | |
default | default_pre | 117 | 因早期修订版本不存在或无法访问,paper数据使用默认版本 |
default_post | 33 | 因早期修订版本通篇无法解析或通篇解析为无效内容(过短),paper数据使用默认版本 | |
mix | 230 | abstract、captions、content至少其一存在无效内容(过短或过长),使用paper默认版本相应的部分替换 |
整体逻辑为优先获取所能获取到的最早修订版本Paper的PDF,至于存在以下情况时则使用默认版本对相应内容做替代:
- revision版本不存在或不可访问时,通篇直接采用默认版本的数据
对应上面表格中的default_pre - revision版本已获取到但完全解析失败时,通篇直接采用默认版本的数据
对应上面表格中的default_post - revision版本在title、abstract、captions、content任一部分存在缺失或内容长度极端时,采用默认版本的相应部分做替换
对应上面表格中的mix
相关字段的含义如下
- paper_id:数据相关Paper在OpenReview中的ID
- actual_version:标明Paper数据的版本情况
- title:Paper的标题
- abstract:Paper的梗概
- captions:Paper的图下方描述
- content:Paper的正文内容
- tc_date:该版Paper的创建时间
- tm_date:该版Paper的修改时间
- title_replaced:数据的title部分是否由默认版本的title所替换
- abstract_replaced:数据的abstract部分是否由默认版本的abstract所替换
- captions_replaced:数据的captions部分是否由默认版本的captions所替换
- content_replaced:数据的content部分是否由默认版本的content所替换
然后再把paper和review再一一对应起来,最终数据组织成两类格式
- csv版本(字段含paper_id、paper、review)
- jsonl版本(字段含paper_id、input、output),如果用之前第二版所用的longqlora的代码的话,jsonl版本可以直接用
24年5.7一大早,朝阳开始微调,历时50小时左右,5.9下午4点微调完成
- 一开始,先直接对那原有的测试集中的285份老paper推理下(此处gpt4的结果是推理测试集中晚期paper:出来4方面review,即晚4)
- 再后来,考虑到毕竟测试集中人工的review是根据早期paper来的,这是事实(毕竟先有的最初早期paper,才有后来一系列审稿人针对最初paper提出各种审稿意见,但之前测试集中的paper同之前的训练集一样,只爬的晚期paper),故让阿旬提供“把晚期paper更换成早期paper”后的285条测试数据后,朝阳再推理下
最后,让它PK 之前通过晚期paper-review微调出来的审稿GPT第二版(即下图左侧7b-llama2-longqlora-yang-revison_paper PK 下图右侧7b-longqlora-axun) 可以发现,胜率超过了之前,说明至少数据提升的效果出来了
毕竟同样的模型llama2、同样的代码longqlora,只是在不同的数据之下微调(上图左侧是通过早期paper-4方面review微调,上图右侧是通过晚期paper-4方面review微调)
然后测试或让这两个模型预测的早期paper数据 也是用的一样的,对比的是和人工review的匹配程度
更多细节及代码实现,见七月官网的《大模型商用项目之审稿微调实战营》
2.3 情况4之早期paper-7方面review:paper变、review也变
本节要说的就是上面1.2.1节中所说的四种情况当中的第四种情况
paper变,review变 (相当于早期paper-7方面review)
paper爬的更早期的论文版本
摘要prompt变成新的:即review变了(推理时,审稿意见出来7个方面)
得到的版本定义为七月论文审稿GPT第4.8版
当我们的paper用早期的paper(顺带提一下,用的和情况3中训练集里一样的同批早期paper),且review则用新的prompt做了多聚一,得到7个方面的review
然后考虑到对于不同的llama版本,其分词器不一样,所以分别通过
- llama2 tokenizer「与之前的情况2类似,毕竟从4方面review到7方面review了,故新Review下,llama2大部分比先前稍长(先前高频位于8k左右,如今高频位于9k左右),但总体来说使用12288的长度也足矣」
- llama3 tokenizer「基于llama3的tokenizer时,如之前说过的,其之所以整体所需的tokens数更少,在于llama3具有更大的词表,比llama2的tokenizer具有更大的文本压缩率,使用12288也足矣」
统计了下数据的最终长度
数据OK之后,便可以用这15K规模的早期paper-7方面review来微调llama2 7B了
最后模型评估时
- 先让gpt4-1106、阿荀7b、情况4的新模型针对测试集中的早期paper推理下(阿荀7b因为微调用的晚期paper-4方面review,故针对早期paper推理出来的还是4方面review,即便推理prompt要求输出7方面review)
- 而对于情况4,其测试集中早期paper所对应review的ground Turth,同上面情况2中测试集晚期paper所对应review的伪ground Turth一样,也是用gpt3.5-1106 针对人工review(这部分人工review本身就是针对早期paper的)做多聚一摘要操作后输出的7方面review
一开始,在“训练集中7方面review的大项描述和微调prompt中大项描述没对齐、且也没针对人工review重新摘要出7方面要点”之前,也发生了类似上面情况2一开始诡异的事情了,即情况4模型的命中数竟还不足情况1的老模型(情况4的模型 根据测试集中早期paper推理出来七方面review,情况1的模型 根据测试集中早期paper推理出来四方面review,然后和人工的七方面review做匹配),只有在命中率方面才能超过情况1的老模型
// 待更
第三部分 数据增强:增强review数据的特异性
什么叫做特异性?比如最左侧的review便是特异性,而最右侧的review则丧失了特异性(对于作者而言,最不希望看到的就是这种放之四海而皆准的review,因为其对论文的改进帮助不大)
那如何解决呢?详见此文:康奈尔大学之论文审稿模型Reviewer2及我司七月对其的实现(含PeerRead)