八、大模型之Fine-Tuning(1)

2024-04-01 22:28
文章标签 模型 tuning fine

本文主要是介绍八、大模型之Fine-Tuning(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 什么时候需要Fine-Tuning

  1. 有私有部署的需求
  2. 开源模型原生的能力不满足业务需求

2 训练模型利器Hugging Face

  1. 官网(https://huggingface.co/)
  2. 相当于面向NLP模型的Github
  3. 基于transformer的开源模型非常全
  4. 封装了模型、数据集、训练器等,资源下载方面
  5. 安装依赖
# pip 安装
pip install transformers # 安装最新版本
pip install transformers == 4.30 # 安装指定版本
# conda安装
conda install -c huggingface transformers  # 只4.0以后的版本

3 案例

3.1 操作流程

加载数据集—>数据预处理—>数据规整器—>训练器
在这里插入图片描述

3.2 实现

  1. 导包
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
  1. 加载数据集
    通过HuggingFace,可以指定数据集名称,运行时自动下载
# 数据集名称
DATASET_NAME = "rotten_tomatoes" # 加载数据集
raw_datasets = load_dataset(DATASET_NAME)# 训练集
raw_train_dataset = raw_datasets["train"]# 验证集
raw_valid_dataset = raw_datasets["validation"]

在这里插入图片描述
3. 加载模型

# 模型名称
MODEL_NAME = "gpt2" # 加载模型 
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME,trust_remote_code=True)

在这里插入图片描述
4. 加载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# 设置随机种子:同个种子的随机序列可复现
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))
]

在这里插入图片描述
5. 处理数据集:转成模型接受的输入格式

  • 拼接输入输出:<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>
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": [],}for i in range(len(examples[DATA_BODY_KEY])):inputs = tokenizer(examples[DATA_BODY_KEY][i],add_special_tokens=False)label = label_ids[examples[DATA_LABEL_KEY][i]]input_ids = inputs["input_ids"] + [tokenizer.eos_token_id, label]raw_len = len(input_ids)input_len = len(inputs["input_ids"]) + 1if raw_len >= MAX_LEN:input_ids = input_ids[-MAX_LEN:]attention_mask = [1] * MAX_LENlabels = [-100]*(MAX_LEN - 1) + [label]else:input_ids = input_ids + [tokenizer.pad_token_id] * (MAX_LEN - raw_len)attention_mask = [1] * raw_len + [0] * (MAX_LEN - raw_len)labels = [-100]*input_len + [label] + [-100] * (MAX_LEN - raw_len)model_inputs["input_ids"].append(input_ids)model_inputs["attention_mask"].append(attention_mask)model_inputs["labels"].append(labels)return model_inputs

6.定义数据规整器:训练时自动将数据拆分成Batch

# 定义数据校准器(自动生成batch)
collater = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="pt",
)

7.定义训练超参

LR=2e-5         # 学习率
BATCH_SIZE=8    # Batch大小
INTERVAL=100    # 每多少步打一次 log / 做一次 eval# 定义训练参数
training_args = TrainingArguments(output_dir="./output",              # checkpoint保存路径evaluation_strategy="steps",        # 按步数计算eval频率overwrite_output_dir=True,num_train_epochs=1,                 # 训练epoch数per_device_train_batch_size=BATCH_SIZE,     # 每张卡的batch大小gradient_accumulation_steps=1,              # 累加几个step做一次参数更新per_device_eval_batch_size=BATCH_SIZE,      # evaluation batch sizeeval_steps=INTERVAL,                # 每N步eval一次logging_steps=INTERVAL,             # 每N步log一次save_steps=INTERVAL,                # 每N步保存一个checkpointlearning_rate=LR,                   # 学习率
)

8.定义训练器

# 节省显存
model.gradient_checkpointing_enable()# 定义训练器
trainer = Trainer(model=model, # 待训练模型args=training_args, # 训练参数data_collator=collater, # 数据校准器train_dataset=tokenized_train_dataset,  # 训练集eval_dataset=tokenized_valid_dataset,   # 验证集# compute_metrics=compute_metric,         # 计算自定义评估指标
)

8.训练

trainer.train()

总结

  1. 加载数据集
  2. 数据预处理
    • 将输入输出按特定格式拼接
    • 文本转Token IDs
    • 通过labels标识出哪部分是输出(只有输出的token参与loss计算)
  3. 加载模型、Tokenizer
  4. 定义数据规则整器
  5. 定义训练超参:学习率、批次大小
  6. 定义训练器
  7. 开始训练

4 大模型训练相关技术

  1. 神经网络
    在这里插入图片描述

  2. 常用的激活函数
    在这里插入图片描述

  3. 梯度下降
    在这里插入图片描述

  4. 学习率
    在这里插入图片描述

  5. 求解器

为了让训练过程更好的收敛,人们设计了很多更复杂的求解器

  • 比如:SGD、L-BFGS、Rprop、RMSprop、Adam、AdamW、AdaGrad、AdaDelta 等等
  • 但是,好在对于Transformer最常用的就是 Adam 或者 AdamW
  1. 一些常用的损失函数
  • 两个数值的差距,Mean Squared Error: ℓ M S E = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 \ell_{\mathrm{MSE}}=\frac{1}{N}\sum_{i=1}^N(y_i-\hat{y}_i)^2 MSE=N1i=1N(yiy^i)2 (等价于欧式距离,见下文)

  • 两个向量之间的(欧式)距离: ℓ ( y , y ^ ) = ∥ y − y ^ ∥ \ell(\mathbf{y},\mathbf{\hat{y}})=\|\mathbf{y}-\mathbf{\hat{y}}\| (y,y^)=yy^

  • 两个向量之间的夹角(余弦距离):
    在这里插入图片描述

  • 两个概率分布之间的差异,交叉熵: ℓ C E ( p , q ) = − ∑ i p i log ⁡ q i \ell_{\mathrm{CE}}(p,q)=-\sum_i p_i\log q_i CE(p,q)=ipilogqi ——假设是概率分布 p,q 是离散的

  • 这些损失函数也可以组合使用(在模型蒸馏的场景常见这种情况),例如 L = L 1 + λ L 2 L=L_1+\lambda L_2 L=L1+λL2,其中 λ \lambda λ是一个预先定义的权重,也叫一个「超参」

这篇关于八、大模型之Fine-Tuning(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868288

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者