Advertisement

Swish激活 hswish激活

阅读量:

h-swish被视为MobileNet V3相较于V2的一项创新成果,并源自谷歌大脑在2017年发表的论文《Searching for Activation Functions》中swish函数的基础研究与优化。该函数被用来取代V2中的部分ReLU6激活机制。

swish的作者指出该函数拥有无上界、有下界以及平滑性等特性,并且在深层模型中表现出超越ReLU的优势。考虑到sigmoid函数计算复杂度高(其公式为 sigmoid(x) = (1 + exp(-x))^(-1)),因此V3选择采用近似函数以逼近swish,并使其实现更加鲁棒。主要原因在于,在当前广泛使用的各种软件和硬件平台上均能高效实现ReLU6这一优化版本;其次,在特定模式下应用ReLU6能够有效消除由于不同实现方式带来的潜在数值精度损失。

作者指出,在网络技术深入发展的背景下, 采用非线性激活函数的成本将有所下降, 并有助于更有效地减少模型参数数量. 研究者发现, 在深度神经网络中应用swish函数能够显著提升模型性能. 基于上述观察, 在V3框架设计中采用了分阶段引入h-swish(HS)策略: 即仅在模型的第一层以及后半部分模块中运用该激活函数.

原文链接:

复制代码
 class H_swish(nn.Module):

    
     def forward(self, x):
    
     return x * F.relu6(x + 3, inplace=True) / 6
    
  
    
  
    
 class H_sigmoid(nn.Module):
    
     def forward(self, x):
    
     return F.relu6(x + 3, inplace=True) / 6

在我所拥有的GeForce 940mx显卡上进行测试后发现,在该激活函数实现方面ReLU表现优于Swish。经过分析发现,在计算Sigmoid函数的过程中,Swish激活函数相较于ReLU多消耗了大约10秒的时间。

复制代码
 class Swish(nn.Module):

    
     def forward(self, x):
    
     return x * torch.sigmoid(x)

SiLU激活函数和Swish激活函数一样

复制代码
  
    
 class SiLU(nn.Module):  # export-friendly version of nn.SiLU()
    
     @staticmethod
    
     def forward(x):
    
     return x * torch.sigmoid(x)

Swish比relu6内存占用大1倍左右。

self.relu = nn.ReLU6(True)

self.relu = Swish()

全部评论 (0)

还没有任何评论哟~