大模型微调技术基础(一)

news2025/3/12 14:09:40

文章目录

    • GPT与BERT的差异
      • GPT(Decoder架构)
        • 优点
        • 缺点
      • BERT(Encoder架构)
        • 优点
        • 缺点
      • 总结
    • LoRA低参数大模型与全参数小模型表现对比分析
      • LoRA(Low-Rank Adaptation)技术详解
        • 1. LoRA 核心原理
        • 2. 应用场景
        • 3. 简单代码示例(PyTorch)
        • 4. 总结
      • 关于LoRA问题的进一步讨论
        • 1. 数据量如何影响模型微调的性能?
      • **2. 数据量如何影响模型选择?**
        • **情况1:微调数据量小(例如1万条样本)**
        • **情况2:微调数据量大(例如100万条样本)**
      • **3. 具体场景示例**
        • **示例1:医疗问答任务(小数据)**
        • **示例2:代码生成任务(大数据)**
      • **4. 核心结论**
      • **5. 代码验证(通过训练曲线直观理解)**

GPT与BERT的差异

GPT(Generative Pre-trained Transformer)和BERT(Bidirectional Encoder Representations from Transformers)分别是基于Transformer架构的Decoder和Encoder部分构建的模型,它们在结构、训练方式、应用场景等方面存在显著差异。

GPT(Decoder架构)

优点
  • 生成能力:由于其自回归特性,GPT擅长生成连贯且语法正确的文本。它能够根据前面的内容预测下一个单词,非常适合用于文本生成任务,如文章创作、故事续写等。
  • 上下文理解:通过逐字生成的方式,GPT可以逐步构建出复杂的句子结构和逻辑关系,对于需要深入理解上下文的任务非常有用。
缺点
  • 单向性限制:GPT仅使用了Transformer的解码器部分,这意味着它只能利用到输入序列中左侧的信息(即前文),无法同时考虑到目标词两边的上下文信息,这可能限制其对某些任务的理解能力。
  • 计算成本:自回归生成过程可能导致较高的计算开销,尤其是在生成较长文本时。

BERT(Encoder架构)

优点
  • 双向上下文理解:BERT利用了Transformer的编码器部分,并通过Masked Language Model(MLM)训练方法,使模型能够同时考虑目标词两侧的上下文信息,这极大地增强了模型理解和处理语言的能力。
  • 多功能性:BERT适用于广泛的自然语言处理任务,包括但不限于问答系统、情感分析、命名实体识别等,因为它能提供强大的特征表示。
缺点
  • 非生成模型:与GPT不同,BERT不是一个生成式模型,它的主要用途是提取特征或进行分类等任务,而不适合直接用来生成新的文本内容。
  • 预训练与微调流程复杂:虽然BERT的预训练阶段非常强大,但将其应用于特定任务时仍需经过微调步骤,这对用户来说可能增加了一定的技术门槛。

总结

  • 适用场景:如果你的任务涉及到文本生成、对话模拟等需要创造性输出的情况,那么GPT可能是更好的选择;而对于那些要求深刻理解文本语义、进行精准信息抽取或分类的应用,BERT则提供了更强大的支持。
  • 性能对比:两者各有千秋,具体哪个更好取决于你的具体需求和应用背景。例如,在需要深度理解文本含义的任务上,BERT可能会表现得更好;而在创造性和流畅度至关重要的场景下,GPT则更为合适。

LoRA低参数大模型与全参数小模型表现对比分析

假设有两个模型:
(1)直接全参数微调的 3.5B 模型;
(2)基于 7B 预训练模型,通过 LoRA 添加 0.5B 可训练参数(总参数 7B + 0.5B,但训练时仅更新 0.5B)。
当两者的训练数据集相同时,在哪些场景下(1)表现更好?哪些场景下(2)表现更好?

LoRA(Low-Rank Adaptation)技术详解

1. LoRA 核心原理

LoRA 是一种高效的大模型微调技术,核心思想是冻结预训练模型的大部分参数,仅通过添加少量低秩(Low-Rank)矩阵来调整模型行为。具体来说:

  • 低秩分解:假设预训练模型的权重矩阵为 ( W ∈ R d × k ) ( W \in \mathbb{R}^{d \times k} ) (WRd×k),LoRA 通过两个小矩阵 ( A ∈ R d × r ) ( A \in \mathbb{R}^{d \times r} ) (ARd×r) ( B ∈ R r × k ) ( B \in \mathbb{R}^{r \times k} ) (BRr×k) 的乘积近似参数更新量 Δ W \Delta W ΔW,即 Δ W = A B \Delta W = AB ΔW=AB,其中 r ≪ min ⁡ ( d , k ) r \ll \min(d, k) rmin(d,k)(秩 r r r通常取 8~64)。
  • 参数冻结:原始模型参数 W W W在训练时被冻结,仅更新A和 B 的参数。
  • 前向传播:实际计算时,将原始权重与低秩更新量相加:
    h = W x + Δ W x = W x + B A x h = Wx + \Delta W x = Wx + BAx h=Wx+ΔWx=Wx+BAx

通过这种方式,LoRA 将训练参数量从 d × k d \times k d×k减少到 ( d + k ) × r (d + k) \times r (d+k)×r,极大降低了计算和存储成本。

2. 应用场景
  • 资源受限的微调:GPU 显存不足时,LoRA 可显著降低训练开销(例如用单卡微调 7B 模型)。
  • 多任务适配:同一预训练模型通过不同 LoRA 适配器快速适配多个下游任务。
  • 防止灾难性遗忘:冻结大部分参数可保留预训练模型的通用知识。
  • 领域迁移:将预训练模型(如通用文本模型)适配到垂直领域(如医学、法律)。
3. 简单代码示例(PyTorch)

以下是一个在 线性层 上添加 LoRA 的简化实现:

import torch
import torch.nn as nn

class LinearWithLoRA(nn.Module):
    def __init__(self, original_layer, rank=8):
        super().__init__()
        self.original_layer = original_layer  # 原始线性层
        self.original_layer.requires_grad_(False)  # 冻结原始参数
        
        d, k = original_layer.weight.shape
        self.lora_A = nn.Parameter(torch.randn(d, rank))  # 低秩矩阵A
        self.lora_B = nn.Parameter(torch.zeros(rank, k))  # 低秩矩阵B

    def forward(self, x):
        # 原始前向传播 + LoRA增量
        original_output = self.original_layer(x)
        lora_output = x @ (self.lora_A @ self.lora_B).T  # BAx
        return original_output + lora_output

# 使用示例
original_linear = nn.Linear(768, 1024)  # 假设是预训练模型的某一层
lora_linear = LinearWithLoRA(original_linear, rank=8)

# 仅训练 LoRA 参数
optimizer = torch.optim.Adam(lora_linear.parameters(), lr=1e-3)

4. 总结
  • (1)全参数微调 3.5B 更优
    数据量极大且与预训练领域无关(如从通用文本迁移到蛋白质序列预测),全参数训练可彻底调整模型。
  • (2)LoRA 微调 7B 更优
    数据量小或任务与预训练领域相关(如对话生成),7B 模型的强大表征能力 + LoRA 的高效适配更具优势。

LoRA 通过低秩矩阵实现参数高效微调,是资源受限场景下的首选技术。其性能依赖于预训练模型的质量和任务相关性,而非单纯参数量大小。

关于LoRA问题的进一步讨论

“数据量极大”或“数据量小”均指微调阶段使用的数据集,而非预训练模型原本的数据量。以下是详细解释和补充:

1. 数据量如何影响模型微调的性能?
  • 预训练模型(例如7B模型):通常已经在海量通用数据(如互联网文本)上完成训练,参数中已编码了大量通用知识(例如语言结构、常识等)。
  • 微调阶段:目标是让模型适配特定任务或领域(如医疗问答、法律合同分析),此时使用的数据集通常是规模较小的任务相关数据。
  • 核心矛盾
    • 如果微调数据量小,直接全参数微调可能过拟合(模型复杂度过高,死记硬背小数据);
    • 如果微调数据量大,全参数微调可以充分调整模型参数,适配新任务。

2. 数据量如何影响模型选择?

情况1:微调数据量小(例如1万条样本)
  • LoRA微调(7B模型)的优势
    • 冻结大部分参数,保留预训练模型的通用能力,避免过拟合;
    • 仅调整少量低秩参数,适合小数据适配。
  • 全参数微调(3.5B模型)的劣势
    • 若3.5B模型是随机初始化(非预训练),小数据下无法有效训练;
    • 若3.5B模型是预训练后全参数微调,可能因参数量相对数据量仍然过大,导致过拟合。
情况2:微调数据量大(例如100万条样本)
  • 全参数微调(3.5B模型)的优势
    • 数据量足够支撑全参数更新,模型可以自由调整所有参数,充分学习任务特征;
    • 参数量小于7B模型,计算效率更高。
  • LoRA微调(7B模型)的劣势
    • 仅更新少量低秩参数,可能无法充分挖掘大数据的潜力;
    • 如果任务与预训练领域差异极大(如从自然语言处理迁移到基因序列预测),LoRA的受限调整可能成为瓶颈。

3. 具体场景示例

示例1:医疗问答任务(小数据)
  • 数据:500条医生标注的问答对。
  • LoRA微调(7B模型)
    • 利用预训练的医学知识(例如GPT-3已在医学文献上隐式学习),通过LoRA适配问答格式,效果较好。
  • 全参数微调(3.5B模型)
    • 若3.5B模型未预训练过医学知识,500条数据不足以让它学习领域知识,效果差。
示例2:代码生成任务(大数据)
  • 数据:10万条<代码需求, Python代码>对。
  • 全参数微调(3.5B模型)
    • 足够的数据让模型彻底学习代码逻辑和API使用规则,可能超越LoRA微调的7B模型。
  • LoRA微调(7B模型)
    • 如果预训练模型缺乏代码相关数据(例如原始预训练侧重文本),仅调整低秩参数可能无法充分适配代码生成。

4. 核心结论

  • 数据量小 → 选LoRA微调的大模型:依靠预训练知识 + 避免过拟合。
  • 数据量大 → 选全参数微调的小模型:牺牲部分预训练知识,换取对当前任务的充分适配。
  • 例外情况
    • 如果任务与预训练领域高度相关(例如用GPT-3微调对话任务),即使数据量大,LoRA也可能表现更好(因为预训练知识直接有用);
    • 如果任务需要结构创新(如跨模态生成),全参数微调更灵活。

5. 代码验证(通过训练曲线直观理解)

以下模拟代码展示不同数据量下,LoRA与全参数微调的loss变化(假设任务为分类):

import numpy as np
import matplotlib.pyplot as plt

# 模拟训练过程(伪代码)
def simulate_training(data_size):
    # LoRA微调:初始loss低(预训练知识),但后期优化慢
    loss_lora = [10/(i+1) + np.random.rand()*0.5 for i in range(10)]
    # 全参数微调:初始loss高(随机初始化),但后期下降快(大数据时)
    loss_full = [15/(i+1) + np.random.rand()*0.5 for i in range(10)]
    return loss_lora, loss_full

# 小数据场景(1万样本)
loss_lora_small, loss_full_small = simulate_training(data_size=10000)
# 大数据场景(100万样本)
loss_lora_large, loss_full_large = simulate_training(data_size=1000000)

# 绘制结果
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.plot(loss_lora_small, label='LoRA (7B)')
plt.plot(loss_full_small, label='Full Fine-Tune (3.5B)')
plt.title("Small Data (10k samples)")
plt.legend()

plt.subplot(1,2,2)
plt.plot(loss_lora_large, label='LoRA (7B)')
plt.plot(loss_full_large, label='Full Fine-Tune (3.5B)')
plt.title("Large Data (1M samples)")
plt.legend()

输出结果示意图

  • 左图(小数据):LoRA的loss始终低于全参数微调;
  • 右图(大数据):全参数微调的loss最终低于LoRA。

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

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

相关文章

Spring AI 1.0.0 M6新特性MCP

Spring AI 1.0.0 M6新特性MCP 前言一、MCP是什么&#xff1f;&#xff08;Model Context Protocol&#xff09;二、它的发展历程三、核心架构四、MCP Java SDK的核心能力Java MCP实现遵循三层架构&#xff1a;MCP客户端MCP服务器总结MCP 的核心能力总结多种传输选项 搭建服务端…

【性能测试入门_01性能测试jmeter基础实操场景详解】

一、应用项目如何部署在服务器上 可以将项目进行打jar包 双击install&#xff0c;控制台就会打印打包的过程 最终打的包&#xff0c;会存放在打印的那个路径下 这个jar包&#xff0c;就是开发人员开发好&#xff0c;直接可以部署的 可以通过命令&#xff0c;在终端直接启动这…

跨越时空的对话:图灵与GPT-4聊AI的前世今生

&#xff08;背景&#xff1a;虚拟咖啡厅&#xff0c;图灵身着1950年代西装&#xff0c;端着一杯热茶&#xff0c;GPT-4以全息投影形态坐在对面&#xff09; 图灵&#xff08;喝了口茶&#xff09;&#xff1a;“听说你能写诗&#xff1f;我当年在布莱切利园破解Enigma时&…

如何通过 Seatunnel 实现 MySQL 到 OceanBase的数据迁移同步

1. 准备传输工具 本方案采用 Apache Seatunnel&#xff08;简称seatunnel&#xff09;进行MySQL 到 OceanBase 的数据迁移和同步&#xff0c;出于对方案轻量性的考量&#xff0c;我们采用其内置的Zeta引擎来实现&#xff0c;包括全量同步、离线增量同步&#xff0c;以及CDC方案…

软件设计模式之简单工厂模式

目录 一.类图&#xff08;手机生产&#xff09; 二.代码实现 Iphone类&#xff1a; Vivo类&#xff1a; Mobile类&#xff1a; MobileFactory类&#xff1a; Client类&#xff1a; 一.类图&#xff08;手机生产&#xff09; 补充&#xff1a;MobileFactory也可以直接指向…

LiveGBS流媒体平台GB/T28181常见问题-视频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验

LiveGBS流媒体平台GB/T28181常见问题频流安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口流地址校验&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.…

Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

接口自动化入门 —— Http的请求头,请求体,响应码解析!

在接口自动化测试中&#xff0c;HTTP请求头、请求体和响应码是核心组成部分。理解它们的作用、格式和解析方法对于进行有效的接口测试至关重要。以下是详细解析&#xff1a; 1. HTTP 请求头&#xff08;Request Header&#xff09; 1.1 作用 请求头是客户端向服务器发送的附加…

upload-labs(1-20)详解(专业版)

目录 第1关 第2关 第3关 第4题 第5题 第6题 第7题 第8题 第9题 第10题 第11题 第12题 第13题 第1关 查看源码 在第一关是一个前端js的一个后缀识别&#xff1a;当不为jpg、png、gif时候出现弹窗 检查源码 将return checkFile() 改为 return ture 就可以将php顺利…

Linux 生成静态库

文章目录 前提小知识生成和使用.a库操作步骤 在应用程序中&#xff0c;有一些公共的代码需要反复使用的&#xff0c;可以把这些代码制作成“库文件”&#xff1b;在链接的步骤中&#xff0c;可以让链接器在“库文件”提取到我们需要使用到的代码&#xff0c;复制到生成的可执行…

ARMV8的64位指令

一、介绍 ARMv8 体系结构最大的改变是增加了一个新的 64 位的指令集&#xff0c;这是早前 ARM 指令集 的有益补充和增强。它可以处理 64 位宽的寄存器和数据并且使用 64 位的指针来访问内存。这 个新的指令集称为 A64 指令集&#xff0c;运行在 AArch64 状态。 ARMv8 兼容旧的…

PawSQL for TDSQL:腾讯云TDSQL数据库性能优化全攻略

TDSQL 作为腾讯云推出的分布式数据库&#xff0c;凭借其高扩展性、高可用性和高性能等优势&#xff0c;广泛应用于金融、互联网、政务等领域。随着业务的不断增长和数据量的爆炸式增长&#xff0c;如何优化 TDSQL 数据库的性能&#xff0c;成为众多企业和开发者面临的挑战。本文…

T-SQL 语言基础:表运算符与联接

目录 介绍表运算符概述交叉联接内联接外联接联接实例总结引用 1. 介绍 在这篇博客中&#xff0c;主要涉及 T-SQL 中的表运算符与联接。联接操作是 SQL 查询中最常用的操作之一&#xff0c;它允许我们在多个表之间进行数据关联。通过了解不同类型的联接及其应用场景&#xff…

jumpserver 网络安全 网络安全 authenticity

1.1 计算机安全的概念 1.1.1 计算机安全最核心的三个关键目标(CIA)&#xff1a; 保密性(Confidentiality)--①数据保密性&#xff08;确保隐私或秘密不向非授权者泄密或使用&#xff09;&#xff1b; ②隐私性&#xff08;确保个人能够控制或确定其自身相关的信息&#xff09…

Spring Cloud之远程调用OpenFeign参数传递

目录 OpenFeign参数传递 传递单个参数 传递多个参数 传递对象 传递JSON OpenFeign参数传递 传递单个参数 服务提供方product-service RequestMapping("/product") RestController public class ProductController {Autowiredprivate ProductService productSe…

网络安全之文件上传漏洞

一&#xff0c;文件上传漏洞的原因&#xff1a; 文件上传漏洞的存在主要是因为开发者未对用户上传的文件进行充分的安全验证&#xff0c;导致攻击者可以上传恶意文件&#xff08;如 WebShell、恶意脚本等&#xff09;到服务器&#xff0c;进而控制服务器或实施进一步攻击。 常…

Fast DDS Security--仿问控制

Fast DDS中提供了两种级别的仿问控制&#xff1a; 1 Domain Governance: 定义域级别的安全策略&#xff08;全局规则&#xff09;. 2 DomainParticipant Permissions &#xff1a; 定义参与者的具体权限&#xff08;个体规则&#xff09; 先说一下Domain Governance&#xf…

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…

基于Matlab设计GUI图像处理交互界面

Image-Processing-GUI 项目说明 本博文提供了完整的代码和使用教程&#xff0c;适合新入门的朋友参考&#xff0c;完整代码资源文件请转至文末的下载链接。 本项目是《Matlab实践》中图像处理软件题目&#xff0c;本项目实现的具体内容如下 基于Matlab设计GUI交互界面图像的…

osg安装编译第三方,完整详细过程。 libtiff/tif config.vc.hdoes not exist

第三方安装包下载地址 GitHub - bjornblissing/osg-3rdparty-cmake: CMake scripts for building OpenSceneGraph third party libraries. 在计算机中的布局 D:\CPlus\osg\src\osg-3rdparty\osg-3rdparty-cmake三层布局&#xff0c;src 放置源码 执行里面的批处理文件&#…