038、替换激活函数能涨几个点?SiLU、Mish、GELU、ReLU 在 YOLO 上的消融实验
038、替换激活函数能涨几个点?SiLU、Mish、GELU、ReLU 在 YOLO 上的消融实验
上个月调一个YOLOv8的工地安全帽检测项目,客户要求mAP从0.89提到0.92,死活差那两三个点。试了数据增强、调学习率、加注意力机制,效果都像挤牙膏。后来翻到一篇论文说激活函数对梯度流有影响,抱着试试看的心态把SiLU换成了Mish,结果在验证集上直接涨了0.8个点。当时就愣住了——一个激活函数替换,居然比调三天学习率还管用。
从那以后,我养成了个习惯:每次新项目,先跑一轮激活函数消融实验。今天就把YOLOv6、YOLOv8、YOLOv11上SiLU、Mish、GELU、ReLU这四种激活函数的实测结果和踩坑记录分享出来。
为什么激活函数能影响检测精度?
很多人觉得激活函数就是个非线性映射,随便选一个就行。但实际训练中,激活函数决定了梯度回传的质量。SiLU(也叫Swish)在YOLOv5/v8里是默认配置,因为它平滑且非单调,能让负值区域保留少量梯度,避免神经元死亡。但Mish在负值区域更“柔和”,梯度曲线更平滑,对深层网络的梯度流更友好。GELU则引入了随机正则化的思想,在Transformer里大放异彩,但放到CNN检测头里效果如何,得看具体任务。
ReLU虽然简单,但负值区域直接截断,容易导致神经元“死掉”——尤其是检测头里那些负责小目标的通道,一旦死了就再也活不过来。YOLOv6官方曾经尝试过用ReLU替换SiLU,结果在COCO上掉了0.3个点,但推理速度提升了5%,这就是典型的精度-速度权衡。
