高效微调大型预训练模型的方法 - LoRA 微调 ChatGLM3-6B 配置参数
flyfish
LoRA (Low-Rank Adaptation) 微调是一种用于高效微调大型预训练模型的方法。LoRA 微调的核心思想是通过引入低秩矩阵来减少模型参数的数量,从而降低微调的计算成本和存储需求。
LoRA 微调的基本概念
-
低秩分解 :在神经网络中,权重矩阵通常是高维的。LoRA 通过将这些高维矩阵分解为两个低秩矩阵的乘积,从而减少参数的数量。例如,假设原始权重矩阵 W W W 的维度是 d × d d \times d d×d,LoRA 将其分解为两个低秩矩阵 A A A 和 B B B,其中 A A A 的维度为 d × r d \times r d×r 而 B B B 的维度为 r × d r \times d r×d(其中 r r r 通常远小于 d d d),因此 W W W 近似为 W + Δ W W + \Delta W W+ΔW,其中 Δ W = A × B \Delta W = A \times B ΔW=A×B。
-
冻结原始权重 :在 LoRA 微调中,预训练模型的原始权重保持冻结,即不再更新。只有新引入的低秩矩阵 A A A 和 B B B 参与训练。因此,LoRA 不仅减少了参数量,还避免了在微调过程中改变原始模型的性能。
-
高效性 :由于 LoRA 微调只涉及低秩矩阵的更新,所需的计算资源和显存占用显著减少,这使得在资源受限的情况下微调大型模型成为可能。
-
应用场景 :LoRA 微调主要应用于自然语言处理(NLP)任务中,尤其是在需要对大型语言模型(如 GPT、BERT)进行微调时。通过引入 LoRA,研究人员和开发者可以更高效地适应不同的任务,而不必微调整个模型。
LoRA 微调的配置项
data_config:
train_file: train.json
val_file: dev.json
test_file: dev.json
num_proc: 16
max_input_length: 256
max_output_length: 512
training_args:
# see `transformers.Seq2SeqTrainingArguments`
output_dir: ./output
max_steps: 3000
# needed to be fit for the dataset
learning_rate: 5e-5
# settings for data loading
per_device_train_batch_size: 4
dataloader_num_workers: 16
remove_unused_columns: false
# settings for saving checkpoints
save_strategy: steps
save_steps: 500
# settings for logging
log_level: info
logging_strategy: steps
logging_steps: 10
# settings for evaluation
per_device_eval_batch_size: 16
evaluation_strategy: steps
eval_steps: 500
# settings for optimizer
# adam_epsilon: 1e-6
# uncomment the following line to detect nan or inf values
# debug: underflow_overflow
predict_with_generate: true
# see `transformers.GenerationConfig`
generation_config:
max_new_tokens: 512
# set your absolute deepspeed path here
#deepspeed: ds_zero_2.json
# set to true if train with cpu.
use_cpu: false
peft_config:
peft_type: LORA
task_type: CAUSAL_LM
r: 8
lora_alpha: 32
lora_dropout: 0.1
LoRA 微调的配置项的解释
data_config
train_file: train.json
:训练数据集文件路径,格式为 JSON。
val_file: dev.json
:验证数据集文件路径,格式为 JSON。
test_file: dev.json
:测试数据集文件路径,格式为 JSON。
num_proc: 16
:数据处理时使用的进程数,通常用来加快数据加载速度。
max_input_length
和 max_output_length
max_input_length: 256
:输入序列的最大长度,超过这个长度的部分将被截断。
max_output_length: 512
:输出序列的最大长度,超过这个长度的部分将被截断。
training_args
这是模型训练的配置参数,下面是各个参数的解释:
output_dir: ./output
:模型和其他输出文件的保存路径。
max_steps: 3000
:训练的最大步数,达到这个步数后停止训练。
learning_rate: 5e-5
:学习率,这是控制模型更新速度的超参数。
per_device_train_batch_size: 4
:每个设备(GPU/CPU)上的训练批次大小。
dataloader_num_workers: 16
:数据加载时使用的工作线程数。
remove_unused_columns: false
:是否移除未使用的数据列。
save_strategy: steps
:保存检查点的策略,此处设置为按步数保存。
save_steps: 500
:每隔多少步保存一次模型检查点。
log_level: info
:日志记录的级别,info
表示记录一般信息。
logging_strategy: steps
:日志记录的策略,此处设置为按步数记录。
logging_steps: 10
:每隔多少步记录一次日志。
per_device_eval_batch_size: 16
:每个设备(GPU/CPU)上的验证批次大小。
evaluation_strategy: steps
:验证策略,此处设置为按步数进行验证。
eval_steps: 500
:每隔多少步进行一次验证。
predict_with_generate: true
:在预测时是否使用生成模式,一般用于序列到序列任务。
generation_config
:
max_new_tokens: 512
:生成时最多生成的 token 数。
use_cpu: false
:是否使用 CPU 进行训练,false
表示使用 GPU。
peft_config
这是针对 LoRA 微调的配置参数:
peft_type: LORA
:指定使用 LoRA 作为参数高效微调(PEFT)的方法。
task_type: CAUSAL_LM
:指定任务类型为因果语言模型(Causal Language Modeling)。
r: 8
:低秩矩阵的秩
r
r
r,决定了参数矩阵的大小。
lora_alpha: 32
:LoRA 的缩放因子,影响低秩矩阵的学习率。
lora_dropout: 0.1
:在 LoRA 微调中使用的 dropout 比例,用于防止过拟合。
这个配置文件定义了一个 LoRA 微调的完整流程,包括数据、训练参数、生成设置,以及 LoRA 特定的微调参数配置。