Dynamic ReLU:根据输入动态确定的ReLU

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 这是我最近才看到的一篇论文,它提出了动态ReLU (Dynamic ReLU, DY-ReLU),可以将全局上下文编码为超函数,并相应地调整分段线性激活函数。与传统的ReLU相比,DY-ReLU的额外计算成本可以忽略不计,但表示能力明显增强,并且实现简单,所以可以非常简单的对我们现有的模型进行修改。

Dynamic ReLU (DY-ReLU)

对于给定的输入向量(或张量)x,DY-ReLU被定义为具有可学习参数θ(x)的函数fθ(x)(x),该参数适应于输入x,它包括两个功能:

超函数θ(x):用于计算激活函数的参数。

激活函数fθ(x)(x):使用参数θ(x)生成所有通道的激活。

1、函数定义

设传统的或静态的ReLU为y = max(x, 0)。ReLU可以推广为每个通道c的参数分段线性函数。

其中coeffcients (akc, bkc)是超函数(x)的输出,如下:

其中K是函数的个数,C是通道的个数。论文中K=2。

2、超函数θ(x)的实现

使用轻量级网络对超函数进行建模,这个超函数类似于SENet中的SE模块(稍后会介绍)。

输出有2KC个元素,对应于a和b的残差。2σ(x)-1用于对-1到1之间的残差进行归一化,其中σ(x)表示s型函数。最终输出计算为初始化和残差之和,如下所示:

其中λ是标量,这个公式也就是我们上面的图

3、与先前研究的关系

可以看到DY-ReLU的三种特殊情况相当于ReLU、Leaky ReLU和PReLU。

4、DY-ReLU的变体

DY-ReLU-A:激活函数是空间和通道共享的。

DY-ReLU-B:激活函数是空间共享和通道相关的。

DY-ReLU-C:激活的是空间和通道分开的。

结果展示

1、消融研究

所有三种变化都比基线有所改善,但通道分开的DY-ReLU(变化B和C)明显优于通道共享的DY-ReLU(变化A)。

所以根据上面结果,使用DY-ReLU-B进行ImageNet分类,使用DY-ReLU-C进行COCO关键点检测。

2、ImageNet分类

使用MobileNetV2 (×0.35和×1.0), 用不同的激活函数代替ReLU。所提出的方法明显优于所有先前的工作,包括具有更多计算成本的Maxout。这表明DY-ReLU不仅具有更强的表示能力,而且计算效率高。

上图绘制了5万张验证图像在不同区块(从低到高)的DY-ReLU输入输出值。可以看到学习到的DY-ReLU在特征上是动态的,因为对于给定的输入x,激活值(y)在一个范围内(蓝点覆盖的范围)变化。

下图分析DY-ReLU中两段之间的夹角(即斜率差|a1c-a2c|)。激活函数在较高水平上具有较低的弯曲。

3、COCO关键点估计

当使用MobileNetV3作为骨干时,删除SENet模块,使用DY-ReLU替代ReLU和h-Swish后,结果也有提高。

总结

可以看到,只是使用DY-ReLU替换现有的激活函数,模型的表现明显优于基线模型。

这是ECCV2020的一篇论文,我们这里直接贴出paperswithcode的地址,这样可以直接拿来进行使用

https://avoid.overfit.cn/post/8db206f03cd54167b9eb2d06ebaffc6b

作者:sh-tsang

目录
相关文章
|
23天前
|
机器学习/深度学习 人工智能 PyTorch
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
34 0
|
机器学习/深度学习 PyTorch 算法框架/工具
pytorch中nn.ReLU()和F.relu()有什么区别?
pytorch中nn.ReLU()和F.relu()有什么区别?
392 0
|
12月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch】nn.ReLU()与F.relu()的区别
【PyTorch】nn.ReLU()与F.relu()的区别
110 0
|
PyTorch 算法框架/工具
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
434 2
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
|
机器学习/深度学习 PyTorch 算法框架/工具
torch rnn网络中,embedding.weight会反向更新吗?
在PyTorch中,如果在训练中使用了embedding层,那么embedding.weight会被反向更新。这是因为在训练过程中,模型的参数会根据损失函数的反向传播进行更新,而embedding层的参数embedding.weight也是模型的一部分,因此也会被更新。 对于RNN网络来说,embedding层通常用于将输入的离散化表示(例如单词ID)转换为连续的向量表示。这些向量表示可以作为RNN网络的输入,帮助模型更好地理解文本数据。在RNN网络中,embedding层通常是一个独立的模块,其权重参数会被随机初始化,并根据训练数据进行反向更新,以使得输入的离散化表示能够更好地在连续空间中
701 0
|
存储 机器学习/深度学习 PyTorch
|
PyTorch 算法框架/工具 索引
Pytorch教程[05]torch.nn---卷积、池化、线性、激活函数层
Pytorch教程[05]torch.nn---卷积、池化、线性、激活函数层
Pytorch教程[05]torch.nn---卷积、池化、线性、激活函数层
(2)tf.Variable中trainable作用
如果为True,则会默认将变量添加到图形集合GraphKeys.TRAINABLE_VARIABLES中。此集合用于优化器Optimizer类优化的的默认变量列表,如果为False则在训练时不会更新该值。
115 0
人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
人工神经外网络中为什么ReLu要好过于Tanh和Sigmoid Function?
图解 FC 层和 CONV 层的 Forward 和 Backward 的区别【读书笔记】
图解 FC 层和 CONV 层的 Forward 和 Backward 的区别【读书笔记】
203 0
图解 FC 层和 CONV 层的 Forward 和 Backward 的区别【读书笔记】