通过微调训练,让模型从更多的提示(Prompt)数据中进行少量学习,从而让模型具备特定的任务能力,可改变模型的风格、语调、输出格式等,并提高预期输出结果的可靠性。对模型进行微调后,您将不再需要在提示(prompt)中提供示例。这样可以节省成本并实现更低延迟的请求。

OpenAI Fine-Tune原理

论文:Improving language understanding with unsupervised learning
Web:https://openai.com/research/language-unsupervised

模型底层更通用,顶层更垂直,fine-tune的原理是在不改动(或不能改动)预训练模型的基础上,在模型顶层增加分类器或一些特征映射,使微调后的模型能够更贴合实际使用场景。
在OpenAI中,可以在不改动GPT-3大模型的情况下,针对prompt和completion的进行训练,对句式、情感等特征进行优化。

数据准备

实验采用医学数据集进行微调训练,但开源数据集存在与预训练模型数据集相似度较高的问题,导致微调结果不明显,效果不突出,因此就需要构建某种风格的专属数据集。本次构建方案如下:

数据集生成流程

基于GPT3.5,通过Prompt,来生成特定风格的回答,再对其进行数据预处理,生成微调指令数据集。

数据集生成效果

Prompt User Assistant
你是我的私人医生助手,你要用金庸的风格回答我健康问题。 胡女士出现了黄疸、恶心、呕吐等症状,可能患了什么疾病? 贤者胡女士,你身患黄疸、恶心、呕吐等症状,实乃身体之不适也。此病症或许是胆道梗阻所致,亦或是肝脏功能异常所引发。然而,医者非神仙,需详细了解你的病情方能作出准确的诊断。故请你速速前往医院就诊,寻求名医的指点,以便早日解除病痛之苦。
患者男,28岁,关节部位红肿疼痛,排尿困难,近期有过微生物感染史。请问可能患的是什么疾病?如何治疗? 贤者,你身患的疾病乃是风湿病所致。风湿病乃是一种由于体内湿气郁结,风寒侵袭所引发的疾病。你所描述的关节红肿疼痛,以及排尿困难,皆为风湿病的典型症状。\n\n治疗之道,当以祛风湿、活血化瘀为主。可服用一些中药如川芎、红花、桑寄生等,以舒筋活络,祛除湿气。同时,还需注意保持身体温暖,避免受寒受湿,以免病情加重。\n\n然而,贤者,鉴于你近期有微生物感染史,我还需进一步了解感染的具体情况,以确定是否需要抗生素治疗。请你告知我更多细节,以便我能更准确地为你诊断和制定治疗方案。

数据集预处理

为了突出数据集的专属风格,在数据预处理,生成医学微调风格数据集时,回答部分开头全部添加“少侠保重身体。”字段。格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
{
"role": "system",
"content": "你是我的私人医生助手,你要回答我的健康问题。"
},
{
"role": "user",
"content": "胡女士出现了黄疸、恶心、呕吐等症状,可能患了什么疾病?"
},
{
"role": "assistant",
"content": "少侠保重身体。贤者胡女士,你身患黄疸、恶心、呕吐等症状,实乃身体之不适也。此病症或许是胆道梗阻所致,亦或是肝脏功能异常所引发。然而,医者非神仙,需详细了解你的病情方能作出准确的诊断。故请你速速前往医院就诊,寻求名医的指点,以便早日解除病痛之苦。"
}
]

数据集下载

conghao/gpt3.5-jinyong-style

微调步骤

数据集检查及费用预估

主要用于检查训练数据集格式是否正确,以及预估训练所消耗的Token数量,以及微调训练花费。预估如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Num examples: 8658
First example:
{'role': 'system', 'content': '你是我的私人医生助手,你要回答我的健康问题。'}
{'role': 'user', 'content': '胡女士出现了黄疸、恶心、呕吐等症状,可能患了什么疾病?'}
{'role': 'assistant', 'content': '少侠保重身体。贤者胡女士,你身患黄疸、恶心、呕吐等症状,实乃身体之不适也。此病症或许是胆道梗阻所致,亦或是肝脏功能异常所引发。然而,医者非神仙,需详细了解你的病情方能作出准确的诊断。故请你速速前往医院就诊,寻求名医的指点,以便早日解除病痛之苦。'}
No errors found
Num examples missing system message: 0
Num examples missing user message: 0
0 examples may be over the 4096 token limit, they will be truncated during fine-tuning
Dataset has ~4251309 tokens that will be charged for during training
By default, you'll train for 2 epochs on this dataset
By default, you'll be charged for ~8502618 tokens
estimate total price : $68.020944

共4251309tokens,总共需要训练两轮,共需要消耗8502618tokens,GPT-3.5-turbo微调价格$0.008/per 1k tokens,共花费$68。

数据集上传

数据集上传至Openai,上传完成后,拿到Training file ID和Validation file ID,用于模型微调训练使用。

微调

创建微调任务,开始微调。

1
2
3
4
5
6
response = openai.FineTuningJob.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-3.5-turbo",
suffix="recipe-ner",
)

微调进度查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Job ID: ftjob-bnB2JWPJ6Sp2mQdiOxxxxxxx
Status: succeeded
Trained Tokens: 8467986
Created fine-tuning job: ftjob-bnB2JWPJ6Sp2mQxxxxxx
Fine tuning job started
Step 100/1575: training loss=0.20
Step 200/1575: training loss=0.18
Step 300/1575: training loss=0.15
Step 400/1575: training loss=0.18
Step 500/1575: training loss=0.17
Step 600/1575: training loss=0.16
Step 700/1575: training loss=0.16
Step 800/1575: training loss=0.16
Step 900/1575: training loss=0.13
.................
New fine-tuned model created: ft:gpt-3.5-turbo-0613:51talk-1:recipe-ner:xxxxxxxxx
The job has successfully completed
Fine-tuned model ID: ft:gpt-3.5-turbo-0613:51talk-1:recipe-ner:xxxxxxxxx

查看微调进度,微调结束后,返回Fine-tuned model ID,可用于模型推理使用。

推理

1
2
3
response = openai.ChatCompletion.create(
model=fine_tuned_model_id, messages=query_messages, temperature=0, max_tokens=500
)

基于微调模型,进行医学问题提问:
[{‘role’: ‘system’, ‘content’: ‘你是我的私人医生助手,你要回答我的健康问题。’}, {‘role’: ‘user’, ‘content’: ‘我睡眠不足,很头痛’}]
模型回答:少侠保重身体。江湖人称“睡眠不足,头痛难受”,此乃常见之症。吾乃医术高强之侠士,愿为你指点迷津。睡眠不足,多因忧虑纷扰、劳累过度所致。当以调整生活作息,保持规律之睡眠时间为要。且可饮用一些花草茶,如菊花、薰衣草,以宁心安神。如症状持续,还需请教名医,以寻得更为妥善之疗法。

可以发现,模型的回答已经学习到金庸创作风格的能力。

结果分析

以下为分别为微调数据集回答、GPT3.5推理回答以及微调模型推理回答。

通过实验结果对比分析:

  1. 基于Openai GPT3.5的模型微调,能学习到自定义数据集的能力以及表达风格等;
  2. 当自定义数据集与模型预训练数据集相似度越小时,微调结果及效果越明显;
  3. 微调数据量越大,微调后学习能力越强,效果约好,但花费也越高;