知识蒸馏(KD)的主要问题在于准确界定要从教师模型传递给学生模型的是何种知识,以及如何衡量这种传递的成效。实现此目的的机制是蒸馏目标或损失函数。它量化了教师模型行为与学生模型行为之间的差异,以此引导学生模型的训练过程。尽管最初的KD方法主要侧重于匹配输出分布,但目前已发展出多种复杂的训练目标,以获取教师模型中包含的更丰富的信息。软目标:匹配输出分布最基本的KD目标由Hinton等人(2015)提出,它包含训练学生模型去模仿教师模型在类别或标记上的输出概率分布。简单匹配最终预测(硬标签)是不够的,因为教师模型的分布通常包含关于类别关系或标记可能性的细微信息——这些信息在转换为单一硬预测时就会丢失。为提取这些更丰富的信息,在应用于logits(即最终激活前的原始、未归一化输出)的softmax函数中引入了一个温度缩放参数$T$。$$ \sigma(z_i, T) = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)} $$这里,$z_i$ 是类别或标记$i$的logit。较高的温度($T > 1$)会使概率分布更平滑,使得概率值彼此靠近,从而显示出教师模型分配给不同输出的相对相似性。当温度$T=1$时,则恢复为标准softmax。蒸馏损失$L_{KD}$通常是学生模型的平滑预测($p_S = \sigma(z_S, T)$)与教师模型的平滑预测($p_T = \sigma(z_T, T)$)之间的Kullback-Leibler(KL)散度:$$ L_{KD} = T^2 \cdot D_{KL}(p_S || p_T) = T^2 \sum_i p_T(i) \log \frac{p_T(i)}{p_S(i)} $$$T^2$缩放因子很重要。因为平滑目标产生的梯度相对于硬目标产生的梯度按$1/T^2$缩放,所以将KD损失乘以$T^2$可以确保即使温度$T$发生变化,KD损失在训练期间的相对贡献也大致保持不变。这个目标鼓励学生模型不仅要预测正确的输出,还要理解教师模型为何这样预测,从而习得输出之间的关系。在实践中,这个$L_{KD}$通常与针对真实硬标签的标准监督损失(例如交叉熵$L_{CE}$)相结合,使用加权因子$\alpha$:$$ L_{Total} = \alpha L_{CE}(y_{true}, \sigma(z_S, T=1)) + (1 - \alpha) L_{KD}(\sigma(z_S, T), \sigma(z_T, T)) $$这确保了学生模型在从教师模型的软目标中受益的同时,仍能学习匹配真实标签。选择最佳温度$T$和权重$\alpha$通常需要经验调整。中间表示匹配尽管匹配输出分布是有效的,但知识并非仅包含在最终层中。像LLM这样的深度网络的中间层会学习分层表示,这些表示捕获了语法、语义和上下文信息。蒸馏这种中间知识可以为学生模型提供更强的指导。这里的目标是最小化教师模型($h_T^l$)和学生模型($h_S^l$)中选定中间层的隐藏状态或激活之间的差异。为此常用的损失函数包含:均方误差(MSE): 直接最小化欧几里得距离。 $$ L_{Intermediate}^{MSE} = \sum_{l \in L_{match}} || f_S(h_S^l) - f_T(h_T^l) ||_2^2 $$余弦相似度损失: 最大化余弦相似度,侧重于表示向量之间的角度而非其大小。在大小可能显著不同时很有用。 $$ L_{Intermediate}^{Cosine} = \sum_{l \in L_{match}} (1 - \cos(f_S(h_S^l), f_T(h_T^l))) $$这里,$L_{match}$是用于匹配的层索引集。函数$f_S$和$f_T$表示可选的转换层(例如线性投影),用于在学生模型和教师模型的层具有不同隐藏大小时对齐维度。中间匹配的考量包含:层选择: 哪些层包含最有价值的可传递信息?早期层可能捕获基本特征,而更深的层则捕获更抽象的内容。匹配多个层是常见的做法。架构不匹配: 如果学生模型的层数少于教师模型,则需要策略来将教师模型层映射到学生模型层(例如,将学生模型的最后一层与教师模型的最后一层匹配,或使用学习到的投影)。计算成本: 计算这些损失会增加训练过程的开销,尤其是在匹配大型激活张量时。注意力转移对于基于Transformer的LLM,自注意力机制是一个界定性组件。注意力图表示了不同位置标记之间的加权关系,其编码了重要的结构和上下文信息。转移这种注意力知识可以帮助学生模型学习相似的关系模式。注意力转移(AT)目标最小化相应层中的注意力图($A_T^l, A_S^l$)之间的差异:$$ L_{Attention} = \sum_{l \in L_{match}} \frac{1}{N_h} \sum_{h=1}^{N_h} || A_{S,h}^l - A_{T,h}^l ||_F^2 $$其中$N_h$是注意力头的数量,$|| \cdot ||_F^2$表示层$l$中头$h$的注意力矩阵之差的平方Frobenius范数(平方元素之和)。挑战包含:头部映射: 如果学生模型和教师模型的注意力头数量不同,则需要映射策略(例如,平均教师模型的头部,使用学习到的投影)。计算开销: 存储和比较注意力图会增加内存和计算需求。解释性: 尽管注意力模式提供了信息,但与匹配隐藏状态相比,直接强制学生模型匹配这些模式可能过于严格。对比学习目标对比目标侧重于学习相似性和非相似性,而非直接逐元素(如MSE)或逐角度(如余弦)匹配表示。对比表示蒸馏(CRD)旨在训练学生模型,使其为相同输入(正例对)生成的表示接近教师模型的表示,但远离不同输入(负例对)的教师模型表示。总的来说,该损失鼓励$sim(z_S, z_T)$对于相同输入较高,而$sim(z_S, z_{T,neg})$应较低,其中$z_{T,neg}$是批次中或记忆库中其他输入的教师模型表示。典型的损失函数如InfoNCE可以被调整:$$ L_{Contrastive} \propto -\log \frac{\exp(sim(f_S(h_S), f_T(h_T))/\tau)}{\sum_{h_{T,neg}} \exp(sim(f_S(h_S), f_T(h_{T,neg}))/\tau)} $$这里,$sim$是一个相似性函数(例如点积或余弦相似度),$\tau$是一个温度参数,用于控制负样本分布的锐度,求和是针对负教师模型表示进行的。$f_S$和$f_T$再次是可能的投影头部。对比目标在学习教师模型表示空间的潜在结构方面可以很强大,无需严格的逐元素对齐,这可能为学生模型提供更大的灵活性。组合蒸馏目标通常,最有效的蒸馏策略包含组合多个目标。不同的目标捕获了教师模型知识的互补方面。例如,可以将软目标匹配与中间特征匹配和注意力转移相结合:$$ L_{Total} = \lambda_{KD} L_{KD} + \lambda_{Inter} L_{Intermediate} + \lambda_{Attn} L_{Attention} + \dots $$超参数$\lambda_i$控制每个目标的相对重要性。选择正确的组合并调整这些权重是设计成功蒸馏流程的核心部分,通常需要根据具体任务、教师-学生模型架构配对和性能指标进行大量实验。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial"]; edge [fontname="Arial", fontsize=10]; subgraph cluster_teacher { label = "教师模型"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; T_Input [label="输入", shape=cds, style=filled, fillcolor="#e9ecef"]; T_Emb [label="嵌入", style=filled, fillcolor="#dee2e6"]; T_L1 [label="第1层\n(隐藏状态 H_T1, 注意力 A_T1)", style=filled, fillcolor="#ced4da"]; T_L2 [label="第N层\n(隐藏状态 H_TN, 注意力 A_TN)", style=filled, fillcolor="#ced4da"]; T_Output [label="Logits z_T", style=filled, fillcolor="#adb5bd", shape=cds]; T_Input -> T_Emb [color="#868e96"]; T_Emb -> T_L1 [label="...", color="#868e96"]; T_L1 -> T_L2 [label="...", color="#868e96"]; T_L2 -> T_Output [color="#868e96"]; } subgraph cluster_student { label = "学生模型"; style=dashed; color="#adb5bd"; bgcolor="#f8f9fa"; S_Input [label="输入", shape=cds, style=filled, fillcolor="#e9ecef"]; S_Emb [label="嵌入", style=filled, fillcolor="#dee2e6"]; S_L1 [label="第1层\n(隐藏状态 H_S1, 注意力 A_S1)", style=filled, fillcolor="#ced4da"]; S_L2 [label="第M层\n(隐藏状态 H_SM, 注意力 A_SM)", style=filled, fillcolor="#ced4da"]; S_Output [label="Logits z_S", style=filled, fillcolor="#adb5bd", shape=cds]; S_Input -> S_Emb [color="#868e96"]; S_Emb -> S_L1 [label="...", color="#868e96"]; S_L1 -> S_L2 [label="...", color="#868e96"]; S_L2 -> S_Output [color="#868e96"]; } T_Output -> S_Output [label=" L_KD (软目标)\n (KL散度)", style=dotted, color="#f03e3e", fontcolor="#f03e3e", constraint=false, penwidth=1.5]; T_L2 -> S_L2 [label=" L_中间表示\n (H上的MSE/余弦)", style=dotted, color="#1c7ed6", fontcolor="#1c7ed6", constraint=false, penwidth=1.5, pos="e,10,15 s,-10,-15"]; T_L1 -> S_L1 [label=" L_注意力\n (A上的MSE)", style=dotted, color="#12b886", fontcolor="#12b886", constraint=false, penwidth=1.5, pos="e,-10,-15 s,10,15"]; // 用于对齐的隐形边 T_Input -> S_Input [style=invis]; }教师模型和学生模型之间的知识传递点,显示了常见的蒸馏目标:匹配输出logits($L_{KD}$)、中间隐藏状态($L_{Intermediate}$)和注意力图($L_{Attention}$)。选择合适的单一目标或目标组合,很大程度上取决于教师模型和学生模型的具体特点、可用数据、计算预算以及学生模型大小、速度和保真度之间所需的权衡。