赞
踩
本文基于ADGEN广告文本数据集,采用P-tuningv2技术微调ChatGLM2的简单案例,深入源码剖析微调细节,把握微调核心。
ADGEN(广告数据集):希望通过一段吸引的多样的措辞来描述该产品,吸引用户购买,是一个广告文本。每条数据包括一个产品的广告文本,文件保存的格式是{“content”:“”,“summary”:“”},“content"包含产品描述的属性值对,即希望生成该产品的哪些描述属性,例如如果是上衣,希望可以给定"材质”,“颜色”,“风格”,“图案”等描述生成包括以上属性描述的一段广告文本,“summary”对应特定产品的限定属性生成的广告示例。
该数据集可以通过 Google Drive 或者 Tsinghua Cloud 下载。 解压后有两个json文件,包括训练文件(train.json)和测试文件(test.json)
跟训练相关的参数设置主要在train.sh文件,推理相关的参数在evaluate.sh文件。
训练参数 总结如下,推理部分参数与训练部分大致相同。
注意:
train.sh 和 evaluate.sh 设置的prompt_column 和 response_column变量 最后经过main.py process_function_train函数构成了符合LLM的输入和输出。通过下面红框的这行代码,我们知道了json数据集中键值对是如何产生了LLM所需要的输入和输出。这启发我们如何定制私人数据集相应的LLM输入和输出。
可以看到query:查询问题的文本是由examples[prompt_column][i]得到,answer:回复是由examples[response_column][i]得到。
例如:
1 . 如果是多段输入进行拼接,得到一段输出的情况:
假设 josn数据集是有{“question”,“prompt”,“answer”}三段描述,其中我们希望query是由"question"+“prompt"构成,answer对应"answer”。这样设置的初衷可能是因为不同的question对应了不同的prompt文本。
我们可以首先对:
训练文件:train.sh 对应的部分进行修改:
--prompt_column [["question","prompt"]] \
--response_column answer\
其次对main.py 文件对应的的preprocess_function_train部分:
for i in range(len(examples[prompt_column])):
if examples[prompt_column][i] and examples[response_column][i]:
query = "".join([examples[prompt_column][0][i] for i in range(len(examples[prompt_column][i]))])
answer = examples[response_column][i]
--prompt_column question \
--response_column answer \
其次对main.py 文件对应的的preprocess_function_train部分:
for i in range(len(examples[prompt_column])):
if examples[prompt_column][i] and examples[response_column][i]:
query, answer = examples[prompt_column][i]+"回答时,请加上前缀‘你好’。", examples[response_column][i]
基于以上,有几点认识:
输出打印日志,调用成功。
经过p-tuning v2训练后保存的参数只有PrefixEncoder 部分的参数,所以推理时需要加载原始ChatGLM-6B模型参数以及PrefixEncoder的权重。推理部分修改主要在evaluate.sh文件。
修改地方注意两点
BLEU:
ROUGE:
Q : 什么是n-gram?
BLEU 和ROUGE的计算
a. BLEU指标计算:
b. ROUGE指标计算:
BLEU指标 和 ROUGE指标 取值范围是[0,1],可以在main.py源码中看到,指标计算过程中将数值都乘以100。因此原本取值范围:[0,1],扩大后变成[0,100]。
另外需要注意的:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。