💛前情提要💛
本文是传知代码平台
中的相关前沿知识与技术的分享~
接下来我们即将进入一个全新的空间,对技术有一个全新的视角~
本文所涉及所有资源均在传知代码平台可获取
以下的内容一定会让你对AI 赋能时代
有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步伐吧~
💡本章重点
- 如何把大模型调教成派大星?
🍞一. 论文概述
-
背景介绍:预训练语言模型(如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_tokens
config.use_cache = False
# 模型每一层都添加虚拟token
model = 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/simple
python 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改口了,知道自己是派大星了!
🫓总结
综上,我们基本了解了“一项全新的技术啦” 🍭 ~~
恭喜你的内功又双叒叕得到了提高!!!
感谢你们的阅读😆
后续还会继续更新💓,欢迎持续关注📌哟~
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨
【传知科技 – 了解更多新知识】