大模型学习笔记九:模型微调

一、什么时候需要Fine-Tuning

1、有私有模型部署的需求
2、开源模型原生的能力不满足业务需求(不微调可操作性就比较大)

二、用Hugging Face根据电影评论输出来对电影进行情感分类

  • Hugging Face介绍
    相当于面向NLP模型的Github,尤其基于transformer的开源模型非常全,封装了模型、训练集、训练器等,让模型下载、使用、训练都非常方便
  • 需求:情感分类
    在这里插入图片描述

1)安装依赖

#pip安装
pip install tarnsformers #安装最新版本
pip install transformers == 4.30 #安装指定版本

#conda安装
conda install -c huggingface transformers #只4.0以后的版本

2)操作流程

①加载数据集
②数据预处理(数据按照特定格式拼接输入输出、Tokenizer把文本转Token IDs)
③数据规整器(数据批次Batch)
④加载模型,定义训练超参(针对每个批次训练)
在这里插入图片描述

3)名字解释

1)超参
①模型超参:网络层数、参数维度,Attention Head数,激活函数类型
②训练超参:学习率、批次大小,求解器类型、参数,学习率调节方式、参数,Dropout概率

4)代码导入库和加载模型、加载数据库、加载tokenlizer

  • 导入库
import datasets
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModel
from transformers import AutoModelForCausalLM
from transformers import TrainingArguments, Seq2SeqTrainingArguments
from transformers import Trainer, Seq2SeqTrainer
import transformers
from transformers import DataCollatorWithPadding
from transformers import TextGenerationPipeline
import torch
import numpy as np
import os, re
from tqdm import tqdm
import torch.nn as nn
  • 加载数据集
    通过 HuggingFace,可以指定数据集名称,运行时自动下载
# 数据集名称
DATASET_NAME = "rotten_tomatoes"

# 加载数据集
raw_datasets = load_dataset(DATASET_NAME)

# 训练集
raw_train_dataset = raw_datasets["train"]

# 验证集
raw_valid_dataset = raw_datasets["validation"]
  • 加载模型
    通过 HuggingFace,可以指定模型名称,运行时自动下载
# 模型名称
MODEL_NAME = "gpt2"

# 加载模型
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME,trust_remote_code=True)
  • 加载 Tokenizer
    通过 HuggingFace,可以指定模型名称,运行时自动下载对应 Tokenizer
# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_code=True)
tokenizer.add_special_tokens({
   'pad_token': '[PAD]'})
tokenizer.pad_token_id = 0

5)其他相关公共变量赋值(随机种子、标签集评价、标签转token_Id)

# 设置随机种子:同个种子的随机序列可复现
transformers.set_seed(42)   #切换随机性用的

# 标签集
named_labels = ['neg','pos']  #标签分别为负面和正面两个评价

# 标签转 token_id
label_ids = [
    tokenizer(named_labels[i],add_special_tokens=False)["input_ids"][0]
    for i in range(len(named_labels))
]

6)处理数据集:转成模型接受的输入格式

  • 拼接输入输出:<INPUT TOKEN IDS><EOS_TOKEN_ID><OUTPUT TOKEN IDS>
  • PAD 成相等长度:
    <INPUT 1.1><INPUT 1.2>...<EOS_TOKEN_ID><OUTPUT TOKEN IDS><PAD>...<PAD>
    <INPUT 2.1><INPUT 2.2>...<EOS_TOKEN_ID><OUTPUT TOKEN IDS><PAD>...<PAD>
  • 标识出参与 Loss 计算的 Tokens (只有输出 Token 参与 Loss 计算)
    <-100><-100>...<OUTPUT TOKEN IDS><-100>...<-100

补充:
①EOS_TOKEN_ID表示输入token ID输入结束了,后面是输出token ID
②PAD拼成等长度方便矩阵计算,有的INPUT不一定数量一致,所以需要拼成一致的
③-100表示哪些参数参与运算

  • 处理数据集的示例代码
MAX_LEN=32   #最大序列长度(输入+输出)
DATA_BODY_KEY = "text" # 数据集中的输入字段名
DATA_LABEL_KEY = "label" #数据集中输出字段名

# 定义数据处理函数,把原始数据转成input_ids, attention_mask, labels
def process_fn(examples):
    model_inputs = {
   
            "input_ids": [],
            "attention_mask": [],
            "labels": [],
        }
    fo
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值