Page 120 - 《软件学报》2026年第6期
P. 120

舒善富 等: 基于自适应知识蒸馏的代码大模型轻量化                                                       2439



                                                                ∂L β
                                                           k
                                                      β k+1  = β −η β ·                              (17)
                                                                 ∂β
                 其中,   η β  是  β 值的学习率,   L i   和  L i   是样本  x i  上计算的  KL  和  RKL  损失函数,  sign(·) 是符号函数. 可以发现  β 值
                                      KL   RKL
                 在向着缩小    KL  损失, 提高  RKL  损失的方向更新. 而在     AKD(θ,β) 损失函数中,   β 值是   L RKL (p,q θ ) 的权重. 因此  β 值
                                                     θ
                 更新的目的是增加       AKD(θ,β) 损失函数的值, 使   值能够获得更有效的更新.
                    综上, 本文给出自适应知识蒸馏方法的训练过程, 如算法                 1  所示. 首先, 初始化自适应参数       β, 设置正则化强度
                                 K
                 λ reg  及最大迭代次数  . 从训练数据集中随机抽取小批量样本进行训练. 在每一轮训练过程中, 输入样本                           x i  经过
                 template 方法, 使用  prompt 模板对数据进行填充, 学生模型根据输入样本           x i  生成输出概率  , 教师模型生成对应的
                                                                                      q θ
                        p. 接着, 计算知识蒸馏损失函数        KL  和                   β 进行加权求和, 得到总损失       total_loss. 在
                 输出概率                                 RKL, 并根据自适应参数
                 每个小批量的训练结束后, 基于         mini_batch_loss 更新学生模型的参数    θ. 同时, 计算正则化损失     reg_loss, 用于调整自
                 适应参数   β. 更新后的  β 参数被限制在     [0, 1] 的区间内. 经过多轮迭代优化模型, 输出经过优化的学生模型.
                 算法  1. 自适应知识蒸馏训练方法.

                                       N
                 输入: 训练数据集     D = (x i ,y i ) , 学生模型  ,           π, 自适应参数  ,      β 的学习率分别为     η θ  和  ,
                                                 π θ θ 为参数, 教师模型
                                                                              β θ 和
                                                                                                      η β
                                       i=1
                                 ϵ
                                              K
                 正则化强度    λ reg , 常数  , 最大迭代次数  ;
                 输出: 学生模型    π θ .
                 1. 初始化  ϵ = 0.0001, 正则化强度  λ reg = 0.5, 设置迭代器   k = 0, 自适应参数  β = 0.1.
                 2. for k = 0; k < K; k++ do
                 3.   β = random.choice(0.1, 0.6)
                 4.  for mini-batch B ⊂ D do
                 5.    x i  = template( )
                                x i
                 6.   for  {x i ,y i } ∈ B do
                                                (   )
                 7.      计算学生模型输出分析概率          q θ y i |x i
                                                (  )
                 8.      计算教师模型输出分析概率          p y i |x i
                 9.      kl_loss =  L KL (p,q θ )
                 10.    rkl_loss =  L RKL (p,q θ )
                 11.    total_loss =  β·rkl_loss+(1−β)·kl_loss
                 12.   end for
                                      1  ∑
                 13.   mini_batch_loss =    total_loss
                                     |B|  x i ∈B
                                           (           )
                 14.   更新  θ 参数:  θ ← θ −η θ ·∇ θ mini_batch_loss
                                   (
                 15.   reg_loss =  λ reg × −log(ϵ +|β−0.5|×2)−log(ϵ +1−|β−0.5|×2) )
                 16.   loss_beta =  − mini_batch_loss +  reg_loss
                                           (       )
                 17.   更新  β 参数:  β ← β−η β ·∇ β loss_beta
                         β 限制在  [0, 1] 区间内:  β ← min(max(β,0),1)
                 18.   将
                 19.  end for
                 20. end for
                 21. return  π θ


                  4   实验与分析

                    本实验旨在针对代码生成任务, 评估基于              AKD  方法的代码大模型生成效果. 通过对比现有先进知识蒸馏方
   115   116   117   118   119   120   121   122   123   124   125