为什么当前的AI在文学创作上表现拉胯?
中规中矩的标题应该叫《用文学和阿毗达磨数据微调中小模型的几点观察》。只是因为我两个多月前写过一篇《为什么当前的AI在阿毗达磨上表现拉胯?》,为了和那个标题匹配,就叫《为什么当前的AI在文学创作上表现拉胯》。今天是2025年5月14日,因此,标题中说的AI也就指o3,GPT-4.5,Gemini 2.5这种。我始终相信未来的AI会在文学创作上全面碾压人类,但不是现在。
我还没想到怎样用好的强化学习方法让模型擅长文学创作,所以这篇只聊微调。我微调的模型包括32B(多种),72B(qwen2.5),235B(qwen3),所以说是中小模型。数据有两块:文学数据、阿毗达磨数据,是分开微调的。
1、阿毗达磨数据的LOSS明显比文学数据LOSS低
72B模型上,验证集的最终LOSS,文学数据在2.7左右,阿毗达磨数据在1.7左右。这有两个原因。主要原因是,阿毗达磨数据中包含了《顺正理论》和《俱舍论》。而《俱舍论》的几乎所有内容,在《顺正理论》中又来了一遍。等于是有重复数据。那么,验证集的部分数据在训练集中存在,LOSS自然会低。次要原因是,文学数据的LOSS本来就高,这一点后面会详细说。
2、阶梯型LOSS对高质量文学数据来说是正常的
一般来说,微调期待看到的LOSS曲线是,训练集LOSS和验证集LOSS都逐渐下降,先是比较快地下降,后面逐渐放缓,到了验证集LOSS很长时间都几乎没下降的时候,就该早停了。
这是一般情况。阿毗达磨数据也符合这个情况。但文学数据完全不是。
文学数据更普遍的情况是:训练集LOSS,在每一个epoch之内,都几乎看不见任何明显的下降趋势(注意:我说的是数据不重叠的情况下),到下一个epoch,有一个断崖式下跌,然后持平,是标标准准的阶梯式。而验证集LOSS,只在第一个epoch的开始有显著的下降,时间很短,通常在一个epoch之内就无法下降了。
这和数据类型有关。文学数据是“反常的数据”。
通常,训练大模型的目标,是让大模型的回答接近标准答案。比如我们问:中国的首都是哪里?大模型回答:北京。这就是一个很好的回答。但是你让大模型搞文学创作,这个回答就彻底失败了。说到这儿,我需要插一句,人们通常泛泛地说“写作能力”,但“文学写作能力”和“公文写作能力”完全是两码事。换句话说,有两种写作能力:一种是有答案有模板有固定套路的写作能力;一种是无答案无模板无固定套路的写作能力。——这么说其实比较粗糙,文学写作也有规律,有标准,但那种规律和标准是潜在的。这里不展开。
总之,你讲一个故事,讲第一句话别人就知道结尾——撅起屁股就知道你要拉什么屎,故事就彻底失败了。但大模型训练的,不就是“撅起屁股知道要拉什么屎”的能力吗?
给一个句子,大模型接下一个句子,它当然倾向给概率高的。你训练数学、训练代码,都是有标准答案,离标准答案越近,模型表现就越好。但如果训练模型的文学写作,给一句话,如果大模型接的是出现概率极高的下一句话,这句话大概率不是文学。
举个例子,给大模型一句,“你讲一个故事,讲第一句话别人就知道结尾”,让模型输出排名前20的后续4-5个token,你在里面绝对找不到“——撅起屁股”。因为大模型通常觉得不应该这么接。但这种接法是文学的。文学的接龙是,你根本没想到会接这么一句话,但接上之后,发现并不突兀,甚至很贴切。
就像鲁迅的“我家后院有两棵树,一颗是枣树,另一棵”,下一个字接“是”,就是高概率的表达,是正常的表达,是大模型学习的目标,“一个是……,另一个是……”,是标准的表达。如果接“也”,就是非标准的表达,非标准是因为它有一种潜在的矛盾,引而不发,声东击西,先误导你,让你往东想,再告诉你答案在西边。“一个是……,另一个也……”,存在潜在的矛盾,因为正常情况下,会直接表述为“两个都是……”。“两个都是”是标准的表达,不是文学的表达。
3、文学数据的LOSS为什么高?
符合文学性的事件是,以你意想不到的方式合理地发生。既要让你意想不到,又要合理。你极其意想不到,又极其合理,这个素材就极其文学。文学素材是生活中的偶然,不是常态。你每天都吃的东西不是文学,一辈子就吃过那么一次的东西是文学;确切说,是文学创作的合适对象。如果你能把天天吃的东西写得跟一辈子就吃过那么一次似的,就表示你的表达很文学。文学的表达也是,让读者极其意想不到,又极其合理。
而大模型的句子接龙,绝对不是把“让读者极其意想不到”作为标准。因此,大模型在文学创作上表现拉胯,就可以理解了。
4、验证集LOSS不下降未必是早停的标准
要看你的任务。如果训练文学创作,验证集LOSS很快就会不再下降,但那时候的学习还远远没有充分。如果你的数据集中有类似的问题,比如:“98随眠是什么?”“98随眠有哪些?”“列举98随眠。”——模型自然会在每个epoch内就出现明显的训练集LOSS下降,因为这些问题指向同一个知识,只是表述的差别。一旦模型学习到知识,它就更容易答对和这个知识相关的其他问题。但是,文学创作主要不是知识而是技能,我们把文学数据按照不重叠的方式切分成若干条,你是不能根据其中一条数据去推知另一条数据的(如果能推知,表示数据质量不行)。这就是为什么高质量的文学数据,在每一个epoch之内,几乎看不到LOSS的显著下降。因为每条数据近乎独立。
SFT训练的首要目的之一是“指令遵循”的能力。哪怕数据内容不相似,形式上也是一致的,所以每个epoch之内的训练集LOSS自然会下降。如果你完全不把每条数据做成格式一致的,它们的内容又彼此独立的话,你也会看到训练集的阶梯型LOSS。
5、训练文学能力最好基于base模型
训练模型的文学能力,最好不要基于开发者SFT过的模型,而是基于base模型。如果基于SFT模型,你得考虑要不要沿用他们的SFT的格式。如果你不沿用的话,需要你数据比较大,算力比较足,一般我们达不到那个条件。如果你沿用,你到底有多少是在继续训练模型的指令遵循、格式对齐,又有多少是在训练你自己想要的能力呢?
Qwen3-235B,对普通人来说丐版的微调就是租2个H20,用QLora,一小时16块,一天三四百块。最烦的是它有思考和非思考两种模式。你如果只是使用,这是个优点。但你如果要微调它来满足你的需要,这就很糟糕了。自己租卡让235B写一篇2000字的文章,要3个小时,也就是50块钱。如果我自己写一篇2000字的文章,也就40分钟。——你当然会考虑用VLLM,但那是不微调的情况下;如果自己QLora微调,就很不方便用VLLM了。不过,可以并发生成,也就是说,虽然让它写一篇2000字的文章要3个小时,让它写10篇也就4个小时。问题在于,你的微调对抗不了开发者SFT的效果,生成10篇里面可能有5篇是思考模式(哪怕你微调后也用它的模版开启了非思考模式)——你等了3个小时,发现它最后给你的不是想要的文章,而是告诉你它打算怎样写这篇文章……当然,我没有那么豪,最多也就让它一次生成五六百字,等上一个小时出头而已。
有一点要提醒的是,并发生成的时候,要用左填充,否则会默认右填充,严重影响生成质量。
6、推理时调高温度、top-p不是解决之道
一种很流行的看法是,让模型生成文学内容的时候应该调高温度、top-p等,有助于生成内容的多样性。但实践下来,我发现那并不是好的办法。还有“思考模式”。Qwen3-235B开思考模式的时候,会拽一大堆词儿,文风和deepseek很像,但那不是文学。文学不是要拽一大堆别人平常很少用的词,文学是你在菜市场听到的词。《红楼梦》的文学主要不是体现在贾宝玉、林黛玉写的诗词上,而是体现在写贾琏、贾蓉、鸳鸯、邢大舅这些人物上。调高温度只能让模型展示拽词儿能力,但拽词儿不是文学。