当前位置: 首页 > news >正文

激活函数Swish(ICLR 2018)

paper:Searching for Activation Functions

背景

深度网络中激活函数的选择对训练和任务表现有显著的影响。目前,最成功和最广泛使用的激活函数是校正线性单元(ReLU)。虽然各种手工设计的ReLU替代方案被提出,但由于在不同的模型以及数据集上提升不一致的问题,没有一个目前可以完全替代它,从业者们还是更倾向于简单、可靠的ReLU。

本文的创新点

本文提出用自动搜索技术来寻找新的激活函数。结合穷举和基于强化学习的搜索,作者发现了许多新的激活函数。作者还通过对找到的最优激活函数的经验评估来验证搜索的有效性。实验表明,找到的最优激活函数 \(f(x)=x\cdot siogmoid(\beta x)\),作者称之为 \(Swish\),在许多具有挑战性的数据集上,效果都优于ReLU。

方法介绍

为了利用搜索技术,必须设计一个包含合适的候选激活函数的搜索空间。设计搜索空间的一个重要挑战是平衡搜索空间的大小和表达性。一个过度约束的搜索空间不会包含新的激活函数,而一个太大的搜索空间很难进行有效的搜索。为了平衡这两个标准,我们设计了一个简单的搜索空间,该空间包含了一元函数和二元函数来构建激活函数。

如图1所示,激活函数是通过重复组合"core unit"来构成的,core unit定义为 \(b(u_1(x_1),u_2(x_2))\), 它接受两个标量输入,每个输入独立的通过一个一元函数,然后通过一个二元函数来组合两个一元函数的输出得到最终的一个标量输出。因为我们的目标是找到一个标量激活函数,将单个标量输入转换为单个标量输出,因此一元函数的输入限制为层preactivation \(x\) 和二元函数的输出。

给定搜索空间,搜索算法的目标是为一元函数和二元函数找到有效的选择。搜索算法的选择取决于搜索空间的大小。如果搜索空间很小,例如在使用单个核心单元时,就可以详尽地穷举整个搜索空间。如果核心单元重复多次,搜索空间将非常大(即\(10^{12}\)数量级种可能),使得穷举搜索不可行。

对于较大的搜索空间,我们使用一个RNN controller,如图2所示。在每个timestep,控制器预测激活函数的单个组成部分。预测在下一个timestep反馈给控制器,并重复这个过程,直到激活函数的每个组成部分都被预测出来。然后使用预测的字符串来构造激活函数。

一旦搜索算法生成候选激活函数,就在一些任务上训练使用候选激活函数的“子网络”,如CIFAR-10上的图像分类。训练结束后,记录并使用子网络的验证精度来更新搜索算法。使用穷举搜索时,维护一个列表,其中保存了按验证精度排序的激活函数。使用RNN控制器时,控制器通过强化学习进行训练,以最大限度地提高验证精度,其中验证精度作为reward。这种训练推动控制器生成具有较高验证精度的激活函数。

搜索发现

所有的搜索选择ResNet-20作为child network结构,并在CIFAR-10上训练10K steps。这种受限的环境可能会扭曲结果,使得性能最好的激活函数可能只在小型网络上表现良好。但我们在实验部分展示了许多被发现的函数可以很好地泛化到更大的模型。穷举搜索用于较小的搜索空间,RNN控制器用于较大的搜索空间。RNN控制器使用策略近端优化Policy Proximal Optimization进行训练,使用rewards的指数移动平均作为baseline来减少方差。使用到的一元和二元函数的完整列表如下:

其中 \(\beta\) 是一个per-channel的可训练参数,\(\sigma(x)=(1+exp(-x))^{-1}\) 是sigmoid函数。通过改变使用的核心单元的数量和不同的一元、二元函数来构建不同的搜索空间。

图3绘制了在搜索中发现的性能最好的激活函数。我们发现了几个值得注意的趋势:

  • 复杂的激活函数始终比简单的激活函数表现的差,可能是因为优化难度的增加。性能最好的激活函数可以用1个或2个核心单元表示。
  •  表现最好的几个激活函数都有一个共同的结构,就是原始的preactivation \(x\) 作为最终二元函数的输入:\(b(x,g(x))\)。ReLU也遵循这种结构,其中 \(b(x_1,x_2)=max(x_1,x_2),g(x)=0\)
  • 搜索找到了用周期periodic函数的激活函数,例如sin和cos。周期函数最常见的用法是对原始preactivation \(x\) 的加或减(或线性缩放)。周期函数在激活函数中的应用只在之前的工作中进行了简要的探索,因此这些发现的函数为进一步研究提供了有效的途径。

  • 使用除法的函数往往表现不佳,因为当分母接近0时输出会爆炸。只有当分母中的函数与0有界时例如cosh(x),或者当分子也接近0时,除法才会成功,得到输出1。

由于激活函数是使用一个相对较小的子网络发现的,当应用于较大的模型时,它们的性能可能无法泛化。为了测试性能最好的激活函数对不同架构的鲁棒性,我们使用preactivation ResNet-164(RN)、Wide ResNet 28-10(WRN)和DenseNet 100-12(DN)模型进行了额外的实验。我们在Tensorflow中实现3个模型并用搜索发现的表现最好的几个激活函数替换ReLU,我们使用原始的超参例如使用SGD with momentum进行优化,并遵循之前的工作给出5次不同运行的median。

结果如表1,2所示。尽管模型结构不同,8个激活函数中有6个泛化性能很好。这6个激活函数中,所有都在ResNet-164上取得了匹配或超越ReLU的表现。此外,发现的激活函数中有两个 \(x\cdot \sigma(\beta x)\) 和 \(max(x,\sigma(x))\) 在三个模型上一致的匹配或超越ReLU的性能。

虽然结果看起来很好,但目前尚不清楚所找到的激活函数是否能在具有挑战性的真实世界数据集上成功地取代ReLU。为了验证搜索的有效性,接下来我们重点关注评估激活函数 \(f(x)=x\cdot \sigma(\beta x)\),我们称之为 \(Swish\)。我们选择重点评估Swish而不是 \(max(x,\sigma(x))\) 因为实验中表明Swish的泛化性更好。接下来我们将分析Swish的特性,然后对Swish、ReLU和其他候选baseline激活函数在不同的任务和不同的模型上进行全面的经验评估。

Swish

回顾一下,Swish定义为 \(x\cdot \sigma(\beta x)\),其中 \(\sigma(z)=(1+exp(-z))^{-1}\) 是sigmoid函数,\(\beta\) 是一个常量或可训练的参数。图4绘制了不同 \(\beta\) 值的Swish函数。当 \(\beta =1\) 时,Swish等价于针对强化学习提出的Sigmoid-weighted Linear Unit(SiL)。当 \(\beta=0\) 时,Swish变成了线性缩放函数 \(f(x)=\frac{x}{2}\)。当 \(\beta\to \infty \) 时,sigmoid部分接近于一个0-1函数,Swish变得像ReLU。这表明Swish可以宽松地看作一个smooth function,它在线性函数和ReLU函数之间进行非线性插值。如果 \(\beta\) 是可训练的模型就可以控制插值的程度。

和ReLU一样,Swish上下都是无界的。和ReLU不一样的是,Swish是光滑非单调的。事实上,Swish的非单调性有别于大多数常见的激活函数。Swish的导数为

 

不同 \(\beta\) 值的Swish的一阶导数如图5所示。\(\beta\) 的大小控制了一阶导数渐近线到0和1的速度。当 \(\beta=1\) 时,对于小于1.25左右的输入,导数的幅度小于1。因此,\(\beta=1\) 的Swish的成功意味着ReLU的梯度保持特性(即在x>0时导数为1)在现代架构中可能不再是一个明显的优势。

Swish和ReLU最显著的区别在于当x<0时Swish的非单调"bump"。如图6所示,很大比例的preactivation落在bump \((-5 \le x \le 0)\) 区域内,这表明非单调凸起是Swish的一个重要特性。凸起的形状可以通过 \(\beta\) 值控制。尽管固定 \(\beta=1\) 是有效的 ,实验表明训练 \(\beta\) 值可以进一步提高一些模型的性能。图7绘制了Mobile NASNet-A模型中训练的 \(\beta\) 值的分布,训练后的 \(\beta\) 值分布在0到1.5之间并在 \(\beta\approx 1\) 达到峰值,表明模型利用到了可训练的 \(\beta\) 额外的灵活性。

需要注意的是,如果使用了BN,则应该设置比例参数。由于ReLU是分段线性的,一些高级库默认关闭了比例参数,但对于Swish确是错误的。对于训练Swish网络,我们发现略微降低用于训练ReLU的学习率有帮助。

实验结果

作者在不同的数据集和模型上与其它最常见激活函数进行了对比,如下 

CIFAR-10和CIFAR-100的结果如下

 

可以看出Swish在不同模型下与其它激活函数相比,都取得可匹配或更好的结果。

Inception-v3和v4在ImageNet数据上的结果如下,可以看出Softplus的效果比Swish稍好。

 

但当模型为轻量模型如Mobile NasNet-A或MobileNet时,Softplus的效果不如Swish

 

 

相关文章:

激活函数Swish(ICLR 2018)

paper&#xff1a;Searching for Activation Functions 背景 深度网络中激活函数的选择对训练和任务表现有显著的影响。目前&#xff0c;最成功和最广泛使用的激活函数是校正线性单元&#xff08;ReLU&#xff09;。虽然各种手工设计的ReLU替代方案被提出&#xff0c;但由于在…...

【C++ 标准流,文件流】

C 标准流&#xff0c;文件流 ■ 标准输入&#xff0c;输出流&#xff0c;■ 文件流&#xff08;ofstream写入&#xff0c;ifstream读取&#xff0c;fstream创建-写入-读取&#xff09;■ open()■ ofstream■ ifstream■ 流插入<<■ 文件位置指针 ■ 标准输入&#xff0c…...

【排序】详解冒泡排序

一、思想 冒泡排序的基本思想是利用两两比较相邻记录的方式&#xff0c;通过一系列的比较和交换操作&#xff0c;使得较大或较小的元素逐渐移动到数列的一端。在每一轮的排序过程中&#xff0c;都会从数列的起始位置开始&#xff0c;对相邻的元素进行比较&#xff0c;如果它们…...

什么是Docker容器?

Docker是一种轻量级的虚拟化技术&#xff0c;同时是一个开源的应用容器运行环境搭建平台&#xff0c;可以让开发者以便捷方式打包应用到一个可移植的容器中&#xff0c;然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机&#xff0c;Docker容器提供轻量化的…...

(C++练习)选择题+编程题

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 选择题 以下程序输出结果是什么&#xff08;&#xff09; class A{public:virtual void func(int val 1){ std::cout<<"A->"<< val <<std::endl;}virtual void test(){ func();}};class B…...

【鸿蒙开发】第十五章 ArkTS基础类库-并发

1 简述 并发是指在同一时间段内&#xff0c;能够处理多个任务的能力。为了提升应用的响应速度与帧率&#xff0c;以及防止耗时任务对主线程的干扰&#xff0c;OpenHarmony系统提供了异步并发和多线程并发两种处理策略&#xff0c;ArkTS支持异步并发和多线程并发。并发能力在多…...

华为数通方向HCIP-DataCom H12-821题库(多选题:21-40)

第21题 管理员在配置 VRRP 时,下面哪些不是必须配置的? A.抢占模式 B.抢占延时 C.虚拟IP 地址 D.虚拟路由器的优先级 【参考答案】ABD 【答案解析】 VRRP的作用之一是提供一个虚拟的IP地址,用作默认网关,用来实现冗余和故障转移。因此,配置虚拟IP地址是必须的。华为设备vr…...

【简单模拟】第十三届蓝桥杯省赛C++ B组《刷题统计》(c++)

1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。 他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。 请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题&#xff1f; 2.输入格式 输入一行包含三个整数 a,b 和 n。…...

IO-DAY3

使用read和write实现文件夹拷贝功能 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<dirent.h> int main(int argc,…...

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数&#xff0c;比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类&#xff1a; 离散型随机变量&#xff1a;随机变量的取值为有限个。连续型随机变量&#xff1a;随机变量的取值是连…...

微服务学习

SpringCloud组成 服务注册与发现&#xff1a;consul 阿里Nacos 服务调用和负载均衡&#xff1a;OpenFeign LoadBalance 分布式事务&#xff1a;阿里Seata 服务熔断和降级:阿里Sentinel Circuit Breaker 服务链路追踪&#xff1a;Micrometer Tracing 服务网关&#xff1a;GateWa…...

【.NET Core】深入理解IO - 读取器和编写器

【.NET Core】深入理解IO - 读取器和编写器 文章目录 【.NET Core】深入理解IO - 读取器和编写器一、概述二、BinaryReader和BinaryWriter2.1 BinartReader类2.2 BinaryWriter类 三、StreamReader和StreamWriter3.1 StreamReader类3.1 StreamWriter类StreamWriter类构造函数Str…...

【Java项目介绍和界面搭建】拼图小游戏——添加图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …...

「MySQL」基本操作类型

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;数据库 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 数据库的操作 创建、显示数据库 使用 create 创建一个数据库 create database goods;然后可以用 show databases 来查看已经创建的数…...

Android 14 权限

问题Android 14 按照视频播放类的应用 无法获取到权限。 原因是从 Android 13 开始&#xff0c;如果你的应用程序 targetSdk 指定到了 33 或以上&#xff0c;那么 READ_EXTRERNAL_STORGE 权限就完全失去了作用&#xff0c;申请它将不会产生任何效果。 与此相对应的&#xff0c…...

Springboot整合SSE实现实时消息推送

SSE详细介绍传送门&#xff1a;SSE实时消息推送 简单描述一下SSE推送在实际项目中应用的常见场景 1&#xff0c;项目页面中有消息通知板块&#xff0c;当信息有变化时&#xff0c;只有手动刷新页面&#xff0c;才会看到最新的数据&#xff0c;这里可以采用SSE技术实时推送最新…...

在pytorch中利用GPU训练神经网络时代码的执行顺序并提高训练效率

在pytorch中利用GPU训练神经网络时代码的执行顺序并提高训练效率 在 PyTorch 中&#xff0c;大多数操作在 GPU 上默认是异步执行的&#xff0c;但这并不意味着它们是并行执行的。要理解代码是同步还是异步执行&#xff0c;以及是串行还是并行执行&#xff0c;我们需要考虑几个…...

vue3学习

距离vue2学习已经一年度了&#xff0c;现在开始vue3的学习。 一、webpack &#xff08;1&#xff09;创建列表隔行变色项目及webpack使用&#xff1a; 新建项目空白目录&#xff0c;并运行npm init -y命令&#xff0c;初始化包管理配置文件package.json&#xff1b; 新建sr…...

毫秒生成的时间戳如何转化成东八区具体时间

假设现在有一个时间是1709101071419L 后端代码实现 Java代码&#xff08;东八区时间&#xff09; 在Java代码中&#xff0c;我们将时区从UTC调整为东八区&#xff08;UTC8&#xff09;&#xff1a; import java.time.Instant; import java.time.ZoneId; import java.time.Z…...

02. Nginx入门-Nginx安装

Nginx安装 yum安装 编辑yum环境 cat > /etc/yum.repos.d/nginx.repo << EOF [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...