迁移学习 ¶
约 1424 个字 3 张图片 预计阅读时间 6 分钟
fine-tuning¶
核心思想:
深度学习可以分成两个阶段:特征提取和分类
如果在一个大的复杂的数据集上进行训练,那么模型可以学习到一些通用的特征,这些特征可以用于其他任务。
那么我们就可以把在大的数据集上训练的模型,在小的数据集上进行微调,从而得到一个更好的模型。
数据集选择 ¶
源数据集和目标数据集的分布要尽可能的相似,否则微调的效果会不好。
现在公司都把在大的数据集上预训练的模型当作自己的财产,不会轻易的分享出来。
- 预训练模型的质量非常重要;微调通常速度更快、精度更高
- 源数据集远复杂于目标数据,通常微调效果更好
全量微调 ¶
- 使用更强的正则化 - 使用更小的学习率 - 使用更少的数据迭代
部分微调 ¶
- 底部层的特征更加通用,高层的特征与数据集与任务更相关,所以可以固定底部一些层的参数,不参与更新。
重用标号 ¶
Adapter¶
Adapt Tuning。即在模型中添加 Adapter 层,在微调时冻结原参数,仅更新 Adapter 层。
具体而言,其在预训练模型每层中插入用于下游任务的参数,即 Adapter 模块,在微调时冻结模型主体,仅训练特定于任务的参数
LoRA¶
LORA: Low-rank Adaptation of Large Language Models
假设: 原始权重矩阵 \(W_0\) 很大,比如是 \(1000 \times 1000\) 的矩阵。我们不想直接更新它,而是假设:
它的变化 \(\Delta W\)(更新量)其实可以用一个更小、更低秩的矩阵来逼近。
why LoRA
- 大模型参数太多(比如 Transformer
) ,微调(fine-tuning)它们时,需要更新所有的参数,成本非常高。 - 检查点(checkpoint)太大、部署与存储困难
- 如果只想让模型适应一个新任务(比如翻译、摘要
) ,有没有办法只更新很少的参数,而不是几亿个?
你有一个训练好的机器人大脑(\(W_0\)
) ,你不想动它。你只是在它脑子里 加了一个轻量级插件(\(BA\)),这个插件能稍微影响它的行为,但又不会破坏它本来的“知识”。
问题 1: 我们需要找到并调整所有参数吗?
问题 2: 对于微调的权重矩阵,更新在矩阵秩方面应该具有多大的表现力?更新应该如何表达
所以,LoRA 可以视作是全量微调的简化版。只要有矩阵乘法存在的地方,我们就可以考虑使用 LoRA
怎么做?¶
原始权重矩阵 \(W_0\) 很大,比如是 \(1000 \times 1000\) 的矩阵。我们不想直接更新它,而是假设:
它的变化 \(\Delta W\)(更新量)其实可以用一个更小、更低秩的矩阵来逼近。
我们用两个小矩阵 \(B\) 和 \(A\) 来构造这个更新:
这样,我们不直接训练大矩阵 \(W_0\),而是只训练这两个小矩阵 \(B\) 和 \(A\),其中 \(r\)(秩)远远小于 \(d\) 和 \(k\),比如 \(r = 4\)。
所以:
LoRA 让模型 保留原本的表达能力(\(W_0 x\)),同时通过 \(BAx\) 进行轻量级调整。
初始化策略
- \(A\) 是随机初始化(高斯分布)
- \(B\) 是全零初始化 这样刚开始时:
模型只在训练过程中逐渐学会适应新任务。
如果表现不好,可以尝试: - 增加秩 - 增加数据
优点 ¶
- checkpoint 大大减小:GPT3 从 1TB 减少到 25MB;训练参数从 1750 亿到 470 万
- A Generalization of Full Fine-tuning
In other words, as we increase the number of trainable parameters 3, training LoRA roughly converges to training the original model, while adapter-based methods converges to an MLP and prefix-based methods to a model that cannot take long input sequences.
- No Additional Inference Latency
transformer 应用 ¶
原则上,我们可以将 LoRA 应用于神经网络中的任何一部分权重矩阵,从而减少训练中需要更新的参数数量。
在 Transformer 结构中,LoRA 技术主要应用在注意力模块的四个权重矩阵:\(W_{q}\)、\(W_{k}\)、\(W_{v}\)、\(W_{0}\),而冻结 MLP 的权重矩阵。 通过消融实验发现同时调整 \(W_{q}\) 和 \(W_{v}\) 会产生最佳结果。 在上述条件下,可训练参数个数为: \(\(\Theta = 2 \times L_{LoRA} \times d_{model} \times r\)\)
其中,\(L_{LoRA}\) 为应用 LoRA 的权重矩阵的个数,\(d_{model}\) 为 Transformer 的输入输出维度,r 为设定的 LoRA 秩。
一般情况下,r 取到 4、8、16。
尽管每个注意力头只使用了权重矩阵的一部分(例如,输出会被切分成多个头
diffusion 应用 ¶
工程细节 ¶
- 部署期间将许多 LoRA 模块缓存在 RAM 当中
- 并行训练多个 LoRA 模块,每个模块执行自己的任务,共享基础模型
- LoRA 模型是可加性的,model switching 变成了 tree traversal。Base model is only instantiated once.
SFT: Supervised Fine-tuning¶
P-tuning¶
RLHF¶
代码 - llama-factory ¶
llama-factory SFT 系列教程 ( 二 ),大模型在自定义数据集 lora 训练与部署 _llama-factory 自定义数据集 -CSDN 博客
Acknowledgement¶
- LLLM-Lab 深入浅出 LoRA - 知乎