核心要点

  • 冻结即把该层参数设为不参与更新(requires_grad=False),前向照常、反向不计算它的梯度

  • 显存与算力:被冻结的参数不需存梯度和优化器状态(Adam 还要额外两份动量),是显存大头的节省

  • 过拟合与灾难性遗忘:保留预训练学到的通用特征,避免小数据上被冲掉

  • 常见做法:冻结 embedding 与底层、只调高层或新增任务头;LoRA 本质也是冻结原权重、只训旁路低秩矩阵

标准回答

什么是冻结层

冻结层指在微调时把某些层的参数标记为不可训练(在 PyTorch 里就是设置 requires_grad=False)。这些层在前向传播中照常参与计算、输出特征,但在反向传播时不会为它们计算梯度,优化器也不会更新它们,相当于把它们当成固定的特征提取器。

为什么要冻结:省显存与算力

训练时的显存大头不只是参数本身,还有为每个可训练参数保存的梯度和优化器状态。以 Adam 为例,一个可训练参数除了权重,还要额外存梯度、一阶动量、二阶动量。把一层冻结后,这些附加状态全部省掉,反向传播也不必回传到它,因此显著降低显存占用并加快每步训练。这正是在有限显卡上微调大模型的常用手段。

为什么要冻结:防过拟合与灾难性遗忘

预训练模型的底层通常学到的是通用、可迁移的表征。下游数据往往规模小,如果放开所有参数全量微调,模型容易在小数据上过拟合,也容易发生灾难性遗忘——把预训练阶段获得的通用能力覆盖掉。冻结底层、只调上层,能保留这些通用特征,让模型在新任务上更稳、泛化更好。

常见做法

典型策略是冻结 embedding 层和靠近输入的底层,只微调靠近输出的高层,或者干脆冻结整个主干、只训练新增的任务头(如分类头)。需要适配的能力越深,放开的层数就越多。LoRA 等参数高效微调本质上也是冻结:它把原始权重整体冻住,只在旁路插入并训练一对低秩矩阵,用极少的可训练参数撬动大模型。

权衡

冻结得越多,越省显存、越快、越不容易过拟合和遗忘,但模型能调整的自由度也越低,性能上限可能受限;任务与预训练分布差异大时,冻太多会欠拟合。实践中常按「先冻大部分、按需逐步解冻」或直接上 LoRA 来平衡效率与效果。

常见误区

⚠️ 常见踩坑

以为冻结层在前向时也被跳过——其实它照常参与前向计算、只是不更新参数;以为冻结只是为了防过拟合而忽略它对显存的巨大节省(梯度+优化器状态才是大头);以为冻结越多总是越好,实际上任务差异大时冻太多会欠拟合、性能上限被压低。

追问

追问 1冻结层和 LoRA 在「省显存」上的机制有什么异同?

相同点是两者都不更新原始权重,因此都省掉了原权重的梯度和优化器状态,这是显存节省的主要来源。不同点在于,纯冻结意味着这部分能力完全不变;LoRA 在冻结原权重的同时,额外引入一对极小的低秩矩阵作为可训练旁路,用很少的新增参数获得接近全量微调的表达能力。所以 LoRA 既享受冻结带来的省显存,又比硬冻结保留了更高的调整自由度。

追问 2冻结了某层,它前面的层还需要算梯度吗?

要分情况。梯度是从输出往输入回传的,如果某个冻结层后面(更靠近输出)还有需要更新的层,那么梯度必须穿过这个冻结层继续往前传,所以它的反向计算不能省,只是不为它自身的参数更新;只有当一个层之前(更靠近输入)的所有层都被冻结时,反向传播才能在该处提前截断,彻底省掉前面这些层的反向计算。这也是为什么「冻结连续的底层」比「零散冻结中间层」更省算力。

追问 3什么时候应该逐步解冻而不是一开始就全部解冻?

当下游数据较少、或新任务与预训练分布接近时,适合逐步解冻:先只训任务头让其稳定,再由上而下逐层放开(如 ULMFiT 的做法),可避免训练初期大梯度冲毁底层通用特征,降低过拟合与遗忘风险。反之,如果数据充足且任务差异大,一开始就较多解冻甚至全量微调反而能更快收敛到更高上限。逐步解冻本质是用「先稳后放」的节奏,在稳定性和适配能力之间做权衡。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习