目录
- 主要内容
- 模型图
- 实验结果
- 如何把大模型变成派大星?
- chatglm3-6B
- 数据集准备
- 代码运行
- 微调结果
- 文章声明:非广告,仅个人体验:参考文献:https://www.aspiringcode.com/content?id=17197387451937&uid=291a2ae1546b48a7b50a0f3939d5aa7b
主要内容
-
背景介绍:预训练语言模型(如BERT、RoBERTa等)在NLU任务上表现出色,但传统的微调方法需要更新模型的所有参数,这在训练时消耗大量内存,并且在推理时需要为每个任务保留模型参数的副本。
-
提示调整(Prompt Tuning):与传统的微调相比,提示调整通过只调整连续的提示(prompts),而不是整个模型参数,来减少每个任务的存储和内存使用。但以往的研究表明,对于非大型预训练模型,提示调整的性能并不理想。
-
P-Tuning v2方法:文章提出了P-Tuning v2,这是一种深度提示调整方法,它通过在预训练模型的每一层添加连续提示来提高性能。这种方法在不同规模的模型和NLU任务上都表现出与微调相当的性能,同时只有0.1%-3%的参数需要调整。
-
实验结果:P-Tuning v2在多个模型规模(从300M到10B参数)和各种NLU任务上进行了广泛的实验验证,包括简单的分类任务和难度较高的序列标记任务(如命名实体识别和抽取式问答)。实验结果显示,P-Tuning v2在性能上与微调相当,同时显著减少了训练时间和每个任务的存储成本。
-
优化和实现细节:文章还讨论了一些关键的优化和实现细节,包括重参数化(Reparameterization)、提示长度(Prompt Length)、多任务学习(Multi-task Learning)以及分类头(Classification Head)的选择。
模型图
从图中可以对p-tuing v2有一个非常直观的理解了。
- p-tuing就只是在模型的输入层添加几个虚拟的token,然后就微调这些参数,让模型适应新的任务,但是这样做效果存在一些问题。
- p-tuing v2就是在模型的每一层都添加虚拟token,让可以训练的参数变多了,也能达到比较好的效果。
- p-tuing v2的思路确实非常简单,但是简单有效,目前仍然是模型微调中比较流行的方法之一。
实验结果
可以看一下部分实验结果,FT表示全参数微调,PT表示Pp-tuing,PT-2表示p-tuing v2。
可以看到PT2虽然只有小小的改进,但是对比PT效果的提升是比较明显的。
如何把大模型变成派大星?
接下来将使用p-tuing v2的方法对chatglm3-6b进行微调,让其自身的自我认知发生改变。
chatglm3-6B
ChatGLM3-6B 是基于清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同训练的语言模型开发的,是国内最流行的大模型之一。
我们可以看一下他的自我认知:
数据集准备
train.json的部分展示
[{"conversations": [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "您好,我是派大星,一个由海绵宝宝打造的人工智能助手,请问有什么可以帮助您的吗?"}]},
{"conversations": [{"role": "user", "content": "你好呀,你叫什么名字呀"}, {"role": "assistant", "content": "您好!我是一个人工智能助手,你可以叫我派大星。很高兴见到您,请问有什么事情是我可以为您服务的呢?"}]}]
数据集格式如上,列表中的每个字典就是一段对话,也就是一条数据集。
role表明角色,user就是用户,也就是我们提的问题,assisant就是助手,也就是大模型自己
content就是各自说的话的内容。
dev.json格式也是同上。
核心代码
def load_tokenizer_and_model(model_dir: str,peft_config: Optional[PeftConfig] = None,
) -> tuple[PreTrainedTokenizer, nn.Module]:tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)if peft_config is not None:if peft_config.peft_type.name == "PREFIX_TUNING":config = AutoConfig.from_pretrained(model_dir, trust_remote_code=True)# 设置虚拟token数量config.pre_seq_len = peft_config.num_virtual_tokensconfig.use_cache = False# 模型每一层都添加虚拟tokenmodel = AutoModelForCausalLM.from_pretrained(model_dir,trust_remote_code=True,config=config,)print_model_size(model)return tokenizer, model
加载模型每一层都添加虚拟token,然后微调这些token即可。
代码运行
pip install -r requirements.txt --default-timeout=120 -i https://pypi.tuna.tsinghua.edu.cn/simplepython finetune_hf.py data/ THUDM/chatglm3-6b configs/ptuning_v2.yaml断点微调(从微调好3000步的基础上继续微调)
python finetune_hf.py data/ THUDM/chatglm3-6b configs/ptuning_v2.yaml 3000
微调结果
可以看到,chatglm3-6b改口了,知道自己是派大星了!
参考文献:https://www.aspiringcode.com/content?id=17197387451937&uid=291a2ae1546b48a7b50a0f3939d5aa7b