博客
关于我
CVPR 2021 | 港科大&旷视提出ACON:激活还是不激活?学习自定义激活函数
阅读量:542 次
发布时间:2019-03-09

本文共 1996 字,大约阅读时间需要 6 分钟。

ACON激活函数:从ReLU到Swish的扩展与Meta-ACON设计

在该工作中,我们提出了一种名为ACON(Activate or Not)的激活函数。ACON激活函数通过引入两个可学习参数p1和p2,能够在不同的输入阶段选择是否激活神经元。此外,我们还发现NAS搜索得到的Swish函数是ReLU激活函数的一种平滑形式,并通过扩展推广到其他变体如Leaky-ReLU、PReLU等。

Smooth Maximum的提出

ReLU激活函数从本质上是一个MAX函数,其平滑可微分变体被称为Smooth Maximum。其公式表示为:

smooth_maximum(x, x1_func, x2_func, beta=0.0) = (x1(x) * e^{beta * x1(x)} + x2(x) * e^{beta * x2(x)}) / (e^{beta * x1(x)} + e^{beta * x2(x)})其中,beta是一个平滑因子。当beta趋近于无穷大时,Smooth Maximum恢复为标准MAX函数;当beta为0时,Smooth Maximum变为算术平均操作。

从ReLU到Swish的推广

考虑平滑形式下的ReLU激活函数,其公式为:

swish(x, beta=1.0) = beta * x / (1 + e^{-x})通过代入公式,我们发现其与Smooth Maximum的结合即为Swish激活函数ACON-A。

ACON-B的设计

ACON-B扩展到了ReLU的其他变体,如Leaky-ReLU和PReLU。通过引入两个参数x1_func和x2_func,我们设计了ACON-B的平滑形式,并验证了其与Leaky-ReLU的性能一致性。

ACON-C的提出

ACON-C是最广泛的ACON形式,允许通过p1和p2两个可学习参数对一阶导数进行上下界控制。其函数形式为:

acon_c(x) = activation(x) = p1 * sigmoid(p1 * x - p2 * x) + p2 * x通过计算其一阶导数和二阶导数,我们可以清晰地看到其梯度控制的灵活性。该函数的梯度上下界由p1和p2共同决定,并且在无穷远处可以逐渐趋近于p1和p2。

Meta-ACON的设计与实现

为了让网络能够自适应地选择是否激活神经元,Meta-ACON通过引入两个卷积层和sigmoid函数设计空间。其具体实现为:

class MetaAconC(nn.Module): def __init__(self, width): super().__init__() self.fc1 = nn.Conv2d(width, width//16, kernel_size=1, stride=1, bias=False) self.fc2 = nn.Conv2d(width//16, width, kernel_size=1, stride=1, bias=False) self.p1 = nn.Parameter(torch.randn(1, width, 1, 1)) self.p2 = nn.Parameter(torch.randn(1, width, 1, 1)) self.sigmoid = nn.Sigmoid()
def forward(self, x):    beta = self.sigmoid(self.fc2(self.fc1(x.mean(dim=2, keepdims=True).mean(dim=3, keepdims=True))))    return (self.p1 * x - self.p2 * x) * self.sigmoid(beta * (self.p1 * x - self.p2 * x)) + self.p2 * x

该实现通过两层卷积和sigmoid函数计算出beta值,用于控制神经元的激活状态。其中,fc1和fc2用于降维和升维处理,而p1和p2通过卷积层学习到最佳的激活参数。

实验结果与应用

通过实验,我们发现替换ReLU为Meta-ACON可以在ResNet-152中提升1-2个点的网络精度。对于小网络,我们建议替换所有ReLU激活层;对于大网络(如ResNet50/101),建议仅替换每个Block中的3x3卷积后面的ReLU激活层,以避免过拟合。设计空间的消融实验显示,channel-wise空间表现最佳。

小结与展望

该工作从ReLU和NAS搜索中的Swish激活函数出发,提出了ACON系列激活函数,并进一步设计了Meta-ACON激活函数。通过实验验证其在不同网络规模和结构上的有效性,为激活函数研究提供了新的思路。未来,这一工作可能会激发更多关于自适应激活函数的研究。

转载地址:http://mgwsz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现异步编程(附完整源码)
查看>>
Objective-C实现弧度到度算法 (附完整源码)
查看>>
Objective-C实现循环移位(附完整源码)
查看>>
Objective-C实现循环链表(附完整源码)
查看>>
Objective-C实现循环队列算法(附完整源码)
查看>>
Objective-C实现循环队列链表算法(附完整源码)
查看>>
Objective-C实现快速傅立叶变换FFT算法(附完整源码)
查看>>
Objective-C实现快速傅里叶变换FFT(附完整源码)
查看>>
Objective-C实现快速傅里叶变换FFT(附完整源码)
查看>>
Objective-C实现快速排序(附完整源码)
查看>>
Objective-C实现快速排序(附完整源码)
查看>>
Objective-C实现快速排序算法(附完整源码)
查看>>
Objective-C实现恩尼格玛密码机算法(附完整源码)
查看>>
Objective-C实现感知哈希算法(附完整源码)
查看>>
Objective-C实现感知哈希算法(附完整源码)
查看>>
Objective-C实现截留雨水问题的动态编程方法算法(附完整源码)
查看>>
Objective-C实现截留雨水问题的蛮力方法的算法(附完整源码)
查看>>
Objective-C实现打印10000以内的完数(附完整源码)
查看>>
Objective-C实现打印1000以内的水仙花数(附完整源码)
查看>>
Objective-C实现打印九九乘法表(附完整源码)
查看>>