手搓阿毗达磨AI失败后,我嫌弃AI太不智能
一个多月前,闲着无聊,我决定自己训练一个小模型,看看能不能让它掌握阿毗达磨。到这两天,基本告一段落。这个工作,失败了。就是没有达成目标。
目标在一开始就确定了,两点:1、比大模型表现得好。这里的大模型是指当前我可用的最好的模型,比如Grok3,Claude 3.7 Sonnet,当然也包括加各种知识库和搜索的R1。——这一点应该说是没有做到。说“应该说”是因为,如果你偷奸耍滑,一定要拿出点“成果”安慰自己或者欺骗别人的话,当然可以截取出若干问答,展示在那上面你训练的小模型表现得更好。因为阿毗达磨的问题上,大模型表现得不行。如果小模型表现得也不行,你不能拿两个不行去比,说这个不行比那个不行要行一点儿。2、识别人类阿毗达磨论文、专著中的错误。——这一点我没有去试,因为我问它的基本问题,它都不能回答得很好,也就没必要去试了。如果你真想对外展示的话,还是可以截取一些对你有利的输出。但是没有意义。这不是销售的工作,不是拉赞助、拉投资、求发表的工作。
不过,这一个多月的尝试并不亏。不仅不亏,反而很值。每天租上几张4090(少则1张,多则6张),跑上或者耗上十几个小时,在经济萧条的时候,是一笔有意义的消费。或者叫学费。它让我对大模型和编程多了一些了解。也让我对AI的态度有了一些改变。
改变就是:我越来越觉得AI挺笨的。不是小模型笨,是Claude 3.7 Sonnet这种都挺笨的。净出一些不靠谱的主意。和它打交道、一起工作,我觉得我比它聪明很多。这种聪明既不是知识层面的,也不是技艺层面的,我后面会展开说。
1、两次扩充词汇表
打算做一个擅长阿毗达磨的AI,首先想到的,自然是让它学会一些阿毗达磨术语。它的词典里要有这个词,它才能更好地知道这些概念是怎么回事。我一个月前的文章《为什么当前的AI在阿毗达磨上表现拉胯?》,就主要说这个事。扩充词汇表,我做了两次,两次的目的完全不一样。
QWQ32B,是我到目前为止,有条件训练的最大模型。我甚至考虑过要不要买个Mac Studio M3 Ultra,犹豫下还是算了吧,不要膨胀。它有151669个ID。其中最后两个,ID151667是<think>,151668是</think>,这显然是千问开发者为了推理添加进去的,放在模型的added_tokens.json里。它的嵌入层和输出层形状是[152064, 5120],如果你要添加的术语比较少,加起来不超过152064,你就不需要改变模型嵌入层和输出层的形状。
阿毗达磨的术语没有那么多。我从《婆沙》《俱舍》《正理》中提取了高频术语(要手动筛掉那些并不是术语的频繁表达,比如“应说”“应作”“余师”等)。这种提取不是一刀切的,2字词你可能要提取出现1150次以上的,3字词就可以放宽到980次,但你还得手动扔掉频率高的非术语,和加上频率没有那么高的部分术语。另外,你还得考虑要不要把简体术语也放进去——训练数据中,高质量的数据都是繁体。当然,你可以繁简转换,但转换会有一些问题,比如“俱舍”,繁体就是“俱舍”,如果你简体转繁体,它会给你转成“俱捨”,这是要不得的;繁体转简体呢?“俱有因”可能会给你转成“具有因”。数据的繁简转换,是要非常警惕的。但你扩充词表的时候,如果条目不算太多,你手动检查就可以了。
我扩充的第一个token就是“靜慮”,是ID151669,简体“静虑”我也给扩充进去了。毕竟,搞一个阿毗达磨的模型,连“静虑”都没在词表里,这说不过去。一通操作下来,得到174个术语。并没有超出原始嵌入层的维度。我就以为这个事挺简单。当时我用的还是3B和7B的模型(QWQ32B还没放出来)。在训练之后推理的时候,就发现了问题:很多不可识别的字符(UNK)。
这是怎么回事呢?阿毗达磨中的生僻字太多了。——这里的“生僻字”,是对模型来说的,对我不生僻。原始模型可能主要是基于BPE或者改进版本分词的,高频的字词会拥有独立的ID,低频的就由多个ID合成。随便举两个例子,“鵰”,“鵲”,这两个字都很常见吧?弯弓射大雕的雕,喜鹊的鹊,只是繁体而已。猜猜每一个字要用多少token表示?在QWQ32B里,是10个:[165, 113, 108, 25, ...]。这有点像我们读马尔克斯的小说,光看到臭长臭长的人名你就懵了。
大模型(准确地说是小模型)当然不会像人那样懵,但它有它的懵法。当“鵰”这个字要用10个ID表示的时候,其中某些和“鵲”是重合的,某些不重合;某些不仅和“鵲”重合还和其他单字重合,这样一来,在充满模型眼中“生僻字”的《婆沙》里,部分高频ID就会变得异常活跃,而它们并不是一个独立的字,也完全不能独立表示一个字;它们在小模型中,会成为输出对象,这样,你就会看到不可识别的字符。
所以,用7B模型训练之后,我就发现,原来,想提高生成质量,不仅要把高频术语作为独立的ID,你还得把超低频的生僻字作为独立的ID。说白了就是,它对你的成事没有帮助,但是坏你的事可太有帮助了。把它们添加到词汇表,不是要成事,而是要防止坏事。毕竟,你的数据集里充满了生僻字,你又不可能用别的数据集去替代。这就是我第二次扩充词汇表的原因。
想想也觉得搞笑,你把高频的和超低频的字词都放进了词汇表,次高频的却不能不排除在外。就像一个企业,可能要给那些大力鼓吹自己的记者和媒体钱,还要给黑自己的记者和媒体钱,但你不可能所有记者和媒体都给钱,那你就要破产了。
这样,第二次扩充词汇表就超出了嵌入层本来的维度[152064, 5120],它的留白不够你用,你要重塑一下嵌入层的形状。但是不要忘了,输出层的形状也得重塑。另外,QWQ32B的嵌入层和输出层的权重不是共享的。你扩展词汇表后,可能需要分别得到它们的初始向量值,这个待会儿再说。
我第二次扩充词汇表,是为了解决UNK的问题。但当我把模型从7B换成32B后,我发现,其实,你可以不做这件事。QWQ32B有64个隐藏层,它的参数量增加带来的能力有望自行减少UNK的问题。也就是说,如果你用3B和7B的话,这一步不得不做,但如果换成32B,省略这一步没啥大问题。
打比方说,一个记者如果靠爆黑料赚钱,他敢去小私企碰瓷,他敢去碰有背景有势力的企业的瓷吗?说不定就把他送进去了。不过,我是先沿用了7B的思维,在32B模型上扩充了词汇表,加了很多生僻字。后来做对照组实现,才发现这一步其实是可以省略的。甚至,我第一步的扩充,也就是那些专业术语的添加,其实省略掉效果也差别不大。就是,你花了那么大精力搞的事情,最后,改进有限。其实,改进有限就已经很难得了,因为,你“改进”之后功能不退化就烧高香了。说“花了大精力”不是扩展词汇表,而是新增词汇ID向量的初始化。
2、新增ID的向量初始化
你往字典里添一个字,不是说放进去就完了,你肯定要标上它的读音,说明它的含义。ID的向量值,就是这个作用。我记得在一开始做这件事情的时候,就有读者在评论区问:你怎么解决新增词汇向量初始化的问题?我当时告诉他,我用的AI介绍的方法,取对应简体词汇的向量,或者加权平均。
你无论是问Claude还是Grok,它们都会优先推荐这种方法,所以我也就首先尝试了这种方法。效果很差。其实,如果你去问QWQ32B这个问题:<think>中间的单词是什么?它会不知道你在问什么。它并不知道<think>是个什么东西,所以你问:<think>是什么意思?也得不到理想的回答。如果你去问Deepseek R1:<think>中间的单词是什么?它会有点小懵,它会思考:中间的单词是什么?什么中间?但R1毕竟是大模型,参数量大了20倍,它的确知道<think>是什么东西。但QWQ32B不知道。
你如果问这种问题:“楚”的下半部分加上“虫”是个什么字?我们小学生都知道是“蛋”,R1不会每一次都知道,你问3次,它可能就有1次搞不清楚。更别说QWQ32B了。这和strawberry里有几个r是类似的问题。大模型不是像人类一样通过视觉看见了<think>和“蛋”。参数量大的模型,是通过更多的权重把<think>和组成它的每一部分关联起来,但参数量小的模型,没有能力或者开发者没有特意去赋予它这种关联,它也就没有这个“知识”。
这就是为什么我一开始要关注新增词汇向量初始化的问题。假设“現在”不是已有的词汇,那很好办,“现在”是,你把“现在”的向量直接复制给“現在”就好了,这会有一些小偏差:它不知道二者是简体和繁体的区别,但这无伤大雅。因为我们的目的是让它理解《婆沙》的上下文而已。所以,如果一个词汇的简体版已经是独立的ID,这就是最容易解决的。你只需要加载模型的第一个分片就行了(嵌入层在第一个分片,输出层在第14个),找出对应ID,复制覆盖,万事大吉。
问题在于,这种只是极小一部分。有些字,你用OpenCC简繁转换,转了之后它纹丝不动,比如“鈔”,非常简单的一个字,钞票的钞嘛,但是,QWQ32B不认识,OpenCC也不处理。你当然可以手动把“钞”的向量复制给“鈔”,问题是这样的字不是一个两个,而是数百个,不说别的,阿毗达磨的“毘”,模型就不认识。你去《婆沙》里,是找不到“毗”这个字的,只有“毘”。但是OpenCC不能识别“毘”就是“毗”的异体字。
其实,解决这种问题有个最简单的办法,就是直接训练完事。只要模型够大,数据够多,算力够足,一切都不是问题。所谓“大力出奇迹”。你随便给它一个什么初始值,然后让它跑去吧。——但我在一开始,并没有那样,一方面是,4卡的机器没有那么好租,必须吃早饭前就抢,我想一共就那么909个ID,总想在单卡上解决32B模型嵌入层新增向量的问题,这个约束让我耗费了不少精力;另一方面,我总想试试,如果我给大部分新增ID一个更好的初始值,它后续训练优化的结果会不会也更好呢?就这一件事,让我折腾了一个多星期。
接着说,类似“鈔”这种ID,你怎么给它赋初始值呢?如果只是解决这一类,也简单。问题是,新增ID是“词上一百,形形色色shai”,除了训练,“靜慮”的赋值不能和“鈔”用同样的方式解决。所以我肯定先想的是通过单卡训练。QWQ32B是62G,16位精度,单卡4090是24G,8位量化你都加载不了,4位量化推理是没问题的,但是训练,就不行了。——就在这上面,Claude给我挖了很多大坑。
我告诉它,我的约束是单卡,有没有办法?Claude说,如果你用单卡,你的办法有1、2、3、4、5,这是办法的种类,不是步骤。也就是,有多种办法在单卡上解决这个问题。其中一种办法是,你整个小模型出来,在小模型上练,练完拷贝给大模型,不就行了吗?我一想:妙啊。就这么着!
那么,从哪里弄小模型呢?我问Claude,用qwen的3B模型行不行,Claude说,非常好。我就高高兴兴拿出来之前扔掉的3B模型,扩展它的嵌入层ID,让它和我扩展过的32B一致,也就是152578个词汇,并且把我的32B的词汇表复制给它。做完之后我才意识到,3B模型并不是嵌入层每个ID都有5120个维度,我就让Claude帮我把3B模型嵌入层和输出层形状改成[152578, 5120],这样的话,隐藏层当然也要相应地改。Claude于是跳出来说,你都改了,就让3B模型丧失了已有的知识。我说,你怎么不早说呢?不是你一开始说非常好的吗?实际上,你那样一通操作之后,3B模型也不是3B了。是不是3B无所谓,主要是,早知道这样,我还要3B干嘛呢?
我就问Claude,其实咱们想要的小模型和3B没关系,既然没关系,我能不能直接从32B模型中,提取出一个小模型出来呢?Claude说,你提醒了我!太好了,这是非常好的办法,不用担心维度不匹配的问题了。我就让Claude帮我算了算,单卡大约能支持几层。32B本身有64个隐藏层,我想,阿毗达磨里是三界九地,我们就提取9层吧。
Claude给我写了个提取9层的代码,除了嵌入层、输出层之外,提取了transformer层的前9层。组成了一个小模型。嵌入层的形状当然是和32B一模一样的。提取之后,我要先推理(inference,不是reasoning)再训练,先看看模型能不能用。结果发现不能用。给它prompt,确实有输出,但输出无比垃圾。——其实也在意料之中。这就是标标准准的坑。就是Claude欺负我不会。我读书少,它骗我。
当然它也不是有意骗我。所以我前一阵发朋友圈说,越来越嫌AI不够智能。因为智能的AI不是你想干嘛,它就能给你方案一二三四五,帮你干嘛,而是明智地告诉你,干不了,别想了。以及告诉你具体的一二三四五,为什么干不了。绝对不是列出一二三四五个坑,让你一个一个往里面跳。我之前开写作班,招生时候讲,这个写作班,对大部分学员来说,都没法让你写出好文章,不过,可能会让你知道自己为什么写不出好文章。写作水平的提升,不是体现在你能写出好文章,而是你知道什么文章值得写,什么文章不值得写,什么内容能写好,什么内容神仙也写不好。所以,智能AI应该告诉我的是,有些想法,神仙也干不了,你趁早放弃,而不是:这个想法太好了!关键是,那些想法本身就是AI告诉我的。
发现提取前9层不行之后,Claude又给我建议:你可以提取中间的9层,或者后面的9层,甚至保留每一层,但改变中间层的维度;我还真尝试过提取不相连的9层和8层(8是因为能被64整除);也尝试过按transformer块提取,以及保持隐藏层数的前提下缩小维度。有结果,但是,结果不可用。当我越来越明白结果不可用的时候,再去问Claude或者Grok,它们仍然说,很好,可行。我把结果甩在两个AI脸上痛斥它们根本不可行的时候,Claude道歉了,Grok还嘴硬,说“技术上可行”。我很想骂一句:技术上吃屎都可行,你吃吗?
我还按照它们的建议,尝试过只加载嵌入层,或者嵌入层和输出层。如果你只加载这两层的话,别说4位量化,单卡直接上16位的模型都没问题。可以跑。问题还是一样,跑出来的结果不可用。每当我跑出来结果,把向量复制给我新增的909个ID,问它:请解释【靜慮】的含义。它总是告诉我:静,是安静的意思。诸如此类的。要不就是跑坏了,连“安静”的意思都出不来。
因为我第一次赋值的时候,是取了第一个简体字“静”的值赋给“静虑”和“靜慮”;我还试过AI推荐的各种平均:算术平均、加权平均,统统无比垃圾。以至于到后来,Claude再给我推荐加权的时候,我就说“加权是垃圾,你记住,不要再跟我提加权”,等到紧跟着的下一次回复(没有新开对话框,也没有很长的上下文),它又开始建议加权。我就知道,它真是不聪明啊。——要是上下文太长它忘了,可以理解,我的记忆力也不好;但是,这体现的就是AI的固有思维,它倾向说什么就会经常说什么,它更遵循它的内在倾向而不是你的指令。
后来,企图单卡上训练嵌入层是实在没有办法——不是跑不通,可以跑通,但是结果不可用。我就又想了个刁钻的点子。这不是AI想的,是我想的:我告诉Grok,“婬”的意思是“淫”,“煖”的意思是“暖”,“毘”的意思是“毗”;我让它写个程序把我909个ID中剩下354未处理ID中的单字挑出来,列成行,把那些发给Grok,让它仿照我的例子,手动写上每个字对应的简单字。再用代码查找那些简单字的向量,复制过去。就用这种办法,把909个ID分批处理,缩小到354,又缩小到151。而“静虑”“阿罗汉”等,仍然在这151之中。
就是说,你用这种办法,可以解决绝大部分的词汇,但你解决不了所有的词汇。我还想过千奇百怪的方法,去比较“第”“一”“第一”“书”“记”“书记”“第一书记”“第一名”等词汇哪些拥有独立的ID,如果拥有独立的ID,那些向量之间有什么特征或者联系,得出的结论就是“加权是垃圾”。不管你用什么公式,那都是看似可行其实根本不可行的办法,它的效果和随机赋值没有区别。如果你后续要训练嵌入层的话,你训练就好了,前面这些,是应该放任它的。所以,我最终去抢4卡去了。
3、AI的笨拙和日常生活中的解题
不得不说,Claude 3.7 Sonnet写代码是有一万个槽点的。说强,它的能力也很强;说弱,也很弱。
它最差劲的地方在于没有自知之明。它不知道自己能胜任什么、不能胜任什么。你告诉它你要做一件事情,分三步,现在需要它提供第一步的代码。它会把第二步甚至第三步的代码都给你写进去——多贴心!你想到的、没想到的,它都帮你想到了!
问题在于什么?它第一步的代码是错的。而且永远错。在它永远都写不正确第一步的代码的时候,你每次问它原因,它都能振振有词地告诉你原因何在,而且表现得十分清楚解决的方法。你让它重写,它就不仅重写第一步所需要的,还必然把第二步第三步所需要的附在里面,这就导致经常一条回复写不完。等写完了,你发现第一步就错了。而且是几个错误循环错,A错,改了之后B错,然后是CDEFG错,G的问题改了,A的问题又出现了。当你同时告诉它这些约束条件的时候,它必然会放弃你的约束,给一个你根本不需要的东西。
再比如,你已经非常清楚地告诉它嵌入层的名称,它还是会在代码中不厌其烦地去查找各种名称的嵌入层。导致本身2行就能写清楚的代码,它会写上20行。这叫“防御性编程”。我想告诉它,我不要“防御性编程”,我要“进攻性编程”!你一个漏洞百出的代码,还防御什么?你全身都是练门!
我还发现Claude不聪明(我这么说表示它相比别的AI已经算聪明了,否则不会提它),这种不聪明不是缺乏知识或者能力,而是缺乏技巧。我在骂Claude的过程中,有时候非常生气,血压都高了(这可能正是它聪明的体现吧),但回过头想,我还是比它要聪明一些。
聪明在很多时候,不是体现在解方程和数学题的能力上。我上学时候数学很好,本科成绩最高的是概率论与数理统计,96分,期末应该是满分,可能因为缺勤或者平均了期中成绩扣了4分。但一个暑假过后,那些我就全忘了。我现在甚至连韦达定理都不太能默写了。有次我看deepseek解高次方程,我觉得挺强的。但日常生活中,我没有可以用到解高次方程或者微积分的时候。我从北京开车回河南,我的车是电动车,我会在路上计算到哪里充电合适,你需要知道表显里程和实际里程差别大了,跑市区和跑高速差别大了,夏天和冬天也有差别,有些显示有充电桩的服务区可能充电桩是坏的,或者被人占了,你要考虑这些情况,种种约束条件(不是固定的约束条件而是按照概率分布的可能的约束条件),求一个最优解:怎样回家最快?怎样最省事?
我妈经常说,“不会多充点儿吗?”这就是一个很随意的没有经过思考的回答。实际上,电动车跑高速不应该“多充点儿电”,而应该“多充几次电,每次少充点”。因为充电最快的是20%-80%的一截,如果已经90%了你还充,就是浪费时间。你在跑的时候也不需要考虑跑到时速130会不会耗电量大幅增加,只需要考虑电量够你跑到下一个充电桩就可以了。等你到下一个可用的充电桩时,表显剩200公里、100公里、50公里、10公里,完全没有差别——充电桩不可用那就有差别了,前几年京港澳高速上经常有这事。但是,10公里和-1公里,差别相当大,是要不要拖车的差别。——这就是日常生活中的数学。
你很难向AI准确地描述这类数学问题,也很难有精确的答案。但如果是10个人开着同样续航能力的电车,同一天从北京跑上海,谁先跑到就能看出来谁这个问题解决得好。这不是时速多少的问题,而是如何规划充电的问题。类似的问题还有,我现在住在北京南郊,去大兴机场的飞机经常从我头顶飞过,你经常能很清晰地看见飞机的细节,我拍个照片发给各种AI,让它们根据照片上的信息估算飞机当时的离地高度。它们估算得都非常离谱。——这类问题是数学问题,但又不仅仅是数学问题。如何思考和解答这类问题,我认为是可以体现一个人或者AI的聪明程度的。因为要做一件很具体的事情,其中穿插着各种细节,我就经常觉得Claude不够聪明。
比如,不OOM(显存不足)的最大token限制是500,那你怎么给txt文件分块?块当然是越大越好,便于模型理解上下文。但你如果固定500token,就把句子截断了。——AI给的方法比这还次,它甚至不是固定token,而是按字符去切割。按字符当然不如按token,尤其是对《婆沙》这种充满术语和生僻字的数据来说。所以我告诉它,先整个用分词器转换成token,按500初步划分。你不适合把一句话砍断,最好是按段落截,所以你要从第500个token往前,找第一处换行符。但这还有个问题,《婆沙》里面经常会有一段5000字以上的(是5000)。你可能找不到,或者找到了,但是一条数据被切分得太短了,所以我告诉它,如果向前找了100个token都没有换行符,就放弃找换行符,重新从第500token处向前找第一个句号。
这个方案是很好理解的。我清晰地表达给它(并不像现在面向人类写文章一样),但是它两三次给我一种极其笨拙的操作代码,比如它从前往后找换行符,又比如它去检查每个块是不是大于100token,经常让我觉得:这家伙怎么这么笨。
解奥数题的聪明当然是聪明,但不是唯一的聪明。日常生活中的很多事情和技巧,和解奥数题无关。它甚至体现在一个人是不是走到哪都要租充电宝上。为什么同样的手机,大家都在天天刷手机,而你一出门手机就没电?
4、4张4090上的训练
话说回来。我租了4卡。Claude给我的代码反反复复不能用,让它重写几十次,有些问题是打圈犯。我也意识到,可能真的超出它的能力了。
后来没办法,我把代码发给Grok,让它给我逐行解释。Grok的风格是比较啰嗦的,所以像这种任务,更应该让Grok来。它一解释我才发现,Claude给的代码里充斥着错误,有些是很简单的错误。我只是因为不懂编程语言,所以一开始并不知道如何解决。想想也正常,我看阿毗达磨的论文专著,里面也经常充斥着错误,但不管是作者还是编辑或审稿人,大部分都没有发现,读者还往往捧着充斥着错误的东西去研读。这也是我尝试搞阿毗达磨AI的初衷,不过我搞得失败,说初衷也没有意义。
我在4张卡上,先是训练了嵌入层和输出层,后来我想,应该把transformer也用lora来一起微调,不要分开(全量微调4卡当然不够),另外,归一化层也放进来了。这样做的结果就是,我发现之前想方设法去给新增词汇的向量初始化,是必要不大的;不仅这必要不大,连两次扩展词汇表的必要都不是很大——不只是加入生僻字避免UNK必要不大(32B模型随着参数量的增加能自然减少那种现象),连加入术语让模型更熟悉阿毗达磨词汇也必要不大——加入之后,它能理解那些词的基本含义,但不能识别概念之间的关系。也就是说,第二次扩展词汇表的不必要,是因为参数量变大了;而第一次扩展词汇表的不必要,是因为参数量还不够大。
我在这种表现不够好的模型上,又尝试强化学习,结果非常失败。经过阿毗达磨熏陶过的模型,泛化能力严重受损。导致对简单指令的理解比微调前的要差。说白了就是,上学上傻了。没上学的时候还会买菜,上完学,连去菜市场买菜都买不好了。没读博士,生活还能自理;读完博士,生活不能自理了。
从这种失败中,我也得到一点启发,或者警示。针对这件事情说就是:想让32B的模型精通阿毗达磨,可能是一件相当难的事情,或者再粗暴武断点:不太可能。
无所适从之际,我又回头问R1、Claude、Grok等模型,一些最早问过的阿毗达磨基础问题,包括用ima知识库、秘塔搜索等。它们依然都不能十分准确地回答“98随眠是什么”这类基础问题。或许我应该对学者把这种问题还写到论文和专著里多一点理解。Claude大体上能把答案抄对,但是它不理解。
单看QWQ32B的跑分,有人会觉得它某些方面能力和R1接近,但这“某些方面”里面就大有嚼头。某些方面,鹦鹉的英语都可以比很多中国人地道。但那有什么用呢?如果在R1和QWQ32B里面选,当然是闭眼选R1。只是,你要调整权重,R1这种级别的我搞不起。量化推理的话还能花7万多走教育补贴买个Mac Studio。但我想要的不是推理。我也不是不在乎大几万块钱。总之,QWQ32B可能是我目前有条件尝试的最好的模型。只能等以后再看了。
另一点额外的警示是,泛化能力的损害意味着什么?当你追求LOSS值降低等指标时,你其实是在不知不觉地伤害模型其他方面的能力——“其他方面”这四个字都应该去掉。你换一个标准去问,发现模型变菜了。那你最好不要说,模型针对你的目标变强了,而牺牲了其他能力;你应该直接说,模型变菜了,学废了。
我们每个人的脑容量就那么大,学不来太多知识和技能的。你每了解一点东西,就要抹去你曾经了解的某些东西。对成年人尤其如此。所以,一个人的能力能不退化,就极其难得了。《论语》里面说,“虽曰未学,吾必谓之学矣”,这就是让人保持良好的泛化能力,“君子不器”也是这样——别上学上废了。至于上学会不会上废,要看在哪个阶段,上学不行的人一般是上不废的,追求60分不会让一个人废掉,但是,追求100分会让很多人废掉。如果你通过很简单很基本的手段,让大模型掌握一种能力,它掌握了,那就是真掌握了,它不会因此丧失其他能力。但如果你通过各种刁钻古怪的手段,强行上各种措施,让大模型在某个方面表现得似乎好,那大模型就废了。
所以,不应该让小孩追求100分,除非这100分是小孩轻轻松松拿到的。但凡他拿到这100分很费劲,他失去的东西就比100分昂贵得多。有多少家长不知道这道理。当你只盯着指标,你就成了瞎子。