激活函数在神经网络里是一个重要的组件,大家最常用的是ReLU,其变种在各种任务/模型中都有较好的效果。Swish这种搜索得到的激活函数,在部分数据集上也能超越ReLU,但是搜索效率不够高。
为此我们提出了Piecewise Linear Unit,分段线性激活函数,通过公式设计+可学习参数,能够达到SOTA的结果。
论文:https://arxiv.org/abs/2104.03693
早期的激活函数都是由手工设计的,ReLU凭借其简单,不存在饱和梯度的特性,能够让神经网络快速地收敛。
随后有更多的激活函数被设计出来,他们大部分是形状固定(fixed shape)或带有一部分可学习参数,如 Leaky ReLU, PReLU, ELU, SELU。但是它们在不同任务上效果不同,因此限制了他们的应用范围。
谷歌提出的Swish激活函数是通过搜索得到的,在跨任务场景下展现了更好的性能。然而这种搜索方式过于昂贵,很少人会专门针对自己的数据集重新搜索,所以大多数情况下用的是谷歌搜索得到的Swish版本。
近期也有基于上下文的激活函数提出,说人话就是一种动态的激活函数。
微软于ECCV 2020提出Dynamic ReLU,根据全局信息对ReLU进行参数化,动态调整斜率。
同样是在ECCV 2020,旷视研究院的马宁宁博士提出Funnel ReLU,给ReLU加入了depthwise卷积,捕捉了一个window内的信息。
上图是一个pwlu的示意图,具体有以下参数:
,右边界
,最右边界的斜率
我们从[
,
]均匀划分出N段,每一段都有其自己的斜率
往复杂点考虑,我们可以用公式说明上述的关系:
其中
在这个定义下,PWLU有以下特性:
这里就不用论文复杂的公式了,很明显梯度就是各个段的斜率。
在PWLU训练之前,我们需要保证其正确地初始化。
一个很直接地方法是将PWLU初始设置为ReLU,即
= -
= 1,
= 0 这种初始化方法可能会带来以下问题:
PWLU中
和
是两个很重要的参数,他们限制了可学习的区域。显然,这个区域需要和输入的分布对齐。
举个例子:
图中输入分布靠左边,那么显然PWLU的右半边就没有起作用,造成参数浪费,影响性能。
解决方法就是通过数学统计重新对齐
具体分为两个阶段:
经过前面几轮统计得到的均值和方差,能得到输入的分布,进而应用到PWLU上,对输入边界进行对齐
Imagenet实验
COCO数据集实验
可以看到效果还是不错的,另外作者还做了消融实验,来表明边界对齐的有效性(其中fix-init-X,表示将输入边界固定为[-X, X])
消融实验
我觉得本文的可视化结果是最有趣的一点,通过可视化可以发现较浅的网络层,PWLU表现的更像是一个线性函数,而在较深的网络层,PWLU表现的很抽象,是一个U形函数
可视化结果
github上有一个非官方代码实现,目前看来实现的有些错误,还不是很完善,仅供参考:
https://github.com/MrGoriay/pwlu-pytorch/blob/main/PWLA.py
个人感觉这篇文章还是有点意思的,想法并不复杂,实验也做的很充分。最后一张可视化图更是很有趣
期待作者开源相关代码,也能够方便比较和其他几个激活函数,比较下性能和推理速度。
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有