大模型微调笔记

236 阅读9分钟

参数原理及其功能合集


微调方法

1. Lora(Low- Rank Adaptation)——低秩适应

Untitled

用于在不同的领域或任务之间进行知识迁移。这种方法的目标是通过使用低秩矩阵适应模型参数,从而在源领域上训练的模型更好地适应目标领域。

原理解释:

  • 在原始 PLM (Pre-trained Language Model) 旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的intrinsic rank
  • 训练的时候固定 PLM 的参数,只训练降维矩阵 A与升维矩阵B  。而模型的输入输出维度不变,输出时将 BA与 PLM 的参数叠加。
  • 用随机高斯分布初始化A  ,用 0 矩阵初始化B ,保证训练的开始此旁路矩阵依然是 0 矩阵。

升维与降维:

  • 降维(矩阵A的作用)

    • 输入:原始PLM的输出结果,假设为X,其维度为(m*n),其中m为样本数量,n是原始PLM的输出的特征维度
    • 降维:通过矩阵A进行线性变换,得到降维后的结果Z。这个过程可以表示为Z=XA。由于X(mn),A(nk),其中k<n。得到的结果Z为(m*k)。这样就吧特征维度降为k维。
  • 升维(矩阵B的作用)

    • 降维之后Z的维度为mk。通过Y=ZB,使Y的维度变为mn
  • 输出原始PLM的输出结果与升维后的结果,即X’ = X + Y

总体来说,整个过程可以解释为: X=X+ZB=X+XABX' = X + ZB = X + XA*B 优势:

  • A与B的参数想需要进行训练的。相对于调整X中所有的参数,这里只需要训练A和B的参数,这样可以使模型专注于学习如何调整表示而不是重新学习,有助于防止过拟合。
  • 原始PLM是已经训练好的模型,具有了较高的表达能力,所以我们并不需要调整PLM,这样可以实现迁移学习的效果。

2. Full(完全调整)

Full模型调整方式下,所有参数都会调整,包括预训练模型的参数和新任务上引入的任何参数。

这种方式下,模型在适应新任务时非常灵活,但是需要更多的标注数据以避免过拟合。

个人训练的话不建议Full方法

3. Freeze(冻结部分参数)

在Freeze下一些参数会被冻结,不参与训练过程。通常来说会冻结预训练模型的参数,在新任务中引入的一部分参数是可以训练的。

这种方式下,可以更好地利用预训练模型,尤其是在新任务数据较少的情况下,有助于防止过拟合。

LORA和Freeze的比较

  • 任务特性:  选择使用哪种方式取决于任务的性质,如果新任务与预训练模型非常相关,则"LORA"可能更有优势;而如果新任务与预训练模型关系较小,或者数据有限,则"Freeze"可能更适用。
  • 计算资源:  "Freeze"通常需要较少的计算资源,因为只有新任务的一部分参数需要训练;而"LORA"可能需要更多的资源,因为引入了降维和升维的操作。

适配器

用于在已经预训练的大模型上进行特定任务的微调。适配器的作用是在模型的中间层添加一些小型的、任务特定的参数,而不需要修改整个预训练模型的参数。这些适配器参数专门用于处理微调任务,使模型可以更好地适应特定领域或者任务。

在LLama中,适配器为调用曾经训练好的历史模型。

优势:

  • 参数少
  • 保护预训练权重
  • 灵活

高级设置

1. 量化等级

Untitled

量化等级是指对模型权重进行量化(quantization)的程度。量化是一种降低模型存储需求和计算复杂度的技术,通过减少权重的位数来表示,从而减少模型的体积,加速推理过程。

通常,量化等级表示将浮点数权重映射到整数或较短的定点数到程度。

常见的量化等级:

  1. 低精度浮点数量化:

    模型的权重会被表示为较短的浮点数,减少了模型的内存占用和计算需求。

  2. 整数量化

    模型的权重会被表示为8位整数,进一步减少了存储需求和计算负载。然而整数可能会引入一些精度损失。

  3. 二值量化

    在此等级下,权重只能取两个值:+1或者-1。虽然进一步减少了计算负载,但是引入了更大的精度损失。

2. 提示模板(Prompt)

提示模板是一种用于指导模型生成文本的输入形式。

这些提示模板通常是包含占位符的文本,模型会根据这些占位符来生成特定的输出。

一些提示模板种类:

  1. 结构指导:提示模板可以包含特定的结构或格式,以确保生成的文本符合特定的布局或风格要求。例如,一个结构指导的提示模板可能包含标题、正文和结论的占位符,使模型按照这种结构生成文本。
  2. 主题引导:通过在提示模板中提供关键词或主题的占位符,可以引导模型生成与特定主题相关的内容。这有助于确保生成的文本在主题上保持一致。
  3. 语气和风格引导:提示模板可以包含描述语气和风格的占位符,以确保生成的文本符合特定的语言风格或情感色彩。例如,可以指定正式、轻松、严肃等语气。
  4. 上下文引导:在提示模板中提供上下文信息,以便模型可以理解当前生成文本的背景。这有助于生成更连贯和合理的文本,考虑到前面已经生成的内容。
  5. 任务引导:提示模板可以明确指定模型需要执行的任务,例如回答问题、描述场景、生成对话等。这有助于模型理解任务要求并生成相应的文本。
  6. 实体引导:在提示模板中标记实体的位置,以引导模型关注或生成与这些实体相关的文本。这对于特定领域的信息生成非常有用。

3.RoPE插值方法

具体原理:www.zhihu.com/tardis/zm/a…

原理视频:【RoPE旋转位置编码原理解读-哔哩哔哩】 b23.tv/tCBkwjz

RoPE(Rotary Positional Embedding)是一种用于处理长文本序列的技术,特别是在NLP中。这个方法旨在改进模型对于序列中不同位置信息的捕捉。RoPE具有很好的外推性。

外推性是指大模型在训练时和预测时的输入长度不一致,导致模型的泛化能力下降的问题。

在Transformer中,Positional Embedding被引入以位模型提供关键词语在序列中位置的信息。然而当序列变得非常长时,传统的位置前乳无法捕获位置信息,导致性能下降。RoPE插值方法通过旋转位置嵌入来解决这个问题。

RoPE的几个步骤:

  1. 位置旋转嵌入

    RoPE使用了特殊的旋转矩阵,将传统的位置嵌入进行旋转。这样,每个位置的嵌入都会收到相邻位置的嵌入影响,从而更好地捕获上下文信息

  2. 插值

    旋转后的位置嵌入与原始位置嵌入进行插值。这是通过线性插值或其他插值方法实现的,确保在模型训练过程中逐渐引入旋转后的位置信息,而不是突然引入

  3. 渐进改进

    RoPe采用主线增加旋转角度的方式,渐进地引入旋转信息。这有助于模型逐渐适应更复杂的位置信息,而不至于在一开始就引入过多旋转。

none

linear

dynamic

4.加速方法

flash_attention

具体原理:zhuanlan.zhihu.com/p/618533434

由于transformer中的自注意力机制的时间和存储复杂度在序列长度上属于二次型,所以若想为其配备更长的上下文背景,仍需面对非常大的挑战。

于是有人提出近似注意点方法,旨在减少注意力计算和内存需求。FlashAttention的运行速度比PyTorch标准注意力快2-4倍,所需内存减少5-20倍

unsloth

非常新23年12月14号刚刚提出的新开源方法。以50%的内存使用量达到2-4倍的训练速度。

github源码:github.com/unslothai/u…


Train

1. 训练阶段

Supervised Fine-Tuning(监督微调)

主要应用于迁移学习场景。基本思想是,首先在一个大规模的标注数据集上对模型进行预训练,然后通过微调将该模型适应到特定的目标任务上。

  1. 初始训练

    使用大规模的的未标记数据,使模型学习到了语言的一般特征和结构。

  2. 监督学习

    为了完成特定任务,模型需要进行监督学习。这时会使用带有标签的数据集,其中每个样本都有输入和对应输出标签。

  3. 微调

    模型在任务特定的标注数据上进行进一步的训练,以适应任务的特殊要求

Reward Modeling(奖励建模)

设计一个有效的奖励函数用于衡量模型在执行任务时的性能。通过优化算法,使用奖励信号来更新参数

PPO(Proximal Policy Optimization)近端优化策略

算法推导:zhuanlan.zhihu.com/p/62654423

与强化学习相关,不懂

PPO的核心思想是在更新策略时保持新策略和旧策略之间的相对差异在一个合理的范围内。这是通过引入一个“裁剪”项来实现的,该项确保新策略相对于旧策略的变化不会太大。这种限制有助于防止策略更新过于剧烈,可能导致性能不稳定

DPO(Distributed Proximal Optimization)

是一种将PPO方法扩展到分布式计算环境的策略。这种方法通常用于大规模机器学习问题,其中模型参数的优化需要在多个计算节点进行协同工作。