深度学习系列53:大模型微调概述

参考系列文章:https://zhuanlan.zhihu.com/p/635152813
github链接:https://github.com/liguodongiot/llm-action

1 训练范式

在这里插入图片描述
下面这种instructive learning,在模型参数达到80亿后,会发生质的提升:
在这里插入图片描述
类似的还有手写prompt
在这里插入图片描述
然后可以推广到绿色的新任务上:
在这里插入图片描述

2 全量微调:fine-tuning

fine-tuning指的是预训练模型下游接新的MLP,然后全量参数微调。
例如2018年谷歌发布的BERT,只需要抛弃BERT原来的MLM,接上新的全连接层进行训练即可:
在这里插入图片描述
举个例子,使用如下数据:

from datasets import load_dataset
dataset = load_dataset("yelp_review_full")
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True)tokenized_datasets = dataset.map(tokenize_function, batched=True)
small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

加载训练参数类TrainingArguments,指定num_labels(自动添加MLP),并且要添加metrics

from transformers import TrainingArguments, Trainer
import numpy as np
from datasets import load_metric
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=5)
training_args = TrainingArguments(output_dir="test_trainer")
metric = load_metric("accuracy")
def compute_metrics(eval_pred):logits, labels = eval_predpredictions = np.argmax(logits, axis=-1)return metric.compute(predictions=predictions, references=labels)trainer = Trainer(model=model,args=training_args,train_dataset=small_train_dataset,eval_dataset=small_eval_dataset,compute_metrics=compute_metrics,
)trainer.train()

对于GPT,也是在后面直接加一个MLP进行微调:
在这里插入图片描述

3 改变结构:prompt-learning

3.1 基本概念

现在比较流行的方法是prompt-learning,通过seq2seq的语言预测模型去完成任务,这样新的任务和原先Bert的任务一致(预测mask位置的词表分布 ),因此可以很有效的进行tuning。其范式如下,需要设计输入模版标签映射
在这里插入图片描述
我们使用Langchain等工具时,会用到template,用来制作prompt:
在这里插入图片描述
选模型的话,auto-regressive适用于mask在最后,而masked LM可以在任意位置设置mask。Encoder-decoder则两者皆可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

另外还要关注预训练模型的语料,比如Ernie等知识图谱类的预训练模型适用于做实体抽取等任务,使用金融/医学材料训练的大模型,更适用于各自相关领域的下游任务。

多模态也可以使用prompt-learning。例如图像编码后,可以跟文字使用同样的方式进行prompt learning。
在这里插入图片描述

3.2 zero-shot/few-shot

不用训练,直接给出任务描述(并且可以添加一些样例),然后使用prompt直接给出结果。
这种方式为何有效,至今仍是个迷。
在这里插入图片描述

3.3 template构造

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

3.4 Verbalizer构造

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 OpenPrompt工具包


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 部分微调:delta-tuning

4.1 介绍

固定大部分参数,仅训练少量的参数来驱动大模型。下图是delta-tuning和fine-tuning的区别。
左边的fine-tuning中,每个任务都全量微调,得到一个新的模型,如果有100个任务,那么最终会给出100个数十G的大模型;但是在delta-tuning中,PLM参数大部分是固定的,每个任务只需要训练和记录有修改部分的参数(delta-object)即可。
在这里插入图片描述

在这里插入图片描述
delta-tuning分为以下三大类:增加额外参数(A)、选取一部分参数更新(S)、引入重参数化(R)。而在增加额外参数这类方法中,又主要分为类适配器(Adapter-like)方法和软提示(Soft prompts)两个小类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 OpenDelta工具包

在这里插入图片描述
可以使用枚举和正则表达式等方式指定要修改哪些模块:

使用时,只需要线attach,然后再detach即可。
在这里插入图片描述

5. Addition-based

5.1 Adapter Tuning:Transfomer中添加adapter模块

Adapter Tuning(论文:Parameter-Efficient Transfer Learning for NLP,2019 ),该方法设计了Adapter结构,并将其嵌入Transformer的结构里面,针对每一个Transformer层,增加了两个Adapter结构(分别是多头注意力的投影之后和第二个feed-forward层之后,Adapter本质就是一个双层MLP),在训练时,固定住原来预训练模型的参数不变,只对新增的 Adapter 结构和 Layer Norm 层进行微调,从而保证了训练的高效性。每当出现新的下游任务,通过添加Adapter模块来产生一个易于扩展的下游模型,从而避免全量微调与灾难性遗忘的问题。
在这里插入图片描述

下图左面是Adapter在transformer中的位置,右边的图是adapter内部的结构。Adapter通过引入0.5%~5%的模型参数可以达到不落后全量微调模型1%的性能:
在这里插入图片描述
还有一种结构,把adapter从主干网络降维后迁移到分支网络上,这样可以显著降低计算量:
在这里插入图片描述

5.2 Model/Prompt Tuning:添加前缀提示词

Prompt Tuning(论文:The Power of Scale for Parameter-Efficient Prompt Tuning),给每个任务定义了自己的Prompt,然后拼接到数据上作为输入,但只在输入层加入prompt tokens。
训练时冻结住pre-trained model,只训练prompt。Prompt token 的长度在20左右时的表现已经不错(超过20之后,提升Prompt token长度,对模型的性能提升不明显了)
在这里插入图片描述

在这里插入图片描述
下图表明,参数量增加时,prompt tuning接近model tuning的结果。
在这里插入图片描述

5.3 Prefix Tuning:prefix前添加MLP

Prefix Tuning(论文:Prefix-Tuning: Optimizing Continuous Prompts for Generation,2021)和prompt有些关系。在每一层的Prefix层前面加了MLP结构,训练完成后,只保留Prefix的参数。通过消融实验证实,只调整embedding层(也就是prompt-tuning)的表现力不够,将导致性能显著下降,因此,在每层都加了prompt的参数
在这里插入图片描述
在上图的例子中展示了不同模型添加前缀的方法:

  • 针对自回归架构模型:在句子前面添加前缀,得到 z = [PREFIX; x; y],合适的上文能够在固定 LM 的情况下去引导生成下文(比如:GPT3的上下文学习)。
  • 针对编码器-解码器架构模型:Encoder和Decoder都增加了前缀,得到 z = [PREFIX; x; PREFIX0; y]。Encoder端增加前缀是为了引导输入部分的编码,Decoder 端增加前缀是为了引导后续token的生成。

此外,还有实验对比位置对于生成效果的影响,Prefix-tuning要略优于Infix-tuning。其中,Prefix-tuning形式为 [PREFIX; x; y],Infix-tuning形式为 [x; INFIX; y]。

5.4 P-Tuning:添加prompt embedding+MLP层

P-Tuning(论文:GPT Understands, Too),该方法将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。P-Tuning对GPT的效果比较好。
对比prompt tuning,prompt和输入共享embedding层。
在这里插入图片描述

5.5 P-TuningV2:每一层都添加prompt

P-Tuning v2(论文: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks),该方法在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层。
P-Tuning v2可以看作是prefix tuning的升级,和prefix tuning的区别在于P-Tuning V2每一层的prompt是独立的,并不是由上一层计算得来。
在这里插入图片描述

6. Specification-based

6.1 BitFit:更新bias参数

BitFit(论文:BitFit: Simple Parameter-efficient Fine-tuning or Transformer-based Masked Language-models,2021)是一种稀疏的微调方法,它训练时只更新bias的参数或者部分bias参数。涉及到的bias参数有attention模块中计算query,key,value跟合并多个attention结果时涉及到的bias,MLP层中的bias,Layernormalization层的bias参数。
在这里插入图片描述

在Bert-Base/Bert-Large这种模型里,bias参数仅占模型全部参数量的0.08%~0.09%。但是通过在Bert-Large模型上基于GLUE数据集进行了 BitFit、Adapter和Diff-Pruning的效果对比发现,BitFit在参数量远小于Adapter、Diff-Pruning的情况下,效果与Adapter、Diff-Pruning想当,甚至在某些任务上略优于Adapter、Diff-Pruning。
另外,通过对比BitFit训练前后的参数,发现很多bias参数并没有太多变化(例如:跟计算key所涉及到的bias参数)。发现计算query和将特征维度从N放大到4N的FFN层(intermediate)的bias参数变化最为明显,只更新这两类bias参数也能达到不错的效果。

7. Reparameterization-based

7.1 Intrinsic prompt tuning

下图展示了如何从fine-tuning一步步转移到Intrinsic prompt tuning
在这里插入图片描述

7.2 LoRA LoRA

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发系列教程(二十三)--List 列表操作(2)

列表样式 1、设置内容间距 在列表项之间添加间距,可以使用space参数,主轴方向 List({ space: 10 }) { … } 2、添加分隔线 分隔线用来将界面元素隔开,使单个元素更加容易识别。 startMargin和endMargin属性分别用于设置分隔线距离列表侧…

2024HVV | 12款开源渗透测试工具(非常详细)零基础入门到精通,收藏这一篇就够了

回顾过去,黑客入侵异常困难,需要大量手动操作。然而,如今,一套自动化测试工具让渗透测试人员变身“半机械人”,能够比以往任何时候都更轻松地完成更多测试。以下12款开源渗透测试工具,可以帮助渗透测试人员…

微信小程序: 获取accessToken,手机号, 小程序二维码,openId与unionId 公共配置类(核心篇)

全文目录,一步到位 1.前言简介1.1 专栏传送门 2. 微信小程序公用功能2.1 配置准备工作2.1.1 配置文件准备(单体放yml中 微服务放配置中心)2.1.2 获取配置文件中的小程序配置2.1.3 设置redis配置 2.2 创建不同功能工具类2.2.1 创建微信服务工具类WechatServiceUtils2.2.2 创建Re…

Java 基于 SpringBoot+Vue 的酒店管理系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

每日五道java面试题之java基础篇(十)

目录: 第一题 JVM有哪些垃圾回收器?第二题 垃圾回收分为哪些阶段?第三题 线程的⽣命周期?线程有⼏种状态?第四题.ThreadLocal的底层原理第五题.并发、并⾏、串⾏之间的区别 第一题 JVM有哪些垃圾回收器? ● 新⽣代收集…

YOLOv8制作自定义数据集并训练

YOLOv8制作自定义数据集并训练 前言一、制作自定义数据集1、建立相应文件夹2、下载图片3、为图片打标签(1)安装labelimg(2)打开labelimg(3)标记图片 二、按比例移动自定义数据集中的内容三、建立数据集测试…

2024年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年危险化学品经营单位主要负责人证模拟考试题库及危险化学品经营单位主要负责人理论考试试题是由安全生产模拟考试一点通提供,危险化学品经营单位主要负责人证模拟考试题库是根据危险化学品经营单位主…

机器学习入门--LSTM原理与实践

LSTM模型 长短期记忆网络(Long Short-Term Memory,LSTM)是一种常用的循环神经网络(RNN)变体,特别擅长处理长序列数据和捕捉长期依赖关系。本文将介绍LSTM模型的数学原理、代码实现和实验结果,并…

OpenCV库及在ROS中使用

OpenCV库及在ROS中使用 依赖 cv_bridge image_transport roscpp rospy sensor_msgs std_msgsCMakeLists.txt添加 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) target_link_libraries(pub_img_topic ${catkin_LIBRARIES} ${Opencv_LIBS}) C …

基于springboot大学生租房系统源码和论文

伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于各大行业,大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本,使整个大学生租房的发展和服务水平有显著提升。 本论文主要面…

Github Copilot是什么?Ai高效编程!一键远程授权…

GitHub Copilot是一款Ai编程插件,由OpenAi和Github联合推出,目前支持主流的IDE编辑器安装使用,包括JetBrains IDEs、VSCode、Visual Studio、Neovim等。 官方地址:https://github.com/features/copilot 官方文档:http…

VBA即用型代码手册之取消隐藏工作表及删除工作表

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

【maya 入门笔记】基本视图和拓扑

1. 界面布局 先看基本窗口布局,基本窗口情况如下: 就基本窗口布局的情况来看,某种意义上跟blender更像一点(与3ds max相比)。 那么有朋友就说了,玛格基,那blender最下面的时间轴哪里去了&…

使用PaddleNLP UIE模型提取上市公司PDF公告关键信息

项目地址:使用PaddleNLP UIE模型抽取PDF版上市公司公告 - 飞桨AI Studio星河社区 (baidu.com) 背景介绍 本项目将演示如何通过PDFPlumber库和PaddleNLP UIE模型,抽取公告中的相关信息。本次任务的PDF内容是破产清算的相关公告,目标是获取受理…

pubg开启之路

概要: pubg中文名绝地求生,一款免费游戏,本篇主要讲述如何在电脑上开始pubg 要想下载并开始玩pubg有两个方法(具体就是两个软件),一个是epic games,另一个是steam 一、加速器是必要的吗? 1、不使用加速…

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇【第81篇—Pandas数据库】

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇 Pandas是Python中一流的数据处理库,而数据库则是数据存储和管理的核心。将两者结合使用,可以方便地实现数据的导入、导出和分析。本文将深入探讨Pandas中用于与数据库交互的两个关键方…

代码随想录 Leetcode135. 分发糖果

题目&#xff1a; 代码(首刷看解析 2024年2月15日&#xff09;&#xff1a; class Solution { public:int candy(vector<int>& ratings) {vector<int> left(ratings.size(), 1);vector<int> right(ratings.size(), 1);for (int i 1; i < ratings.si…

半导体物理基础-笔记

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 半导体物理要解决的四个问题 载流子在哪里&#xff1b;如何获得足够多的载流子&#xff1b;载流子如何运动…

html从零开始8:css3新特性、动画、媒体查询、雪碧图、字体图标【搬代码】

css3新特性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

linux kernel 内存踩踏之KASAN_SW_TAGS(二)

一、背景 linux kernel 内存踩踏之KASAN&#xff08;一&#xff09;_kasan版本跟hasan版本区别-CSDN博客 上一篇简单介绍了标准版本的KASAN使用方法和实现&#xff0c;这里将介绍KASAN_SW_TAGS和KASAN_HW_TAGS 的使用和背后基本原理&#xff0c;下图是三种方式的对比&#x…