网站建设费用计入管理费用的哪个科目,百度seo公司有哪些,业务外包服务公司,为什么我的网站在百度搜不到自注意力层中的 LoRA 应用
Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换#xff0c;包括键#xff08;Key#xff09;、查询#xff08;Query#xff09; 和 值#xff08;Value#xff09; 三个权重矩阵的线…自注意力层中的 LoRA 应用
Transformer 的自注意力机制是模型理解输入序列之间复杂关系的核心部分。自注意力层通常包含多个线性变换包括键Key、查询Query 和 值Value 三个权重矩阵的线性映射这些权重矩阵需要被训练来适应不同的任务。
LoRA 在自注意力层中的步骤
冻结原始权重将自注意力层中的键、查询、值矩阵的权重参数冻结不进行训练。这些原始权重是通过预训练获得的用于保留模型在大规模数据上学习到的通用知识。
添加低秩适配矩阵对于键、查询、值矩阵的权重分别添加低秩适配矩阵 A A A 和 B B B。例如如果键矩阵 W k ∈ R d k × d model W_k \in \mathbb{R}^{d_k \times d_{\text{model}}} Wk∈Rdk×dmodel则引入两个适配矩阵 A k ∈ R d k × r , B k ∈ R r × d model A_k \in \mathbb{R}^{d_k \times r}, \quad B_k \in \mathbb{R}^{r \times d_{\text{model}}} Ak∈Rdk×r,Bk∈Rr×dmodel 其中 r r r 是低秩值通常比 d k d_k dk 和 d model d_{\text{model}} dmodel 小很多。
权重变换在执行前向传播时键、查询、值矩阵的线性变换将使用 W k ′ W k A k B k W_k W_k A_k B_k Wk′WkAkBk,作为新的权重矩阵其中 W k W_k Wk 是冻结的原始权重 A k B k A_k B_k AkBk 是任务特定的微调部分。
训练适配矩阵在特定任务的微调过程中仅更新新增的适配矩阵 A k A_k Ak 和 B k B_k Bk 的参数而不更新原始的键矩阵权重。这使得微调过程变得高效和轻量化。
前馈网络中的 LoRA 应用
Transformer 的前馈网络FFN 通常由两个线性层和一个非线性激活函数如 ReLU组成。在前馈网络中参数数量非常庞大因为它在每个位置上独立地对输入进行两次线性变换。
LoRA 在前馈网络中的步骤
冻结全连接层权重前馈网络中的两个全连接层的权重也被冻结。这些层用于对每个输入位置进行独立的变换其预训练参数保持不变用于保留预训练期间获得的通用知识。
添加适配矩阵对于每个全连接层添加低秩适配矩阵。例如假设前馈网络中的第一层权重矩阵为 W f f ∈ R d f f × d model W_{ff} \in \mathbb{R}^{d_{ff} \times d_{\text{model}}} Wff∈Rdff×dmodel则 LoRA 在这个矩阵上引入两个适配矩阵 A f f ∈ R d f f × r , B f f ∈ R r × d model A_{ff} \in \mathbb{R}^{d_{ff} \times r}, \quad B_{ff} \in \mathbb{R}^{r \times d_{\text{model}}} Aff∈Rdff×r,Bff∈Rr×dmodel
权重变换与前向传播在前向传播中使用权重矩阵 W f f ′ W f f A f f B f f W_{ff} W_{ff} A_{ff} B_{ff} Wff′WffAffBff来代替原始的全连接层权重矩阵。这样前馈网络的线性变换就不仅包含原始的预训练权重还包含适配矩阵的贡献用于更好地适应特定任务。
训练适配矩阵在训练过程中仅更新适配矩阵 A f f A_{ff} Aff 和 B f f B_{ff} Bff而冻结的原始权重 W f f W_{ff} Wff 不变这大大减少了训练中需要更新的参数数量。
LoRA 在 Transformer 中的整体优势
参数效率在自注意力层和前馈网络中引入低秩适配矩阵可以大大减少需要训练的参数数量同时保留模型在大规模数据上学到的知识。
任务适应性LoRA 的方法允许对每个特定任务引入单独的低秩适配矩阵而保持预训练模型的核心不变这使得同一个预训练模型可以高效地适应多种任务。
降低计算与存储开销由于适配矩阵的秩 rrr 通常远小于模型的维度LoRA 显著降低了训练和存储的开销使得大模型在计算资源受限的情况下能够得到有效应用。
代码实现LoRA微调Bert的过程
import torch
import torch.nn as nn
import torch.optim as optim
from transformers import BertModel# 假设我们有一个预训练好的 Transformer 模型例如 BERT
pretrained_model BertModel.from_pretrained(bert-base-uncased)# 定义 LoRA 适配层
class LoRAAdapter(nn.Module):def __init__(self, input_dim, low_rank_dim):super(LoRAAdapter, self).__init__()self.A nn.Linear(input_dim, low_rank_dim, biasFalse) # 低秩矩阵 Aself.B nn.Linear(low_rank_dim, input_dim, biasFalse) # 低秩矩阵 Bdef forward(self, x):return self.B(self.A(x)) # 输出 B(A(x))# 定义一个新的 BERT 模型包含 LoRA 适配器
class LoRABertModel(nn.Module):def __init__(self, pretrained_model, low_rank_dim):super(LoRABertModel, self).__init__()self.bert pretrained_modelself.low_rank_dim low_rank_dim# 为 BERT 的每一层添加 LoRA 适配器for layer in self.bert.encoder.layer:layer.attention.self.query_adapter LoRAAdapter(layer.attention.self.query.in_features, low_rank_dim)layer.attention.self.key_adapter LoRAAdapter(layer.attention.self.key.in_features, low_rank_dim)layer.attention.self.value_adapter LoRAAdapter(layer.attention.self.value.in_features, low_rank_dim)# 冻结原始 BERT 模型的所有参数for param in self.bert.parameters():param.requires_grad False# 只训练 LoRA 适配层for layer in self.bert.encoder.layer:for param in layer.attention.self.query_adapter.parameters():param.requires_grad Truefor param in layer.attention.self.key_adapter.parameters():param.requires_grad Truefor param in layer.attention.self.value_adapter.parameters():param.requires_grad Truedef forward(self, input_ids, attention_maskNone, token_type_idsNone):# 对每一层应用 LoRA 适配器for layer in self.bert.encoder.layer:# 使用适配后的 Query、Key、Value 进行注意力计算query layer.attention.self.query(input_ids) layer.attention.self.query_adapter(input_ids)key layer.attention.self.key(input_ids) layer.attention.self.key_adapter(input_ids)value layer.attention.self.value(input_ids) layer.attention.self.value_adapter(input_ids)# 注意力计算attn_output, _ layer.attention.self.attn(query, key, value)input_ids attn_outputreturn self.bert(input_ids, attention_maskattention_mask, token_type_idstoken_type_ids)# 创建包含 LoRA 适配器的 BERT 模型
low_rank_dim 16
lora_bert LoRABertModel(pretrained_model, low_rank_dim)# 定义损失函数和优化器
criterion nn.CrossEntropyLoss()
optimizer optim.Adam(filter(lambda p: p.requires_grad, lora_bert.parameters()), lr1e-4)# 生成一些随机数据用于训练
data torch.randint(0, 30522, (8, 64)) # 随机输入数据批量大小为 8序列长度为 64
labels torch.randint(0, 2, (8, 64)) # 随机标签# 训练循环
num_epochs 5
for epoch in range(num_epochs):# 前向传播outputs lora_bert(data).last_hidden_statelogits outputs.view(-1, outputs.size(-1))labels labels.view(-1)# 计算损失loss criterion(logits, labels)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()# 打印损失值print(fEpoch [{epoch1}/{num_epochs}], Loss: {loss.item():.4f})利用LoRA对LLAMA2进行微调的代码
import torch
import torch.nn as nn
import torch.optim as optim
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset# 1. 加载预训练的 LLaMA 2 7B 模型
model_name meta-llama/Llama-2-7b-hf
tokenizer AutoTokenizer.from_pretrained(model_name)
model AutoModelForCausalLM.from_pretrained(model_name)# 2. 手动添加 LoRA 适配器
class LoRAAdapter(nn.Module):def __init__(self, input_dim, low_rank_dim):super(LoRAAdapter, self).__init__()self.A nn.Linear(input_dim, low_rank_dim, biasFalse) # 低秩矩阵 Aself.B nn.Linear(low_rank_dim, input_dim, biasFalse) # 低秩矩阵 Bdef forward(self, x):return self.B(self.A(x)) # 输出 B(A(x))# 添加 LoRA 适配器到模型的注意力层
low_rank_dim 16
for name, module in model.named_modules():if attn in name.lower() and hasattr(module, q_proj) and hasattr(module, k_proj) and hasattr(module, v_proj):# 为 Query, Key, Value 添加 LoRA 适配器input_dim module.q_proj.in_featuresmodule.q_proj_lora LoRAAdapter(input_dim, low_rank_dim)module.k_proj_lora LoRAAdapter(input_dim, low_rank_dim)module.v_proj_lora LoRAAdapter(input_dim, low_rank_dim)# 使用 hooks 修改前向传播逻辑def hook_fn_forward_q(module, input, output):return output module.q_proj_lora(input[0])def hook_fn_forward_k(module, input, output):return output module.k_proj_lora(input[0])def hook_fn_forward_v(module, input, output):return output module.v_proj_lora(input[0])module.q_proj.register_forward_hook(hook_fn_forward_q)module.k_proj.register_forward_hook(hook_fn_forward_k)module.v_proj.register_forward_hook(hook_fn_forward_v)# 3. 定义训练参数和优化器
training_args TrainingArguments(output_dir./llama2_7b_lora_finetuned,num_train_epochs3,per_device_train_batch_size4,gradient_accumulation_steps8,learning_rate1e-4,logging_dir./logs,logging_steps10,save_total_limit2,fp16True # 采用混合精度加速训练
)optimizer optim.AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr1e-4)# 4. 加载训练数据集
train_dataset load_dataset(daily_dialog, splittrain)# 5. 定义 Trainer 对象
trainer Trainer(modelmodel,argstraining_args,train_datasettrain_dataset,tokenizertokenizer,optimizers(optimizer, None)
)# 6. 开始训练
trainer.train()# 7. 验证和保存模型
trainer.evaluate()
model.save_pretrained(./llama2_7b_lora_finetuned)