论文提出了动态ReLU,能够根据输入动态地调整对应的分段激活函数,与ReLU及其变种对比,仅需额外的少量计算即可带来大幅的性能提升,能无缝嵌入到当前的主流模型中



来源:晓飞的算法工程笔记 公众号

论文: Dynamic ReLU

Introduction


  ReLU是深度学习中很重要的里程碑,简单但强大,能够极大地提升神经网络的性能。目前也有很多ReLU的改进版,比如Leaky ReLU和 PReLU,而这些改进版和原版的最终参数都是固定的。所以论文自然而然地想到,如果能够根据输入特征来调整ReLU的参数可能会更好。

  基于上面的想法,论文提出了动态ReLU(DY-ReLU)。如图2所示,DY-ReLU是一个分段函数\(f_{\theta{(x)}}(x)\),参数由超函数\(\theta{(x)}\)根据输入\(x\)得到。超函数\(\theta(x)\)综合输入的各维度上下文来自适应激活函数\(f_{\theta{(x)}}(x)\),能够在带来少量额外计算的情况下,显著地提高网络的表达能力。另外,论文提供了三种形态的DY-ReLU,在空间位置和维度上有不同的共享机制。不同形态的DY-ReLU适用于不同的任务,论文也通过实验验证,DY-ReLU在关键点识别和图像分类上均有不错的提升。

Definition and Implementation of Dynamic ReLU


Definition

  定义原版的ReLU为\(y=max\{x, 0\}\),\(x\)为输入向量,对于输入的\(c\)维特征\(x_c\),激活值计算为\(y_c=max\{x_c, 0\}\)。ReLU可统一表示为分段线性函数\(y_c=max_k\{a^k_c x_c+b^k_c\}\),论文基于这个分段函数扩展出动态ReLU,基于所有的输入\(x=\{x_c\}\)自适应\(a^k_c\),\(b^k_c\):

  因子\((a^k_c, b^k_c)\)为超函数\(\theta(x)\)的输出:

  \(K\)为函数数量,\(C\)为维度数,激活参数\((a^k_c, b^k_c)\)不仅与\(x_c\)相关,也与\(x_{j\ne c}\)相关。

Implementation of hyper function \(\theta(x)\)

  论文采用类似与SE模块的轻量级网络进行超函数的实现,对于大小为\(C\times H\times W\)的输入\(x\),首先使用全局平均池化进行压缩,然后使用两个全连接层(中间包含ReLU)进行处理,最后接一个归一化层将结果约束在-1和1之间,归一化层使用\(2\sigma(x) - 1\),\(\sigma\)为Sigmoid函数。子网共输出\(2KC\)个元素,分别对应\(a^{1:K}_{1:C}\)和\(b^{1:K}_{1:C}\)的残差,最终的输出为初始值和残差之和:

  \(\alpha^k\)和\(\beta^k\)为\(a^k_c\)和\(b^k_c\)的初始值,\(\lambda_a\)和\(\lambda_b\)是用来控制残差大小的标量。对于\(K=2\)的情况,默认参数为\(\alpha^1=1\),\(\alpha^2=\beta^1=\beta^2=0\),即为原版ReLU,标量默认为\(\lambda_a=1.0\),\(\lambda_b=0.5\)。

Relation to Prior Work

  DY-ReLU的可能性很大,表1展示了DY-ReLU与原版ReLU以及其变种的关系。在学习到特定的参数后,DY-ReLU可等价于ReLU、LeakyReLU以及PReLU。而当\(K=1\),偏置\(b^1_c=0\)时,则等价于SE模块。另外DY-ReLU也可以是一个动态且高效的Maxout算子,相当于将Maxout的\(K\)个卷积转换为\(K\)个动态的线性变化,然后同样地输出最大值。

Variations of Dynamic ReLU


  论文提供了三种形态的DY-ReLU,在空间位置和维度上有不同的共享机制:

DY-ReLU-A

  空间位置和维度均共享(spatial and channel-shared),计算如图2a所示,仅需输出\(2K\)个参数,计算最简单,表达能力也最弱。

DY-ReLU-B

  仅空间位置共享(spatial-shared and channel-wise),计算如图2b所示,输出\(2KC\)个参数。

DY-ReLU-C

  空间位置和维度均不共享(spatial and channel-wise),每个维度的每个元素都有对应的激活函数\(max_k\{a^k_{c,h,w} x_{c, h, w} + b^k_{c,h,w} \}\)。虽然表达能力很强,但需要输出的参数(\(2KCHW\))太多了,像前面那要直接用全连接层输出会带来过多的额外计算。为此论文进行了改进,计算如图2c所示,将空间位置分解到另一个attention分支,最后将维度参数\([a^{1:K}_{1:C}, b^{1:K}_{1:C}]\)乘以空间位置attention\([\pi_{1:HW}]\)。attention的计算简单地使用\(1\times 1\)卷积和归一化方法,归一化使用了带约束的softmax函数:

  \(\gamma\)用于将attention平均,论文设为\(\frac{HW}{3}\),\(\tau\)为温度,训练前期设较大的值(10)用于防止attention过于稀疏。

Experimental Results

  图像分类对比实验。

  关键点识别对比实验。

  与ReLU在ImageNet上进行多方面对比。

  与其它激活函数进行实验对比。

  可视化DY-ReLU在不同block的输入输出以及斜率变化,可看出其动态性。

Conclustion


  论文提出了动态ReLU,能够根据输入动态地调整对应的分段激活函数,与ReLU及其变种对比,仅需额外的少量计算即可带来巨大的性能提升,能无缝嵌入到当前的主流模型中。前面有提到一篇APReLU,也是做动态ReLU,子网结构十分相似,但DY-ReLU由于\(max_{1\le k \le K}\)的存在,可能性和效果比APReLU更大。





如果本文对你有帮助,麻烦点个赞或在看呗~

更多内容请关注 微信公众号【晓飞的算法工程笔记】

Dynamic ReLU:微软推出提点神器,可能是最好的ReLU改进 | ECCV 2020的更多相关文章

  1. 微软推出的免费新书《Introducing Microsoft SQL Server 2012》

    微软推出的免费新书<Introducing Microsoft SQL Server 2012>,该书详细介绍微软SQL 2012数据库服务最新功能以及功能应用和使用技巧. 该书适合SQL ...

  2. 微软推出ASP.NET Core 2.0,并支持更新Visual Studio 2017

    微软推出ASP.NET Core 2.0的一般可用性,并发布.NET Core 2.0.该公司还推出了其旗舰集成开发环境(IDE)的更新:Visual Studio 2017版本15.3和Visual ...

  3. 微软推出中文学习AI助手Microsoft Learn Chinese

    ​ 编者按:美国总统特朗普访华期间,他6岁的外孙女阿拉贝拉用中文普通话演唱和背诵传统诗歌的视频在中国社交媒体上引起广泛关注,可以感受得到,越来越多的人对中文学习充满了兴趣.智能私教微软小英帮助很多中国 ...

  4. dafny : 微软推出的形式化验证语言

    dafny是一种可验证的编程语言,由微软推出,现已经开源. dafny能够自我验证,可以在VS Code中进行开发,在编辑算法时,写好前置条件和后置条件,dafny验证器就能实时验证算法是否正确. 在 ...

  5. 微软推出首个Microsoft Azure Stack技术预览版

    Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...

  6. 微软推出了Cloud Native Application Bundles和开源ONNX Runtime

    微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation,Window ...

  7. 微软推出全新的Windows终端应用程序

    微软正推出一款名为Windows Terminal的新命令行应用程序.它被设计为访问PowerShell,cmd.exe和Windows子系统Linux(WSL)等环境的中心位置.微软正在为想要调整终 ...

  8. 微软推出精简版Windows10Lean系统意欲何为?

    提起Windows系统,自然无须多言都知道它的重要性.在经历了Windows Vista的失败. Windows 7的成功.Windows 8的平庸和Windows 10的复兴之后,微软算是积累下了大 ...

  9. 探索微软开源Python自动化神器Playwright

    相信玩过爬虫的朋友都知道selenium,一个自动化测试的神器工具.写个Python自动化脚本解放双手基本上是常规的操作了,爬虫爬不了的,就用自动化测试凑一凑. 虽然selenium有完备的文档,但也 ...

  10. 【2016-11-2】【坚持学习】【Day17】【微软 推出的SQLHelper】

    从网络上找到 微软原版本的SQLHelper,很多行代码.认真看了,学习了.  代码:  using System; using System.Data; using System.Xml; usin ...

随机推荐

  1. spring boot使用自带缓存

    项目地址:https://gitee.com/indexman/spring_boot_in_action 下面就介绍一下如何使用spring boot自带的缓存.按步骤来操作即可,不懂的可以去看项目 ...

  2. 3分钟总览微软TPL并行编程库

    有小伙伴问我每天忽悠的TPL是什么?☹️ 这次站位高一点,严肃讲一讲. 引言 俗话说,不想开飞机的程序员不是一名好爸爸:作为微软技术栈的老鸟,一直将代码整洁之道奉为经典, 优秀的程序员将优雅.高性能的 ...

  3. 从零开始学Spring Boot系列-Hello World

    欢迎来到从零开始学Spring Boot的旅程!在这个系列的第二篇文章中,我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出"Hello World& ...

  4. 混合类Mixins介绍

    介绍 混合类是封装了一些通用行为的基类,旨在重用代码.通常,混合类本身并没有什么用,仅扩展这种类也行不通 因为在大多数情况下,它都依赖于其它类中定义的方法和属性.通过多继承,可将混合类与其它类一起使用 ...

  5. 在矩池云安装使用PaddleHub 和 PaddlePaddle

    之前在安装 PaddleHub 导入的时候遇到各种错误,不是这个包没这个模块,就是哪个包没这个属性 ...很头痛,网上也没有 PaddleHub 和 PaddlePaddle 对应的版本,只能自己慢慢 ...

  6. 【Azure Webjob + Redis】WebJob一直链接Azure Redis一直报错 Timeout Exception

    问题描述 运行在App Service上的Webjob连接Azure Redis出现Timeout Exception. 错误截图: 参考Azure Redis对于超时问题的排查建议, 在修改Min ...

  7. 浅入Kubernetes(4):使用Minikube体验

    Minikube 打开 https://github.com/kubernetes/minikube/releases/tag/v1.19.0 下载最新版本的二进制软件包(deb.rpm包),再使用 ...

  8. [程序] C++实现 http和https的反向代理程序

    目录 前言 代理原理 http代理 https代理 实现 客户端 服务端 遇到的所有问题记录 Python对于回复不响应 接受的数据只有4字节 最终数据已经发给Python了 但是Python还是阻塞 ...

  9. 测绘线性代数(四):数学期望、协方差、PCA

    数学期望 E(X) = ∑pixi,X为所有xi的集合,pi为xi对应的概率. 通常来说,xi都是离散的,除非像高斯分布,假设xi不是离散的,才用上式. 当xi是离散的,那么: E(X) = 1 / ...

  10. SpringCloud Ribbon和Feign 的使用和源码分析

    1. Ribbon 介绍 Ribbon 是 Netflix 公司开源的一款 客户端 负载均衡软件,并被SpringCloud集成 作为SpringCloud 负载均衡的工具 服务端负载均衡 : 即在服 ...