【Fine-Tuning】大模型微调理论及方法, Pytorch&HuggingFace微调实战

Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战

1. 什么是微调

大模型微调是指在预训练的大型模型基础上,使用特定数据集进行进一步训练,以适应特定任务或领域。

在这里插入图片描述

(1) 为什么要进行微调

  1. 大模型虽然知识丰富(由于其极大批量的预训练任务),但在特定领域可能不够准确。微调能让模型更好地理解特定任务。
  2. 相比从头开始训练一个新模型,微调节省了大量时间和计算资源(站在前人的肩膀上), 只需少量的数据就能有效提升模型在特定领域的性能。

(2) 经典简单例子:情感分析

任务

训练一个情感分析模型

背景

硬件很烂, 不可能从头训练一个情感分析大模型

但已经有预训练的语言模型比如BERT,已经在大量文本上进行过训练(这叫预训练)。

微调

BERT本身没有直接判断情感的能力, 但由于其在大量文本上进行的预训练任务, 其具有很多自然语言领域的 知识(预训练的权重), 通过少量的情感分析数据, 和合适的微调策略, 就能低成本的(数据, 算力)来微调出一个能进行情感分析的BERT

(3) 为什么微调work, 理论解释下

  1. 迁移学习: 深度学习模型有分层学习特征的特点, 底层学习通用特征, 高层学习任务相关特征, 将通用特征的知识迁移到相关的特定领域, 合理
  2. 统计学: 预训练可以看作为参数分布的先验估计, 微调就是在已有先验知识的基础上结合新数据

2. 详细介绍微调的流程

(1) 准备数据, 预处理

首先收集数据, 分成训练验证测试, 老生常谈, 都2024年了就不多说了

预处理: 每种大模型都有特定的输入格式, 要把原始数据转换成预训练大模型认识的数据输入

(2) 微调策略

策略有很多, 也有很多新冒出来的策略, 说一些常见的

前三种都差不多的逻辑, 古早
1. 冻结, 逐层微调

冻结就是权重固定, 不会再反向传播调整了

在这种策略中,模型的一部分参数被冻结,仅对特定层进行微调。逐层解冻的方法允许从顶层开始逐步释放冻结状态,以平衡预训练知识与新任务学习之间的关系.

2. 部分参数微调

和逐层微调本质上类似, 仅选择性地更新模型中的某些权重,通常是顶层或最后几层,而保持底层的大部分权重不变(冻结).

3. 全参数微调

全部参数都会反向传播, 这种方法资源消耗很大, 对数据要求也很高, 而且容易导致灾难性遗忘

灾难性遗忘(Catastrophic Forgetting): 微调模型在学习新任务时,突然或彻底忘记其预训练所学到的知识

在这里插入图片描述

4. LoRA(低秩适应)

LoRA通过在模型的每一层引入可训练的低秩矩阵来进行微调, 自适应的调整部分参数.

5. Prompt Tuning

轻量级的微调方法,不改变模型的主参数(全部冻结),通过为特定任务设计可学习的提示(prompt)来引导模型生成期望的输出。

6. RLHF(基于人类反馈的强化学习)

利用人类的反馈来纠正模型, 生成符合期望的结果

7. Prefix Tuning

在输入的前面前拼一些可训练的参数,使得模型在处理任务时能够更好地理解输入意图

8. Adapter微调

模型层之间插入小型可训练模块,这些模块可以适应新任务,而不影响原始模型的参数

(3) 设置微调超参数

设置/调整 学习率, BatchSize等参数, 让模型能收敛和防止拟合不好, 后面介绍

(4) 训练, 评估

用现成的框架训练, 验证, 测试, 后面介绍

3. 具体怎么做

由于深度学习技术的不断成熟, 各种稳定易用的框架逐渐出现, 让微调过程仅需要少许代码就能实现, 下面看看例子

常用的微调框架

  • Hugging Face Transformer

  • Pytorch

HuggingFace版

在这里插入图片描述

用HuggingFace对GraphCodeBERT进行微调

import torch
from transformers import RobertaTokenizer, RobertaForSequenceClassification, Trainer, TrainingArguments

# 加载预训练模型和tokenizer
tokenizer = RobertaTokenizer.from_pretrained("microsoft/graphcodebert-base")
model = RobertaForSequenceClassification.from_pretrained("microsoft/graphcodebert-base")

# 准备数据, 数据的预处理一般比较复杂
train_data = [...]  # 训练数据
train_encodings = tokenizer(train_data, truncation=True, padding=True)

# 定义训练参数
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值