赞
踩
微调时一般需要准备三个数据集:一个是自我认知数据集(让大模型知道自己是谁),一个是特定任务数据集(微调时需要完成的目标任务),一个是通用任务数据集(保持大模型的通用能力,防止变傻)。前两个一般要自己定义,最后一个用现成的就行。
自定义数据集可采用alpaca和sharegpt格式,这里采用的是alpaca格式:
[
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
"history": [
["第一轮指令(选填)", "第一轮回答(选填)"],
["第二轮指令(选填)", "第二轮回答(选填)"]
]
}
]
由于不需要考虑多轮对话,所以history可以不要,这里采用了两种数据集的组织方式,一种是只有instruction和output,把问题作为instruction,另外一种是把问题作为input,把回答问题这一要求作为instruction。这两种格式分别记为format2
和format3
。
在根据若干个不同的专业领域生成完多个自定义的问答json文件之后,分别生成其format2
和format3
的文件以及test
测试文件,根据以下代码计算其sha1值:
import hashlib def calculate_sha1(file_path): sha1 = hashlib.sha1() try: with open(file_path, 'rb') as file: while True: data = file.read(8192) # Read in chunks to handle large files if not data: break sha1.update(data) return sha1.hexdigest() except FileNotFoundError: return "File not found." # 使用示例 file_path = './data/self_cognition_modified.json' # 替换为您的文件路径 sha1_hash = calculate_sha1(file_path) print("SHA-1 Hash:", sha1_hash)
将这些json文件放入data
文件夹下,同步修改dataset_info.json
文件,输入新增的文件名称和对应的sha1值。
测试的大模型可以使用这些,注意要下载最新版,老版的模型结构不太匹配。
在后台执行CUDA_VISIBLE_DEVICES=0 python src/train_web.py
命令,成功开启网页,设置如下,手动输入模型路径。
训练完成之后的界面,可以查看损失函数
切换到Chat并点击加载模型后,可以进入聊天
把lora的权重合并到原始模型中
虽然在评估时看着分数挺高,但实际使用起来,问题还是挺大的:
ChatGLM之所以一口咬定自己是智谱开发的,主要原因是有个系统提示词,打开src/llmtuner/data/template.py
文件,将以下部分删除
为了让大模型学习更深入,补充通用数据集,增加学习率和epoch,再来一次微调
这一次自我认知倒是调出来了
但是专业问题还是不行
在训练出来的这个lora的基础上,为了进一步增强其专业能力,将数据集中的通用和认知数据集去掉,仅保留目前回答不好的几个专业问答数据集,并减小截断长度和增大batch大小:
可以看到训练曲线又下降了一点
但是此时专业问答能力依然不太行,并且认知也退化了,看来洗脑不能停:
考虑到不同数据集的专业领域不同,模型可能无法一次集中学习,因此我们尝试使用单个数据集进行微调,包括了其format2
和format3
格式,实验结果显示format3更好一些。
format2格式
其下降曲线如下图所示
专业问答能力实现
但通用问答能力被大大削弱
format3格式
其下降曲线如下图所示
专业问答能力在输入指令的情况下实现
直接提问只会瞎说
加入数据集中的指令后正确回答
通用问答能力保持
以下是根据手头几个问答数据集的测试结果做的总结,不一定对,具体问题还需具体分析。
format3
,将指令和输入相分离,指令可以看成是上下文学习,让模型进入相应的任务模式,然后执行特定领域的问答。这就像是一种精准的手术,给大模型做观念植入时不会动大脑的所有神经元,而只是针对一小片区域,并将其与指令触发词相关联,这样就能实现模型通用和专业问答的兼顾。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。