LLM损失函数

LLM训练损失函数详解

损失函数:训练信号的来源 损失函数定义了模型的学习目标。在LLM训练的不同阶段——预训练、指令微调、对齐——使用的损失函数截然不同。理解每种损失函数的设计意图和数学特性,是构建高质量LLM的基础。 预训练:交叉熵损失 基本形式 预训练的核心是下一个token预测,使用交叉熵损失: def cross_entropy_loss(logits, labels, ignore_index=-100): """ logits: [batch, seq_len, vocab_size] labels: [batch, seq_len] """ batch_size, seq_len, vocab_size = logits.shape # 展平 logits_flat = logits.view(-1, vocab_size) labels_flat = labels.view(-1) # 计算交叉熵(忽略padding位置) loss = F.cross_entropy( logits_flat, labels_flat, ignore_index=ignore_index, reduction='mean' ) return loss Z-Loss Chinchilla引入的Z-Loss用于稳定训练。它通过对logits的log-partition-function进行正则化,防止logits过大: def z_loss(logits, coefficient=1e-4): """Z-Loss: 正则化logits的规模""" log_z = torch.logsumexp(logits, dim=-1) # [batch, seq_len] return coefficient * (log_z ** 2).mean() # 总损失 total_loss = cross_entropy_loss(logits, labels) + z_loss(logits) Z-Loss的作用: 防止某些logits变得过大(导致softmax饱和) 稳定混合精度训练 对最终性能几乎没有负面影响 Label Smoothing 标签平滑将硬标签(one-hot)软化为软标签,防止模型过度自信: def label_smoothing_cross_entropy(logits, labels, smoothing=0.1, ignore_index=-100): """带标签平滑的交叉熵""" n_classes = logits.size(-1) # 创建软标签 log_probs = F.log_softmax(logits, dim=-1) # 均匀分布的平滑 smooth_loss = -log_probs.mean(dim=-1) # 对所有类的平均log prob # 标准交叉熵 nll_loss = -log_probs.gather(dim=-1, index=labels.unsqueeze(-1)).squeeze(-1) # 混合 loss = (1 - smoothing) * nll_loss + smoothing * smooth_loss # 忽略padding mask = (labels != ignore_index) loss = loss[mask].mean() return loss 标签平滑的效果: ...

2026-07-02 · 4 min · 646 words · 硅基 AGI 探索者
LLM蒸馏技术

LLM蒸馏技术2026实践

为什么LLM需要蒸馏? 训练一个超大模型(如700B)然后部署它,成本极其高昂。知识蒸馏(Knowledge Distillation)提供了一条务实的路径:先用大模型(Teacher)的输出作为信号训练小模型(Student),让小模型在更小参数量下接近大模型的性能。 2026年,蒸馏已经成为大模型工程化的标准环节。DeepSeek-V3、Qwen-3等模型都大量使用了蒸馏技术,将超大模型的能力迁移到可部署的尺寸。 蒸馏的理论基础 软标签的信息优势 硬标签(one-hot)只包含"正确答案"的信息,而软标签(softmax概率分布)还包含"错误答案之间的关系"。例如,在分类"猫"时,软标签可能同时给出"狗"的概率0.1——这告诉Student模型"猫和狗在某种特征上是相似的"。 这种"暗知识"(Dark Knowledge)是蒸馏有效性的核心。Teacher模型的输出分布包含了其学到的类别间关系,这些信息在硬标签中完全丢失。 温度参数 温度T控制软标签的"软度": soft_label = softmax(logits / T) 高温使分布更平滑(暴露更多暗知识),低温使分布更尖锐(接近one-hot)。实践中T通常设置为2-10。 LLM蒸馏的主要方法 1. Logit级蒸馏 最经典的蒸馏方式——Student直接学习Teacher的输出概率分布: def logit_distillation_loss(student_logits, teacher_logits, labels, T=4.0, alpha=0.7): """ student_logits, teacher_logits: [batch, seq_len, vocab_size] labels: [batch, seq_len] T: 温度参数 alpha: 蒸馏损失权重 """ # 蒸馏损失:KL散度 student_log_probs = F.log_softmax(student_logits / T, dim=-1) teacher_probs = F.softmax(teacher_logits / T, dim=-1) distill_loss = F.kl_div( student_log_probs.reshape(-1, student_logits.size(-1)), teacher_probs.reshape(-1, teacher_logits.size(-1)), reduction='batchmean' ) * (T ** 2) # 梯度缩放补偿 # 任务损失:交叉熵 task_loss = F.cross_entropy( student_logits.reshape(-1, student_logits.size(-1)), labels.reshape(-1) ) return alpha * distill_loss + (1 - alpha) * task_loss 关键点: KL散度损失需要乘以 T² 来补偿温度对梯度的影响 alpha控制蒸馏与任务学习的平衡 需要Teacher和Student的词表对齐 2. 序列级蒸馏(Sequence-Level KD) 不让Student逐token模仿Teacher,而是让Student学习Teacher生成的完整序列。具体做法是先用Teacher生成大量数据,然后用这些数据训练Student: ...

2026-07-02 · 3 min · 438 words · 硅基 AGI 探索者
鲁ICP备2026018361号