说明
此微调仅用于测试思维链,即CoT(Chain-of-Thought)的效果,而我在理解CoT时认为CoT的重点在于思维发散,所以我对CoT语料做了一些改进,我把这种改进后的CoT称为DCoT(Divergent-Chain-of-Thought)即发散性思维链。
此微调也用于测试这一改进,在进行state tuning微调之前我其实尝试过lora微调,但是指令遵循却不尽人意,语料和模型的契合度太高,初始loss就很低,导致可能模型学不到格式这一点,所以我最后决定使用state tuning这一peft方法进行微调,同时这也是保证RWKV模型对格式进行遵循的最好方法之一,并且它能保证模型不会因为微调而遗忘(因为不会微调模型本身权重)。
PS: state tuning ≈ prompt tuning, prefex tuning
微调配置
微调使用autodl上租赁的单卡A40 48G。
配置项 |
说明 |
---|---|
语料(已开源) | 使用5904条基于Gemini-1.5-Pro蒸馏出的单轮DCoT语料,经过人工正则批量筛洗,每条语料的长度在2000-4820token之间,大部分回答集中在2000token以上。 此数据集只包含了一些chat提问,如: “Java是什么?” “老鼠喜欢吃奶酪吗?” 这样的问题,不包含数学,格式,角色扮演等prompt。 |
peft | state tuning |
quant | 使用int8量化微调 |
micro batch size | 4 |
gradient accumulation | 2,以保证微批次和梯度累计相乘最少达到8,增强模型微调效果 |
loss mask | 启用 |
lr | state tuning微调标准值:1-0.01 |
finetune epoch | 2 |
finished loss | 0.549287 |
结论
微调DCoT(或者CoT)可以用于展示其思考过程以得知模型理解什么,不理解什么,同时,一定程度上可以增强模型能力,但是如果模型本身就没有在预训练中包含的内容,这样的思考只会让你看到奇怪的中间过程
当然,我也测试过热门问题,如:“9.8和9.11哪个大?”这样的问题在RWKV的过程表示中则显得更加奇怪,甚至有时不会回答大或者小。 这基本归咎于RWKV6-v2.1数据集的数学知识很少,除了和训练语料有关系,和词表也有关系,在RWKV6的词表中,从0-99的数字都有一个对应的词元,这显然会让模型分不清0-99之间的区别,以及如“1122”这样的数字和其它如“119”的区别,这样的词表和语料问题共同导致了RWKV6的数学能力低下的发生。
另外,模型的最终回答似乎并不一定会遵守之前的思考过程,可能会在最终回复时回复完全不同的内容,这点在使用prompt让Gemini-1.5-pro,GPT4o,gemma2-27B,Claude3.5Sonnet等闭源或者开源大模型进行思考时也会出现,个人认为这是因为模型只思考一次,在回答时发现之前的思考只考虑了回答提问的因素,与自身道德,回复逻辑不够相符,所以完全不依赖思考过程,重新回答了一遍,在此情况下,以上思考完全作废。 但是,因为我对CoT进行了调整,主要目的从分步执行转变为了思维发散,所以我认为可以通过多次发散思维并进行多步CoT得到多个思考过程,让模型进行路由选择可以极大幅度降低此问题的触发概率,而缺点则是会极大程度降低输出速度。
运行方式
本地运行:RWKV-Runner
服务器部署:ai00