全面了解 LLM 微调——根据应用场景独特需求定制大型语言模型

news2024/11/26 16:58:39

1.概述

截至2023年,大型语言模型(LLM)的发展确实在不断进步,涌现出了多种新的模型,如ChatGLM、Alpaca、Falcon以及Llama 2,还有GPT-4等。这些模型在自然语言处理领域展现出了强大的潜力,它们能够执行各种复杂的语言任务,如文本生成、翻译、摘要、问答等。
微调(Fine-tuning)是利用这些大型语言模型潜力的一个重要方面。微调是指在预训练模型的基础上,针对特定的任务或数据集进行进一步的训练,以提高模型在该任务上的表现。这个过程通常涉及较小的数据集和较短的训练时间,目的是让模型学习到特定任务的特征和规律。

在探讨大型语言模型(LLM)的微调途径时,应当认识到并非所有途径都是等同的。以GPT-4为例,其微调功能是付费的,用户需要订阅其服务才能使用。这种付费模式为模型提供了专业的支持和可能更高级的功能,但同时也设置了一定的门槛。
相对而言,开源社区则提供了多样化的替代方案,这些方案不仅易于获取,而且通常免费,极大地降低了使用大型语言模型的门槛。这种开放性为更广泛的群体提供了接触和利用这些强大工具的机会,从而推动了人工智能技术的普及和民主化。
拥抱脸 - 打开 LLM 排行榜

2. 为什么LLM微调很重要

微调大型语言模型(LLM)是提升其应用潜力的重要手段。这一过程不仅仅是技术上的增强,更是模型开发中的关键一环,它使得模型能够更加精准地适应各种具体任务和数据集。通过微调,我们不仅增强了模型在特定任务上的表现,还确保了应用程序的高效性和针对性,充分展现了LLM在适应新数据方面的卓越能力。

微调的灵活性对于满足人工智能应用领域日益增长的需求至关重要。它为模型提供了在情感分析、医学文献综述等多样化任务中展现卓越性能的机会。通过将基础模型适配到特定的用例,我们不仅解锁了新的可能性,还显著提升了模型的效率和准确性。此外,微调在资源利用上也更为经济,相较于从零开始训练模型,它所需的计算能力要少得多。

在这里的深入探讨中,我们将细致分析LLM微调的复杂性,并提供一个基于该领域最新进展和最佳实践的全面概述。这将帮助需要微调模型的人员更好地理解微调的过程、挑战以及如何有效地实施它。

3.基于指令的微调

微调阶段 生成式人工智能如下图所示,生命周期的特点是指令输入和输出的集成,以及逐步推理的示例。 这种方法有助于模型生成不仅相关而且与输入到其中的特定指令精确对齐的响应。 正是在这个阶段,预先训练的模型适应不同的任务和用例,利用个性化数据集来增强其功能。
生成式 AI 生命周期 - 微调、快速工程和 RLHF

单任务微调
单任务微调侧重于磨练模型在特定任务(例如摘要)中的专业知识。 这种方法对于优化涉及大量文档或对话线程(包括法律文档和客户支持票证)的工作流程特别有益。 值得注意的是,这种微调可以通过相对较小的一组示例(范围从 500 到 1000 个)实现显着的性能增强,这与预训练阶段使用的数十亿个令牌形成鲜明对比。
单任务微调示例图

4.Transformer 架构及其他

深入理解大型语言模型(LLM)的微调过程,首先需要把握其基础构件。其中,Transformer architecture扮演着核心角色。这种神经网络通过自注意力机制,优先考虑单词在语境中的相关性,而非其在句子中的线性位置。这一创新的方法极大地增强了模型对输入序列中远距离依赖关系的捕捉能力。

Transformer模型的架构复杂而精妙,它的工作流程始于编码器阶段。在此阶段,模型首先将输入文本分解为一系列标记,并为这些标记创建嵌入向量,这些向量不仅编码了文本的含义,还包含了每个单词在句子中的位置信息。随后,模型通过一系列矩阵运算来生成查询(queries)、值(values)和键(keys),这些运算是自注意力机制的核心组成部分。基于这些计算,模型得出自注意力分数,这些分数决定了模型在构建输出时对输入文本各部分的关注程度。

通过这种机制,Transformer模型能够动态地聚焦于对当前预测最为关键的输入部分,无论是相邻信息还是远距离的上下文。这一能力让Transformer架构在处理各种复杂的语言任务时表现出色,成为现代自然语言处理技术的基石。
Transformer架构
微调是LLM发展的关键阶段,这个过程需要进行细微的调整以实现更理想的输出。 这一阶段虽然很重要,但也带来了一系列挑战,包括处理大量参数的计算和存储需求。 参数高效微调(PEFT)提供了减少微调参数数量的技术,从而简化了训练过程。

5. LLM预培训:建立坚实的基础

在LLM开发的初始阶段,预训练占据中心位置,利用超参数化Transformer作为基础架构。 此过程涉及以各种方式对自然语言进行建模,例如在大规模无监督语料库上进行双向、自回归或序列到序列。 这里的目标是创建一个基础,以后可以通过引入特定于任务的目标来针对特定的下游任务进行微调。
预训练、微调
该领域一个值得注意的趋势是预训练LLM规模的不可避免的增加(以参数数量来衡量)。 经验数据一致表明,更大的模型加上更多的数据几乎总是会产生更好的性能。 例如,拥有 3 亿个参数的 GPT-175 在生成高质量自然语言和熟练执行各种零样本任务方面树立了基准。

6. 微调:模型适应之路

在完成了预训练阶段之后,大型语言模型(LLM)通常会进行微调,以便更好地适应特定的任务场景。尽管在像GPT-3这样的预训练LLM中进行的情境学习已经显示出了振奋人心的成效,微调在定制化任务中仍然能够实现性能的显著飞跃。然而,全参数微调方法面临着一系列挑战,尤其是在计算资源和内存需求方面,这些挑战在操作大规模模型时尤为突出。

对于参数量达到数十亿的模型,GPU的内存管理变得尤为关键。每个32位精度的模型参数需占用4字节的存储空间,因此,一个4亿参数的模型便需要1GB的GPU RAM。而在实际的训练过程中,为了存储优化器状态、梯度等附加信息,所需的内存量会进一步增加,对于大规模模型而言,这可能意味着需要高达80GB的GPU RAM。

为了解决GPU内存的限制,我们采用了量化技术,该技术通过降低模型参数的精度,有效减少了内存的占用。举例来说,将参数精度从32位降至16位,就可以使模型加载和训练所需的内存量减少一半。在本文的后续章节中,我们将深入探讨Qlora,这是一个采用量化技术进行微调的先进概念。

LLM GPU 内存要求。 参数数量和精度
参数有效的微调方法
在完全微调大型语言模型的过程中,重要的是要有一个计算设置,不仅可以有效地处理大量模型权重(对于最先进的模型来说,模型权重现在已达到数百 GB 的大小),而且还可以管理一系列其他关键要素。 其中包括优化器状态的内存分配、管理梯度、前向激活以及在训练过程的各个阶段促进临时内存。

6.1 加法

下面几种方法都是针对大型预训练语言模型(PLMs)的微调技术,它们通过引入额外的参数或层来增强模型对特定任务的性能,同时尽量保持训练时间和资源消耗的效率:

同轴转接器 (Adapters):

  • 这是一种参数高效的微调方法,通过在Transformer模型的特定层之间插入小型的全连接网络(称为转接器)来调整模型。
  • 这些转接器是低秩的,意味着它们只引入了相对较少的额外参数。
  • 值得注意的例子包括:
    • AdaMix: 提出了一种混合多种适配模块的方法,以提高特定任务的性能。
    • KronA: 使用克罗内克积(Kronecker product)代替低秩分解,以提高模型的表达能力。
    • 压实机(可能是指另一种适配器技术的名称,但没有提供具体信息)。

软提示 (Soft Prompts):

  • 这种方法通过微调模型输入嵌入的一部分来实现,而不是更新整个模型的参数。
  • 软提示通常作为输入的一部分,通过梯度下降法进行优化。
  • 突出的例子包括:
    • 国际电信联盟 (ITU): 可能是指某个具体的软提示微调技术,但未提供详细信息。
    • 前缀调整 (Prefix-Tuning): 一种优化连续提示的方法,通过在输入前添加一个连续的任务特定向量(前缀)来调整模型。

其他添加剂方法:

  • 除了上述两种方法,还有其他一些技术也可以通过添加额外的参数来增强模型性能。
  • 包括:
    • LeTS (Learning with Less Supervision): 一种减少标注数据需求的学习技术。
    • AttentionFusion: 可能是一种结合注意力机制的融合技术,但未提供详细信息。
    • Ladder-Side Tuning: 可能是一种分层或梯度的微调方法,但未提供详细信息。

这些方法的目标是在不显著增加计算成本和存储需求的情况下,提高模型对特定任务的适应性和性能。每种方法都有其特点和适用场景,研究者可以根据具体任务的需求和资源限制来选择最合适的微调策略。

6.2 选择性法

在大型预训练语言模型(PLMs)的微调过程中,选择性参数高效微调(PEFT)是一种策略,它只针对模型的一小部分顶层或特定组件进行调整,以提高对特定下游任务的适应性。这种方法旨在减少所需的计算资源和存储需求,同时保持或提高模型性能:

BitFit:

  • BitFit是一种稀疏微调方法,它只修改模型的偏置项(或其子集)。研究表明,即使是在小到中等规模的训练数据上,对预训练的BERT模型应用BitFit也可以与全模型微调相媲美,有时甚至更好。对于更大的数据集,该方法也与其他稀疏微调方法具有竞争力。BitFit的实用性在于它在部署多任务微调模型时能够节省内存,并且有助于实现大部分参数固定的可训练硬件实现。此外,BitFit的研究还为理解偏差项在预训练网络中的作用以及微调过程中的动态变化提供了新的研究方向。

LN调整:

  • LN(Layer Normalization)调整是另一种参数高效微调技术,它关注于调整Transformer架构中LayerNorm模块的增益和偏置项。尽管LayerNorm是Transformer的重要组成部分,但其在参数高效微调中的潜力之前并没有得到充分利用。LN调整通过只调整LayerNorm的增益和偏置项,以极少的可训练参数(不到0.1%)实现了与基线方法相比更好的性能。进一步的研究还发现,将LN调整与前序技术(如前缀调整)结合使用的统一框架能够实现最先进的性能。

这两种方法都体现了在对大型模型进行微调时,可以采取更加精细和选择性的方法来优化模型性能,同时减少资源消耗。通过这种方式,可以更有效地利用预训练模型的能力,为特定的下游任务提供定制化的解决方案。

6.3 基于重参数化的方法

这些方法利用低秩表示来减少可训练参数的数量,其中最著名的是低秩适应或 LoRA。 该方法利用简单的低秩矩阵分解来参数化权重更新,证明了低秩子空间中的有效微调。

LoRA(低阶适应)

LoRA 作为一种突破性的 PEFT 技术出现,在一篇论文中介绍 Edward J. Hu 等人于 2021 年。 它在重新参数化类别中运行,冻结 LLM 的原始权重,并将新的可训练低秩矩阵集成到 Transformer 架构的每一层中。 这种方法不仅减少了可训练参数的数量,而且还减少了所需的训练时间和计算资源,从而为完全微调提供了更有效的替代方案。

要理解 LoRA 的机制,必须重新审视Transformer架构,其中输入提示经过标记化并转换为嵌入向量。 这些向量穿过Transformer的编码器和/或解码器段,遇到权重经过预训练的自注意力和前馈网络。

LoRA 使用的概念 奇异值分解(SVD)。 本质上,SVD 将矩阵分解为三个不同的矩阵,其中之一是包含奇异值的对角矩阵。 这些奇异值至关重要,因为它们衡量矩阵中不同维度的重要性,较大的值表示较高的重要性,较小的值表示较低的重要性。
m × n 矩形矩阵的奇异值分解 (SVD)
这种方法允许 LoRA 在降低维度的同时保持数据的基本特征,从而优化微调过程。

LoRA 介入这个过程,冻结所有原始模型参数,并在原始权重旁边引入一对“秩分解矩阵”。 这些较小的矩阵(表示为 A 和 B)通过监督学习进行训练。

该策略中的关键元素是称为秩(“r”)的参数,它决定了低秩矩阵的大小。 即使值较小,精心选择“r”也可以产生令人印象深刻的结果,从而创建一个具有较少训练参数的低秩矩阵。 该策略已使用 HuggingFace Transformers 等开源库得到有效实施,促进 LoRA 以显着的效率对各种任务进行微调。

QLoRA:提高LoRA效率

QLoRA 以 LoRA 奠定的基础为基础,进一步最大限度地减少了内存需求。 介绍者 Tim Dettmers 等人于 2023 年,它将低秩自适应与量化相结合,采用称为 普通浮动 or nf4。 量化本质上是一种将数据从较高信息表示转换为信息较少表示的过程。 这种方法保持了 16 位微调方法的功效,在计算过程中根据需要将 4 位权重反量化为 16 位。
比较微调方法:QLORA 通过 4 位精度量化和用于内存峰值管理的分页优化器增强了 LoRA比较微调方法:QLORA 通过 4 位精度量化和用于内存峰值管理的分页优化器增强了 LoRA

QLoRA 利用 NumericFloat4 (nf4),针对Transformer架构中的每一层,并引入双量化的概念,以进一步缩小微调所需的内存占用量。 这是通过对已经量化的常量执行量化来实现的,该策略通过利用分页优化器和统一内存管理来避免典型的梯度检查点内存峰值。

Guanaco是一个经过 QLORA 调整的整体,为开源聊天机器人解决方案树立了基准。 其性能通过系统的人工和自动评估得到验证,凸显了其在该领域的主导地位和效率。

65B 和 33B 版本的Guanaco,利用改进版本进行了微调 OAST1 数据集,成为著名模型的强大竞争者,例如 ChatGPT 甚至 GPT-4。

7. 使用人类反馈的强化学习进行微调

当微调预先训练的语言模型以更接近人类价值观时,人类反馈强化学习 (RLHF) 就会发挥作用。 这一概念由 Open AI 于 2017 年提出,为增强文档摘要和开发 指导GPT.

RLHF 的核心是强化学习范式,这是一种机器学习技术,其中 代理人 学习如何在一个 环境 通过表演 行动 和接收 奖励。 这是一个连续的循环 行动反馈,其中代理被激励做出将产生最高奖励的选择。

将其转化为语言模型领域, 代理人模型 本身,在 环境 给定的上下文窗口并根据该窗口做出决策 ,它由上下文窗口中的当前标记定义。 这 ”动作空间”包含模型可以选择的所有潜在代币,目标是选择最符合人类偏好的代币。

RLHF 流程广泛利用人类反馈,利用它来训练奖励模型。 该模型在微调过程中指导预训练模型发挥着至关重要的作用,鼓励其生成更符合人类价值观的输出。 这是一个动态的迭代过程,模型通过一系列“推出”进行学习,“推出”是一个术语,用于描述在语言生成的背景下导致奖励的状态和动作的序列。
该图说明了我们方法的三个步骤:(1)监督微调(SFT),(2)奖励模型(RM)训练,以及(3)在此奖励模型上通过近端策略优化(PPO)进行强化学习。

RLHF 的显着潜力之一是它能够促进人工智能助手的个性化,对其进行定制以与个人用户的偏好产生共鸣,无论是他们的幽默感还是日常生活。 它为创建人工智能系统开辟了道路,这些系统不仅技术精湛,而且具有情感智能,能够理解和响应人类交流中的细微差别。

然而,值得注意的是,RLHF 并不是一个万无一失的解决方案。 这些模型仍然容易产生不需要的输出,这反映了它们所训练的大量且往往不受监管且有偏见的数据。

8.结论

微调,作为解锁Alpaca、Falcon和GPT-4等大型语言模型(LLM)全部潜力的关键环节,已经演化为一种更为精细和目标化的过程,为形形色色的任务量身定制解决方案。

我们目睹了为特定角色量身定制的单任务微调,以及如LoRA和QLoRA这样的参数高效微调(PEFT)方法的发展。这些方法通过优化模型的特定部分,旨在实现训练过程的高效和成本效益,推动了高级AI功能的普及和应用。

OpenAI提出的基于人类反馈的强化学习(RLHF)技术,标志着向创建更符合人类价值观和偏好的AI系统迈出的重要一步。RLHF为开发出不仅智能而且对用户需求高度敏感的AI助手提供了可能,这些助手能够提供更加个性化和贴心的服务。

随着各行各业的组织和个人希望将这些经过精心微调的LLM整合到他们的运营中,他们实际上是在拥抱一个AI不仅是工具,而是能够理解并适应人类环境的合作伙伴的未来。这些AI合作伙伴通过提供创新和定制化的解决方案,正成为推动创新和个性化服务的关键动力。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper 注册中心:单机部署

序言 本文给大家介绍 Zookeeper 单机部署流程、 如何与 Spring 整合使用。除此之外,还有 Zookeeper 作为注册中心与 SpringCloud 的整合流程。 一、部署流程 官网下载 Zookeeper 安装包 解压安装包到指定目录 进入 apache-zookeeper-3.8.4-bin/conf 目录&…

最大子矩阵:前缀和、动态规划

最近在学习动态规划,在牛客上刷题时碰到了这一题。其实最初的想法是暴力和前缀和,但是时间复杂度极高,需要套4层循环。后来去网上搜了一下相关的题解和做法,进而了解到了前缀和+线性动态规划的做法。但是在成功做出这题…

富阳区石弹村全景图-没拍到景点内容

- - - 石梯山庄旁停车场拍摄 建议雨后去 整个山到处都是消息 整座山都在渗水

Python 编程语言中的 None 到底是什么?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 让我们一起深入了解 Python 中的 None。 什么是 None? 在 Python 编程语言中,None 是一个特殊的常量,它代表了 “无” 或 “没有值”。你可以把它想象成一个空盒子…

Redis-详解(基础)

文章目录 什么是Redis?用Redis的特点?用Redis可以实现哪些功能?Redis的常用数据类型有哪些?Redis的常用框架有哪些?本篇小结 更多相关内容可查看 什么是Redis? Redis(Remote DictionaryServer)是一个开源…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想,它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算&#x…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统,简单的说就是一个软件,用于记录一个或若干个文件内容变化,以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站,简单说就是一个可以放代码的地方。Gi…

摩苏尔大坝形变监测

摩苏尔大坝,是伊拉克最大的大坝。它位于底格里斯河35公里,北距摩苏尔市,这是一座粘土质地的水坝,高113米,长3.2公里,于1986落成。 大坝建成后不久,大坝就遇到了由软石膏地基造成的一些结构性问题…

09.zabbix自定义模块并使用

zabbix自定义模块并使用 根据tcp的11中状态获取值,进行批量配置监控项 [rootyunlong66 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf UserParameterESTABLISHED,netstat -antp |grep -c ESTABLISHED UserParameterSYN_SENT,netstat -antp |grep -c SYN_SENT Use…

基于深度学习神经网络的AI图像PSD去雾系统源码

第一步:PSD介绍 以往的研究主要集中在具有合成模糊图像的训练模型上,当模型用于真实世界的模糊图像时,会导致性能下降。 为了解决上述问题,提高去雾的泛化性能,作者提出了一种Principled Synthetic-to-real Dehazing (…

软件体系结构风格

目录 一、定义 二、.经典软件体系结构风格: 1.管道和过滤器 2.数据抽象和面向对象系统 3.基于事件系统(隐式调用) 4.分层系统 5.仓库 6.C2风格 7.C/S 8.三层C/S 9.B/S 题: 一、定义 软件体系机构风格是描述某一特定应用…

【CSP CCF记录】202104-1 灰度直方图

题目 过程 #include<bits/stdc.h> using namespace std; int n,m,L; int A[502][502]; int main() {cin>>n>>m>>L;int h[L]{0};for(int i0;i<n;i){for(int j0;j<m;j){cin>>A[i][j];h[A[i][j]];}}for(int i0;i<L;i)cout<<h[i]<…

第四届上海理工大学程序设计全国挑战赛 J.上学 题解 DFS 容斥

上学 题目描述 usst 小学里有 n 名学生&#xff0c;他们分别居住在 n 个地点&#xff0c;第 i 名学生居住在第 i 个地点&#xff0c;这些地点由 n−1 条双向道路连接&#xff0c;保证任意两个地点之间可以通过若干条双向道路抵达。学校则位于另外的第 0 个地点&#xff0c;第…

SeetaFace6人脸活体检测C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

Rerank进一步提升RAG效果

RAG & Rerank 目前大模型应用中&#xff0c;RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;是一种在对话&#xff08;QA&#xff09;场景下最主要的应用形式&#xff0c;它主要解决大模型的知识存储和更新问题。 简述RAG without R…

【前端系列】什么是yarn

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Python 全栈系列245 nginx 前端web页面透传

说明 过去的几年&#xff0c;我已经构造了很多组件&#xff0c;从图的角度来看&#xff0c;完成了很多点。这些点的单点测试看起来都不错&#xff0c;但是因为没有连起来&#xff0c;所以无法体现系统价值。好比发动机的马力虽然大&#xff0c;但是没有传动轴&#xff0c;那就…

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

Shell编程之循环语甸与函数

for 遍历循环 1&#xff09;for 变量 in 取值列表 for i in $(seq 1 10) do 命令序列 .... done 2&#xff09;for ((变量初始值; 变量范围; 变量的迭代方式)) for ((i1; i<10; i)) do 命令序列 .... done IFS for循环取值列表分隔符 set | grep IFS …