推荐阅读
- 先读 Transformer 与预训练-微调范式
- 再看提示工程、对齐与评测方法
- 最后看推理部署、成本优化与安全控制
副标题 / 摘要 LoRA 的初始化方式会直接影响训练稳定性与收敛速度。本文按 ACERS 结构对比标准正态、He、Xavier 与归一化初始化,并提供最小 PyTorch 示例。 预计阅读时长:14~18 分钟 标签:lora、initialization、finetuning SEO 关键词:LoRA, 初始化, He, Xavier 元描述:对比 LoRA 的常见初始化策略与工程取舍,给出可运行代码。 目标读者 正在做 LoRA 微调的入门读者 需要提升训练稳定性与收敛速度的工程实践者 想系统理解初始化策略的开发者 背景 / 动机 LoRA 把低秩矩阵插入到线性层中,新增参数很少。 但“初始化方式”决定了模型初始扰动幅度,进而影响收敛与稳定性。 在实际工程中,初始化常常比优化器参数更敏感。 核心概念 低秩分解:LoRA 用 W + ΔW 表达更新,其中 ΔW = B A。 缩放系数:常用 α / r 控制 LoRA 更新幅度。 初始化策略:决定 A 与 B 的初始分布。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 LoRA 的核心是“在不改动原权重的情况下,增加一个低秩增量”。 初始化方式决定了这个增量是否“从 0 开始”以及“起步有多快”。 基础示例(1) 若 B 初始化为全 0:模型初始行为与原模型一致,训练更稳定。 基础示例(2) 若 A 与 B 都较大:初始扰动过强,可能导致 loss 波动。 实践指南 / 步骤 选择 LoRA rank r 与缩放系数 α。 选初始化策略:保守(B=0)或激进(He/Xavier)。 小批量跑 100~200 steps 观察 loss 变化。 若发散,优先减小初始化尺度或 α。 可运行示例(最小 PyTorch LoRA 初始化) import torch import torch.nn as nn torch.manual_seed(42) class LoRALinear(nn.Module): def __init__(self, in_dim, out_dim, r=4, alpha=8, init="normal"): super().__init__() self.weight = nn.Parameter(torch.randn(out_dim, in_dim) * 0.02) self.r = r self.alpha = alpha self.scale = alpha / r self.A = nn.Parameter(torch.zeros(r, in_dim)) self.B = nn.Parameter(torch.zeros(out_dim, r)) self.reset_parameters(init) def reset_parameters(self, init): if init == "normal": nn.init.normal_(self.A, mean=0.0, std=0.02) nn.init.zeros_(self.B) elif init == "he": nn.init.kaiming_normal_(self.A, nonlinearity="linear") nn.init.zeros_(self.B) elif init == "xavier": nn.init.xavier_normal_(self.A) nn.init.zeros_(self.B) elif init == "normalized": nn.init.normal_(self.A, mean=0.0, std=1.0 / (self.r ** 0.5)) nn.init.zeros_(self.B) else: raise ValueError("unknown init") def forward(self, x): delta = (self.B @ self.A) * self.scale w = self.weight + delta return x @ w.t() x = torch.randn(2, 8) layer = LoRALinear(8, 4, r=4, alpha=8, init="xavier") print(layer(x).shape) 解释与原理 经典 LoRA 做法是让 B 初始化为 0:初始增量为 0,稳定。 A 的初始化控制低秩子空间的方向分布。 He/Xavier 更适合在“非线性后接层”使用,但 LoRA 通常在 linear 上。 C — Concepts(核心思想) 方法类型 LoRA 初始化属于权重初始化范式,核心目标是控制梯度尺度与稳定性。 ...
副标题 / 摘要 LLaMA 使用 RMSNorm 替代 LayerNorm,主要是为了简化计算、提升训练稳定性与推理效率。本文用公式、示例与工程场景讲清差异,并提供最小 PyTorch 代码。 预计阅读时长:12~16 分钟 标签:rmsnorm、layernorm、llama、pytorch SEO 关键词:RMSNorm, LayerNorm, LLaMA, 归一化 元描述:解释 RMSNorm 与 LayerNorm 的差异与优势,并给出可运行的 PyTorch 示例。 目标读者 想理解 LLaMA 架构细节的入门读者 关注训练/推理效率的工程实践者 需要在模型中选择归一化方案的开发者 背景 / 动机 归一化是稳定训练的关键步骤。 LayerNorm 是 Transformer 的默认选择,但在大模型中成本可观。 RMSNorm 用更少的计算达到相似效果,是 LLaMA 等模型的常见替代。 核心概念 LayerNorm(LN):对每个 token 的特征维度做均值和方差归一化。 RMSNorm:只做均方根归一化,不减均值。 缩放参数:两者都保留可学习的缩放向量 g。 A — Algorithm(题目与算法) 用通俗语言说明主题内容 LayerNorm:把每个 token 的特征变成“均值 0、方差 1”。 RMSNorm:只把特征的“幅度”缩放到稳定范围,不强制均值为 0。 基础示例(1) 输入向量 [1, 2, 3],LN 会中心化;RMSNorm 只缩放长度。 基础示例(2) 在大 batch 推理时,RMSNorm 少了一次均值计算,吞吐更高。 实践指南 / 步骤 若追求推理效率与训练稳定性,优先尝试 RMSNorm。 如果模型对偏移敏感,可保留 LN 或搭配残差调参。 对比训练曲线与损失波动,确认稳定性。 可运行示例(最小 PyTorch 对比) import torch import torch.nn as nn torch.manual_seed(42) class RMSNorm(nn.Module): def __init__(self, dim, eps=1e-6): super().__init__() self.eps = eps self.weight = nn.Parameter(torch.ones(dim)) def forward(self, x): # x: (..., dim) rms = x.pow(2).mean(dim=-1, keepdim=True).add(self.eps).sqrt() x = x / rms return x * self.weight x = torch.randn(2, 4, 8) ln = nn.LayerNorm(8) rms = RMSNorm(8) out_ln = ln(x) out_rms = rms(x) print(out_ln.mean(dim=-1)) print(out_rms.mean(dim=-1)) print(out_ln.std(dim=-1)) print(out_rms.std(dim=-1)) 解释与原理 LN 同时消除均值与缩放;RMSNorm 只控制尺度。 RMSNorm 计算少、数值更稳定,适合大模型训练。 由于不做中心化,RMSNorm 可能保留有用的偏移信息。 C — Concepts(核心思想) 方法类型 两者都属于特征归一化,用于稳定训练并加速收敛。 ...