刚开始搞模型蒸馏那会儿,我真的是把软标签当成了万能药。心想,大模型把预测概率一吐出来,小模型跟着学不就行了?结果跑下来发现,学生模型是变小了,但精度掉得让我怀疑人生。后来翻了些资料才反应过来,原来光靠最后的软标签,小模型根本学不到大模型的“内功”。
说白了,软标签就像是师傅告诉你这道题选C,概率是多少。但中间层特征蒸馏不一样,它相当于师傅把解题的草稿纸直接递给你了。大模型在网络中间某些层提取到的特征,往往包含了非常丰富的语义信息。把这些中间特征传给学生模型,它就能明白师傅是怎么一步步把特征抽象出来的,而不仅仅是抄个最终答案。
我之前试过用一个比较深的网络去教一个结构完全不同的轻量级网络。如果只用软标签,小模型根本不知所措,因为它的网络结构根本没法复现大模型的决策路径。这时候中间层特征蒸馏就真的绝了。我们可以挑大模型几个关键层的输出,再在小模型里找对应位置的特征图,让它们尽量对齐。哪怕结构不一样,只要特征图的维度能通过简单的变换对上,小模型就能学到那种“看图说话”的感觉。
不过这里头也有个小坑。中间层特征对齐不是随便挑层就行。我一开始瞎选,结果训练起来特别不稳定,loss 乱跳。后来发现,得找那些特征语义最丰富、最具有代表性的层。而且,如果老师和学生结构差异太大,直接硬凑特征图维度效果也不好,中间往往得加个适配层去过渡一下,把维度和通道数映射到同一空间。
现在我做蒸馏,基本都不会只盯着软标签了。把中间层特征加上去,虽然训练代码稍微复杂点,要处理特征对齐和维度变换,但最后学生模型的精度提升是真的肉眼可见。尤其是那种要把大模型塞进边缘设备里的场景,中间层特征蒸馏绝对是你保住精度的救命稻草。
下次如果再遇到蒸馏效果拉胯的情况,别死磕软标签的权重了,往中间层看看,看看特征图到底学没学像。多试几个中间层,加个适配层,说不定就能豁然开朗。这招虽然写代码麻烦点,但真的好用。
参与讨论
暂无评论,快来发表你的观点吧!