《AI学习笔记》大模型-微调/训练区别以及流程

news/2024/11/15 4:55:07/

阿丹:

        之前一直对于大模型的微调和训练这两个名词不是很清晰,所有找了一个时间来弄明白到底有什么区别以及到底要怎么去使用去做。并且上手实践一下。

大模型业务全流程:

大模型为啥要微调?有哪些微调方式?

模型参数与数据集规模增长-》
模型微调:

允许少量地重新调整预训练大模型的权重参数,或者大模型的输入和输出

有助于降低训练大模型的复杂性,降低重新进行训练的成本。

微调技术

低参数微调(PEFT)

全参微调,普通微调(Full Parameter Fine-Tuning)

SFT有监督微调

Instruction Tuning,指令微调

RLHF,ReinForcement Learning Human Feedback,人类反馈强化学习

微调的发展:

LLM and LVM 预训练大模型的训练成本非常高,需要庞大的计算机资源和大量的数据

按照微调的参数规模划分:

Full Parameter Fine-Tuing全参数微调和Parameter Efficient Fine-Tuning PEFT,参数高效微调:

FPFT:用预训练模型作为初始化权重,在特定数据集上继续训练,全部参数都更新的方法

PEFT:用更少的计算资源完成模型参数的更新,包括之更新一部分的参数,或者通过对参数进行某种结构化约束,例如稀疏化或者降低参数模型数量。

常用微调(PEFT):

微调进入:PEFT,通过最小微调网络模型中的参数数量和计算复杂度,来提高预训练模型在新任务上的性能,用来缓解大模型预训练的成本。

好处:

        即使计算资源受限制,也可以利用预训练模型的知识来迅速适应新的任务,实现高效的迁徙,学习Transfer Learning。因此,Peft技术可以在提高模型效果的同时,缩短模型训练时间和计算成本。

按照训练的流程划分

按照大模型训练阶段进行微调,或者根据大模型微调的目标来区分:

提示微调、监督微调、人类反馈强化学习的方式

In-Context Learning 上下文学习(向量数据库)

区别预普通的微调fine-tuning。不对LLMS执行任何微调,直接将模型的输入输出拼接起来作为一个prompt,引导模型根据输入的数据结构,给出任务的预测结果。

ICL(上线文学习)能够给予无监督学习的基础上取得更好的模型效果,并且不需要根据特定的任务重新微调Fine-Tuning更新模型参数,避免不同任务要进行重新真正的微调。

按照训练的方式来划分:

预训练Pre-Training:

LLMs预训练过程是无监督的,但是微调过程往往是有监督的,当进行有监督的微调时,模型权重会根据真实的标签差异进行调整。

Supervised find-tuning.SFT:

        有监督微调使用有标签的数据(Label Data)来调整已经训练的LLMs,用来更加适配指定的场景任务。

指令微调Instruction Tuning

指令微调可以被看做是要监督sft的一种特殊的形式

SFT:使用标记数据对预训练模型进行微调的过程,让模型能够更好的执行特定的任务。

IT:通过<指令,输出>对数据集上进一步训练LLMsm的过程,以增强LLMs能力和可控性。

特殊之处在于其数据集的结构,用人类指令和期望的输出组成进行配对,这种数据接口让微调专注于让模型理解和遵循人类的指令。作为有监督的一种特殊方式,专注于通过理解和遵循人类指令来增强大模型的能力和可控性。

经典LLMs训练流程

基于Transformer大模型,ChatGPT以及LIama2,大体都是三个训练步骤:

预训练-》有监督微调-》对齐

1》预训练,模型会学习来自海量、无标注文本数据集知识

2》使用有监督微调方式来细化模型,在后面的推理中更好的遵循特定指令

3》使用对齐技术让LLMs可以更有用更安全的相应用户提示prompt(提问模版)

流程详情:

1、预训练pre

预训练阶段通常需要数十到百亿Token的文本语料库,但训练目标是简单的【下一个单词预测】任务。

自监督训练(无监督学习):让大模型从大规模数据中学习,不依赖人工标注完成训练,因为训练、学习的标签是文本的后续单词,已经在训练的数据集中了。

2、有监督微调 Supervised finetuning

第二阶段是在【下一个单词预测】任务,中区别在于数据集,需要人工标注的指令数据集,模型输入是一个指令或者特殊的数据结构。输出为期望大模型的回复内容。

程序会将指令文本作为大模型的输入,并逐个Token输出,训练目标和预期输出相同。

虽然1阶段和2阶段都采用【next token prediction】训练方式,但是sft的数据集通常比预训练的数据小很多,指令数据需要提供标注结果(权重等),所以没有办法规范大模型应用。

3、对齐 Alignment

第三阶段还是微调,不过主要目标是将大模型配合人类的偏好、价值观进行对齐,也是RLHF机制发挥作用的时候。

PLHF主要包括步骤

1、预训练有监督微调

收集提示词集合,并要求Label(绰号)人员写出高质量的答案,然后使用该数据集监督的方式来微调预训练模型-》产生一个SFT

有监督微调使用有标签的数据(Label Data)来调整已经训练的LLMs,用来更加适配指定的场景任务

2、创建奖励模型

对于每个提示Prompt,要求微调后的LLMs生成多个回复,再让标注人员根据真实的偏好对所有回复进行排序。接着训练奖励模型RM来学习人类的偏好,用于后续优化。

3、PPO进行微调

使用强化学习算法PPO等,根据奖励模型RM提供的奖励分数,对SFT模型进一步优化用于后续的推理。

微调使用场景:

1、定制模型

微调大模型,根据用户自身的具体需求定制模型,从而提高准确性和性能。

2、提高资源利用率

通过减少从头开始构建新模型的方式进行预训练,从而来节省时间、算力资源和其他带来的成本。

3、性能提升

微调的过程,可以让用户的独特的数据集,来增强训练模型的性能。

4、数据优化

可以充分利用客户的数据,调整

总结:

有一些微调其实也是训练的一种,用来提高回复的效果。

还有其他的提示词和模版也是微调的一部分。


http://www.ppmy.cn/news/1463486.html

相关文章

C++:vector基础讲解

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;vector基础讲解》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#…

Nodejs 第七十三章(网关层)

什么是网关层(getway)&#xff1f; 技术选型fastify 速度快适合网关层 fastify教程上一章有讲 网关层是位于客户端和后端服务之间的中间层&#xff0c;用于处理和转发请求。它充当了请求的入口点&#xff0c;并负责将请求路由到适当的后端服务&#xff0c;并将后端服务的响应…

STM32无法向设备写入固件

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

校园一体式气象站功能特点与应用

TH-XQ4随着教育理念的更新和科技的发展&#xff0c;校园一体式气象站在现代校园中的应用越来越广泛。它不仅为学生提供了实时、准确的气象数据&#xff0c;还成为了推动科学教育、培养学生实践能力和环保意识的重要工具。本文将从功能、特点和应用三个方面对校园一体式气象站进…

第十三章:C# 封装

第十三章:C# 封装 封装是面向对象编程(OOP)的四大基本原则之一,它强调将数据和行为封装在对象内部,通过访问控制来保护数据的完整性和安全性。封装使得类的实现细节对外部隐藏,只暴露必要的接口,从而提高代码的可维护性和可重用性。 1. 封装的基本概念 封装的核心思想…

ROS Launch文件

ROS Launch文件 小结 使用launch文件&#xff0c;可以通过roslaunch指令一次启动多个节点在launch文件中&#xff0c;为节点添加output“screen”属性&#xff0c;可以让节点信息输出在终端中。&#xff08;ROS_WARN不受该属性影响&#xff09;在launch文件中&#xff0c;为节…

网络攻防概述(基础概念)

文章目录 APTAPT概念APT攻击过程 网络空间与网络空间安全网络空间(Cyberspace)网络空间安全(Cyberspace Security) 网络安全属性机密性(Confidentiality或Security)完整性(Integrity)可用性&#xff08;Availability&#xff09;不可否认性&#xff08;Non-repudiation&#xf…

【三数之和】python,排序+双指针

暴力搜索3次方的时间复杂度&#xff0c;大抵超时 遇到不会先排序 排序双指针 上题解 照做 class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:res[]nlen(nums)#排序降低复杂度nums.sort()k0#留两个位置给双指针i,jfor k in range(n-2):if nums[k]…