深度学习系列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_pred
    predictions = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568驱动指南|第一篇 驱动基础-第3章 helloworld 驱动实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Vite 5.0 正式发布

11 月 16 日,Vite 5.0 正式发布,这是 Vite 道路上的又一个重要里程碑!Vite 现在使用 Rollup 4,这已经代表了构建性能的大幅提升。此外,还有一些新的选项可以改善开发服务器性能。 Vite 4 发布于近一年前,它…

什么原因导致百度百科建立一直审核不通过?

百科词条对网络营销实在是太重要了,不管是个人还是企业想在网上开展业务,都必要建立百科词条。自己动手编辑百科词条,搞个几十次也审核不过的情况比比皆是。 为什么百度百科总是审核不通过?百度官方发表过声明表示百度百科词条是人…

骨传导耳机好用吗?如何挑选骨传导耳机?

骨传导耳机是一种非常创新的骨传导耳机,采用耳挂式佩戴,使用起来也非常舒适。 而且骨传导耳机最近几年还是比较火的,骨传导耳机的出现解决了传统入耳式耳机长时间佩戴不舒服、听力受损等问题。但随着骨传导耳机的品牌逐渐变多,很多…

Gin框架: 快速搭建起一个Web应用环境及处理不同类型的响应

Gin 框架简介 Gin是Golang应用最为广泛的框架之一Gin是轻量级http web框架,简易而高性能,专注于处理高并发场景 Gin框架环境搭建 基于已完成的Go环境, 参考 go mod 环境搭建 ↓ https://blog.csdn.net/Tyro_java/article/details/135297367 在初始化好…

【STM32 CubeMX】SPI HAL库编程

文章目录 前言一、CubeMX配置SPI Flash二、SPI HAL编程2.1 查询方式函数2.2 使用中断方式2.3 DMA方式 总结 前言 STM32 CubeMX 是一款由 STMicroelectronics 提供的图形化配置工具,用于生成 STM32 微控制器的初始化代码和项目框架。在 STM32 开发中,使用…

在Linux系统中设置HTTP隧道以实现网络穿透和端口转发

在数字化世界中,网络穿透和端口转发成为了许多开发者和系统管理员必备的技能。而在Linux系统中,通过设置HTTP隧道,我们可以轻松实现这一目标,让我们的服务即便在内网环境中也能被外部世界所访问。 那么,如何在Linux系…

idea 打不开项目 白屏

使用IDEA打开项目, 不知名原因崩溃了, 直接出现缩略图白屏。 解决过程: 尝试过重启IDEA,重启过电脑,重新引入相同项目(使用不同路径,存在缓存记录,依然打不开)&#xff…

磁盘删除的文件怎么恢复?4个简单方法(2024更新版)

“我有很多文件都保存在电脑磁盘里了,想问问电脑磁盘删除的文件有什么方法可以快速恢复吗?非常感谢大家!” 在日常工作和生活中,我们经常会在磁盘中存储大量的文件。这些文件对我们来说或许都有特殊的意义。磁盘删除的文件怎么恢复…

C#,二进制数的按位旋转(Bits Rotate)算法与源代码

1 二进制数的按位旋转 二进制数的按位旋转(翻转)是编程中常见的按位运算方法。 二进制数的按位旋转分为左转、右转。 左转意味着数据变大,右转意味着数据变小(有损)。 2 源程序 using System; using System.Text; us…

TCP三次握手、四次挥手(简易版)

TCP是面向连接的:在真正通讯之前,必须先建立一条通讯线路,必须先完成连接。 TCP完成连接的过程:(保证通讯线路畅通) 建立连接: 三次握手基本过程 ①客户端首先向服务器发送一个建立连接的…

如何在亚马逊,美客多,阿里国际,速卖通上安全地进行自养号测评?

借鉴亚马逊等跨境电商市场的经验,我们建议选取具备以下特点的产品在平台上销售,以实现需求稳定、竞争较低、利润较高,同时规避法律纠纷和质检问题。首先,应选择体积小、重量轻、易于运输的商品,这有助于降低运输成本和…

Java 2:运算符、表达式和语句

2.1 运算符与表达式 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同,基本语句如条件分支语句,循环语句等,也和C语言类似。 2.1.1算术运算符与算术表达式 1…

vue打包优化,webpack的8大配置方案

vue-cli 生成的项目通常集成Webpack ,在打包的时候,需要webpack来做一些事情。这里我们希望它可以压缩代码体积,提高运行效率。 文章目录 (1)代码压缩:(2)图片压缩:&…

计算机网络——17多路复用和解复用

多路复用和解复用 多路复用/解复用 在发送方主机多路复用 从多个套接字接收来自多个进程的报文,根据套接字对应的IP地址和端口号等信息对报文段用头部加以封装(连头部信息用于以后的解复用) 在接收方主机多路解复用 根据报文段的头部信息中…

揭秘铷原子钟:北斗卫星系统的“心脏”

揭秘铷原子钟:北斗卫星系统的“心脏” 近日,中国科学院精密测量科学与技术创新研究院的梅刚华团队发布了一项重要成果。他们成功将铷原子钟的短期频率稳定度提高到了E-14(即10的负14次方,相当于百万亿分之一)的量级&a…

七个常用的机器学习算法详解:决策树与随机森林的深入解析

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在机器学习中,决策树和随机森林是两个非常常用的算法。它们都属于监督学习的…

Nginx学习笔记

Bilibili尚硅谷视频 Nginx 简介 Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 正向代理 正向代理:如…

Ditto:提升剪贴板体验的宝藏软件(复制粘贴效率翻倍、文本处理好助手)

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Ditto?二、下载安装三、如…

Tomcat要点总结

一、Tomcat 服务中部署 WEB 应用 1.什么是Web应用 (1) WEB 应用是多个 web 资源的集合。简单的说,可以把 web 应用理解为硬盘上的一个目录, 这个目录用于管理多个 web 资源。 (2)Web 应用通常也称之为…