File size: 4,316 Bytes
7d21d1a
 
 
 
b210c21
 
7d21d1a
 
fa30b61
 
7d21d1a
1b65b1b
7d21d1a
0aa505e
aaf96ef
fa30b61
c7a8686
 
 
12eaf08
adf7a55
8139ca6
 
 
 
c7a8686
8139ca6
 
 
a1f4c41
 
62dc09a
a1f4c41
62dc09a
 
063f1ad
62dc09a
 
0084c1f
 
 
 
 
6ff3bdd
9c23b63
6ff3bdd
6a066ec
 
22ebb46
6a066ec
 
 
154c88e
2ee2261
b210c21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
---
license: mit
language:
- zh
datasets:
- Seikaijyu/DCoT
---

### 说明
此微调仅用于测试思维链,即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。

| <div style="text-align: left;">配置项</div> | <div style="text-align: left;">说明</div> |
|---|---|
|[语料(已开源)](https://huggingface.co/datasets/Seikaijyu/DCoT)|使用5904条基于Gemini-1.5-Pro蒸馏出的单轮DCoT语料,经过人工正则批量筛洗,每条语料的长度在2000-4820token之间,大部分回答集中在2000token以上。<br/>此数据集只包含了一些chat提问,如:<br/>“Java是什么?”<br/>“老鼠喜欢吃奶酪吗?”<br/>这样的问题,不包含数学,格式,角色扮演等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的数学能力低下的发生。

如图:
![image/png](https://cdn-uploads.huggingface.co/production/uploads/6417b108b03817ada6444bb8/disoWuBKyvS1HsPfLzxhf.png)

![image/png](https://cdn-uploads.huggingface.co/production/uploads/6417b108b03817ada6444bb8/_slVGcjHz0ZiEMjOJW58y.png)

![image/png](https://cdn-uploads.huggingface.co/production/uploads/6417b108b03817ada6444bb8/zm0LYa5qWMEpUol-hleMs.png)

另外,模型的最终回答似乎并不一定会遵守之前的思考过程,可能会在最终回复时回复完全不同的内容,这点在使用prompt让Gemini-1.5-pro,GPT4o,gemma2-27B,Claude3.5Sonnet等闭源或者开源大模型进行思考时也会出现,个人认为这是因为模型只思考一次,在回答时发现之前的思考只考虑了回答提问的因素,与自身道德,回复逻辑不够相符,所以完全不依赖思考过程,重新回答了一遍,在此情况下,以上思考完全作废。
但是,因为我对CoT进行了调整,主要目的从**分步执行**转变为了**思维发散**,所以我认为可以通过多次发散思维并进行多步CoT得到多个思考过程,让模型进行路由选择可以极大幅度降低此问题的触发概率,而缺点则是会极大程度降低输出速度。

### 运行方式
本地运行:[RWKV-Runner](https://github.com/josStorer/RWKV-Runner)

服务器部署:[ai00](https://github.com/Ai00-X/ai00_server)

### 附展示回答图
![image/png](https://cdn-uploads.huggingface.co/production/uploads/6417b108b03817ada6444bb8/_73GOJ7NJ5fggFaB1ijJe.png)

![image/png](https://cdn-uploads.huggingface.co/production/uploads/6417b108b03817ada6444bb8/86p_1wTLW7XRObpH5puOi.png)