[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言

今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。

作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索,通过实验发现最佳的激活函数 f ( x ) = x ⋅ sigmoid ( β x ) f(x) = x \cdot \text{sigmoid}(βx) f(x)=xsigmoid(βx),作者称为Swish。

如果 β = 1 \beta=1 β=1,就等于上篇笔记中介绍的SiLU。

简介

每个深度网络的核心是一个线性变换,紧接着是一个激活函数 f ( ⋅ ) f(\cdot) f()。目前,最成功和广泛使用的激活函数是ReLU。

虽然有许多激活函数被提出来替代ReLU,但没有一种能够像ReLU一样得到广泛应用。

在篇工作中,作者使用自动搜索技术来发现新颖的激活函数。专注于寻找新的标量激活函数,即接受一个标量作为输入并输出一个标量,因为标量激活函数可以用来替换ReLU函数而不改变网络架构。通过结合详尽的搜索和基于强化学习的搜索,作者发现了一些表现出有希望性能的新颖激活函数。

作者对最佳发现的激活函数进行了实证评估,发现的最佳激活函数,我们称之为Swish,是 f ( x ) = x ⋅ sigmoid ( β x ) f(x) = x \cdot \text{sigmoid}(βx) f(x)=xsigmoid(βx),其中 β β β是一个常数或可训练的参数。

方法

为了利用搜索技术,必须设计一个包含有潜力的候选激活函数的搜索空间。在设计搜索空间时,平衡搜索空间的大小和表达能力是一个重要的挑战。过于受限的搜索空间不会包含新颖的激活函数,而过大的搜索空间则难以有效搜索。为了平衡这两个标准,祖宗设计了一个简单的搜索空间,该空间通过组合一元和二元函数来构造激活函数。

image-20240428113238650

如图1所示,激活函数是通过反复组合core unit(核心单元)构建的,core unit定义为 b ( u 1 ( x 1 ) , u 2 ( x 2 ) ) b(u_1(x_1), u_2(x_2)) b(u1(x1),u2(x2))。核心单元接受两个标量输入,将每个输入独立地通过一元(Unary)函数传递,并使用一个输出标量的二元(Binary)函数将两个一元输出组合起来。由于我们的目标是寻找将单个标量输入转换为单个标量输出的标量激活函数,一元函数的输入受限于层的预激活 x x x和二元函数的输出。

给定搜索空间,搜索算法的目标是找到一元函数和二元函数的有效选择。搜索算法的选择取决于搜索空间的大小。如果搜索空间很小,例如使用单个核心单元,可以穷举搜索整个搜索空间。如果核心单元重复多次,搜索空间将非常大(即大约 1 0 12 10^{12} 1012​个可能性),使得穷举搜索变得不可行。

image-20240428113643874

对于大型搜索空间,作者使用一个RNN控制器,如图2所示。在每个时间步,控制器预测激活函数的一个组件。预测结果在下一个时间步骤中反馈给控制器,并重复此过程,直到预测出激活函数的每个组件。然后使用预测的字符串构造激活函数。

一旦搜索算法生成了一个候选的激活函数,就会使用带有候选激活函数的子网络在某个任务上进行训练,例如在CIFAR-10上进行图像分类。训练完成后,记录并使用子网络的验证准确性来更新搜索算法。对于穷举搜索,维护一个根据验证准确性排序的表现最佳的激活函数列表。对于RNN控制器,使用强化学习训练控制器,以最大化验证准确性,其中验证准确性作为奖励。这种训练推动控制器生成具有高验证准确性的激活函数。

由于评估单个激活函数需要训练一个子网络,搜索是计算密集型的。为了减少进行搜索所需的时间,使用分布式训练方案来并行训练每个子网络。在这个方案中,搜索算法提出了一批候选激活函数,将它们添加到一个队列中。工作机器从队列中取出激活函数,训练一个子网络,并报告相应激活函数的最终验证准确性。验证准确性被聚合并用于更新搜索算法。

搜索发现

对于小的搜索空间,使用穷举搜索,而对于更大的搜索空间,使用RNN控制器。RNN控制器使用策略近端优化(Policy Proximal Optimization,PPO)进行训练,使用奖励的指数移动平均作为基准来降低方差。考虑的一元函数和二元函数的完整列表如下:

  • 一元函数: x , − x , ∣ x ∣ , x 2 , x 3 , x , β x , x + β , log ⁡ ( ∣ x ∣ + ϵ ) , exp ⁡ ( x ) sin ⁡ ( x ) , cos ⁡ ( x ) , sinh ⁡ ( x ) , cosh ⁡ ( x ) , tanh ⁡ ( x ) , sinh ⁡ − 1 ( x ) , tan ⁡ − 1 ( x ) , sinc ( x ) , max ⁡ ( x , 0 ) , min ⁡ ( x , 0 ) , σ ( x ) , log ⁡ ( 1 + exp ⁡ ( x ) ) , exp ⁡ ( − x 2 ) , erf ( x ) , β x,-x,|x|,x^2,x^3,\sqrt x,\beta x, x+\beta,\log(|x|+\epsilon),\exp(x) \sin(x),\cos(x),\sinh(x),\cosh(x),\tanh(x), \sinh^{−1} (x), \tan^{−1} (x), \text{sinc}(x), \max(x, 0), \min(x, 0), σ(x), \log(1 + \exp(x)), \exp(−x^2), \text{erf}(x), β x,x,x,x2,x3,x ,βx,x+β,log(x+ϵ),exp(x)sin(x),cos(x),sinh(x),cosh(x),tanh(x),sinh1(x),tan1(x),sinc(x),max(x,0),min(x,0),σ(x),log(1+exp(x)),exp(x2),erf(x),β

  • 二元函数: x 1 + x 2 , x 1 ⋅ x 2 , x 1 − x 2 , x 1 x 2 + ϵ , max ⁡ ( x 1 , x 2 ) , min ⁡ ( x 1 , x 2 ) , σ ( x 1 ) ⋅ x 2 , exp ⁡ ( − β ( x 1 − x 2 ) 2 ) , exp ⁡ ( − β ∣ x 1 − x 2 ∣ ) , β x 1 + ( 1 − β ) x 2 x_1 + x_2, x_1 \cdot x_2, x_1 − x_2, \frac{x_1} {x_2+ \epsilon}, \max(x_1, x_2), \min(x_1, x_2), σ(x_1)\cdot x_2, \exp(−β(x_1 − x_2)^2 ), \exp(−β|x_1 − x_2|), βx_1 + (1 − β)x_2 x1+x2,x1x2,x1x2,x2+ϵx1,max(x1,x2),min(x1,x2),σ(x1)x2,exp(β(x1x2)2),exp(βx1x2),βx1+(1β)x2

其中 β β β表示每个通道可训练的参数 , σ ( x ) = ( 1 + exp ⁡ ( − x ) ) − 1 ,σ(x) = (1 + \exp(−x))^{−1} σ(x)=(1+exp(x))1是sigmoid函数。通过改变用于构建激活函数的核心单元的数量以及改变一元函数和二元函数对搜索算法的可用性,可以创建不同的搜索空间。图3绘制了搜索发现的表现最佳的新颖激活函数。

image-20240428114442675

作者强调了搜索发现的几个值得注意的趋势:

  • 复杂的激活函数在性能上一直不如简单的激活函数,可能是由于在优化过程中增加了困难。表现最佳的激活函数可以由1个或2个核心单元表示。

  • 最佳激活函数共享的一个常见结构是将原始预激活 x x x作为最终二元函数的输入: b ( x , g ( x ) ) b(x, g(x)) b(x,g(x))。ReLU函数也遵循这种结构,其中 b ( x 1 , x 2 ) = max ⁡ ( x 1 , x 2 ) b(x_1, x_2) = \max(x_1, x_2) b(x1,x2)=max(x1,x2) g ( x ) = 0 g(x) = 0 g(x)=0

  • 搜索发现了利用周期函数(如sin和cos)的激活函数。周期函数的最常见用法是与原始预激活 x x x(或线性缩放的x)相加或相减。在以前的研究中,周期函数在激活函数中的应用只有简单探索,所以这些发现的函数为进一步研究提供了有价值的路径。

  • 使用除法的函数通常表现不佳,因为当分母接近0时,输出会变得非常大。除法只有在分母中的函数远离0时才成功,例如 cosh ⁡ ( x ) \cosh(x) cosh(x)​,或者当分子接近0时分母也接近0,产生输出为1。

image-20240428141253356

实验结果显示在表1和表2中。尽管模型架构发生了变化,其中六个激活函数成功地进行了泛化。在这六个激活函数中,所有的都与或优于ResNet-164上的ReLU。此外,两个发现的激活函数, x ⋅ σ ( β x ) x\cdotσ(βx) xσ(βx) m a x ( x , σ ( x ) ) max(x, σ(x)) max(x,σ(x))在所有三个模型上一直与或优于ReLU。

为了验证搜索的有效性,在本文的其余部分,作者将重点对激活函数 f ( x ) = x ⋅ σ ( β x ) f(x) = x · σ(βx) f(x)=xσ(βx)进行实证评估,称之为Swish。选择广泛评估Swish而不是 m a x ( x , σ ( x ) ) max(x, σ(x)) max(x,σ(x)),因为早期实验表明Swish具有更好的泛化性能。

SWISH

image-20240428141539572

Swish被定义为 x ⋅ σ ( β x ) x \cdot σ(βx) xσ(βx),其中 σ ( z ) = ( 1 + exp ⁡ ( − z ) ) − 1 σ(z) = (1 + \exp(−z))^{−1} σ(z)=(1+exp(z))1是sigmoid函数, β β β可以是一个常数或可训练参数。图4绘制了不同 β β β值下Swish的图形。如果 β = 1 β = 1 β=1,则Swish等同于Elfwing等人提出的用于强化学习的Sigmoid加权线性单元SiL。

如果 β = 0 β = 0 β=0,则Swish变为缩放的线性函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2。当 β → ∞ β → ∞ β时,sigmoid部分逐渐趋近于0-1函数,因此Swish变得类似于ReLU函数。

这表明Swish可以被粗略地视为一个平滑的函数,它在线性函数和ReLU函数之间进行非线性插值。插值的程度可以通过将 β β β​设置为可训练参数来控制。与ReLU类似,Swish在上方是无界的,在下方是有界的。与ReLU不同,Swish是平滑且非单调的。事实上,Swish的非单调性使其与大多数常见的激活函数有所区别。Swish的导数是
f ′ ( x ) = σ ( β x ) + β x ⋅ σ ( β x ) ( 1 − σ ( β x ) ) = σ ( β x ) + β x ⋅ σ ( β x ) − β x ⋅ σ ( β x ) 2 = β x ⋅ σ ( x ) + σ ( β x ) ( 1 − β x ⋅ σ ( β x ) ) = β f ( x ) + σ ( β x ) ( 1 − β f ( x ) ) \begin{aligned} f^\prime(x) &= \sigma(\beta x) + \beta x \cdot \sigma (\beta x)(1-\sigma(\beta x)) \\ &= \sigma(\beta x) + \beta x \cdot \sigma (\beta x) - \beta x \cdot \sigma(\beta x)^2 \\ &= \beta x \cdot \sigma (x) + \sigma (\beta x) (1 -\beta x \cdot \sigma (\beta x)) \\ &= \beta f(x) + \sigma(\beta x)(1- \beta f(x)) \end{aligned} f(x)=σ(βx)+βxσ(βx)(1σ(βx))=σ(βx)+βxσ(βx)βxσ(βx)2=βxσ(x)+σ(βx)(1βxσ(βx))=βf(x)+σ(βx)(1βf(x))
image-20240428142057025

Swish的一阶导数在不同 β β β值下如图5所示。 β β β的值控制着一阶导数趋近于0和1的速度。当 β = 1 β = 1 β=1时,对于小于约1.25的输入,导数的大小小于1。因此,Swish在 β = 1 β = 1 β=1时的成功表明,在现代架构中,ReLU的梯度保持特性(即当 x > 0 x > 0 x>0​​时导数为1)可能不再是一个明显的优势。

image-20240428142221389

Swish与ReLU之间最显著的区别是当 x < 0 x < 0 x<0时Swish的非单调“凸起”。如图6所示,大部分的预激活值落在凸起的范围内(-5 ≤ x ≤ 0),这表明非单调凸起是Swish的一个重要特性。凸起的形状可以通过改变 β β β参数来控制。虽然在实践中固定 β = 1 β = 1 β=1是有效的,但实验部分显示训练 β β β​可以进一步提高某些模型的性能。

image-20240428142252670

图7显示了从Mobile NASNet-A模型训练得到的 β β β值的分布情况。训练得到的 β β β值在0和1.5之间分布,并且在 β ≈ 1 β ≈ 1 β1处有一个峰值,这表明模型利用了可训练 β β β参数的额外灵活性。在实际中,Swish可以在大多数深度学习库中通过一行代码的修改来实现,如TensorFlow中的x * tf.sigmoid(beta * x)tf.nn.swish(x)

需要注意的是,如果使用BatchNorm,应设置scale参数。由于ReLU函数是分段线性的,一些高级库默认关闭了scale参数,但对于Swish来说,此设置是不正确的。对于训练Swish网络,作者发现略微降低用于训练ReLU网络的学习率效果很好。

实验

结论

Swish是通过使用多种自动搜索技术找到的。

Swish在深度模型上始终优于ReLU。Swish的强大性能挑战了关于ReLU的传统观点。当残差连接(He等人,2016a)使得非常深的网络可以优化时,ReLU保持梯度的重要性假设似乎是不必要的。在完全注意力机制的Transformer中可以找到类似的见解。

总结

⭐ 作者利用自动搜索技术来发现新的激活函数。并且通过实验发现最佳的激活函数为 f ( x ) = x ⋅ sigmoid ( β x ) f(x) = x \cdot \text{sigmoid}(βx) f(x)=xsigmoid(βx),称为Swish。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/582060.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 学习 鸿蒙HarmonyOS 4.0 第二天(项目结构认识)

项目结构认识 和 了解&#xff1a; 工程目录下的结构如下&#xff1a; 首先能看到有两个.开头的文件&#xff0c;分别是.hvigor 和 .idea。这两个文件夹都是与构建有关系的&#xff0c; 如果你开发过安卓app&#xff0c;构建完会生成一个apk安装包&#xff0c;鸿蒙则是生成hap…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

急急急!微信朋友圈删除了怎么恢复?

微信朋友圈是我们与朋友分享生活点滴的重要平台&#xff0c;但有时候微信出现异常&#xff0c;导致我们编辑好的朋友圈被删除了&#xff0c;这时候该怎么办呢&#xff1f; 幸运的是&#xff0c;微信提供了一种简单的方式来恢复已删除的朋友圈内容。微信朋友圈删除了怎么恢复&a…

react 学习笔记二:ref、状态、继承

基础知识 1、ref 创建变量时&#xff0c;需要运用到username React.createRef()&#xff0c;并将其绑定到对应的节点。在使用时需要获取当前的节点&#xff1b; 注意&#xff1a;vue直接使用里面的值&#xff0c;不需要再用this。 2、状态 组件描述某种显示情况的数据&#…

tkinter中是否有必要使用类

1. 问题背景 在使用tkinter编写事件驱动程序时&#xff0c;Fredrik Lundh的教程中提到&#xff0c;创建一个类&#xff08;App&#xff09;作为框架&#xff0c;并以类的实例运行程序&#xff0c;这样会更好&#xff0c;而不是直接启动程序。 以下是问题&#xff1a; 在tkin…

【Go语言快速上手(五)】文件操作协程操作

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Go语言专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; GO快速上手 1. 前言2. GO语言的文件操…

武汉星起航:挂牌上海股权中心,开启资本新篇章助力跨境电商飞跃

2023年10月30日&#xff0c;武汉星起航电子商务有限公司在上海股权托管交易中心成功挂牌展示&#xff0c;标志着这家在跨境电商领域拥有卓越声誉的企业正式迈入了资本市场的大门。对于武汉星起航来说&#xff0c;这不仅是其发展历程中的一个重要里程碑&#xff0c;更是对其业务…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

ip网络广播前置放大器SV-7031 接纯后级功放

ip网络广播前置放大器SV-7031 接纯后级功放 感谢您使用我们的网络前置放大器SV-7031。 SV-7031具有1路AC200V OUT电源输出&#xff0c;1路AC200V IN电源输入&#xff1b;RJ45 网络接口&#xff0c;具有网络音频广播、本地广播功能。 18123651365 ip网络广播前置放大器SV-703…

vue-cli+vue3+vite+ts 搭建uniapp项目全过程(一)

unapp官方提供了cli 脚手架创建 uni-app 项目的文档 Vue3/Vite版要求 node 版本 18、20使用Vue3/Vite版创建不会提示选择模板&#xff0c;目前只支持创建默认模板 本文以vue3vitets为例 1、初始化项目 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 执行完生成…

就业班 第三阶段(tomcat) 2401--4.28 day1 tomcat1安装配置及单机多实例

企业 Tomcat 运维 文章目录 企业 Tomcat 运维一、Tomcat 简介1、Tomcat好帮手---JDK2、安装Tomcat & JDK1、系统环境说明2 、安装JDK3、安装Tomcat 二、Tomcat目录介绍1、tomcat主目录介绍2、webapps目录介绍3、Tomcat配置介绍&#xff08;conf&#xff09;4、Tomcat的管理…

Linux-管道通信

1. 管道概念 管道&#xff0c;是进程间通信的一种方式&#xff0c;在Linux命令中“ | ”就是一种管道&#xff0c;它可以&#xff0c;连接前一条命令&#xff0c;和后一条命令&#xff0c;把前面命令处理完的内容交给后面&#xff0c;例如 cat filename | grep hello …

本地部署 Meta Llama3-8b

Meta Llama 3(8B) Instruct model performance Meta Llama 3(8B) Pre-trained model performance 使用 Ollama 运行 Llama3 访问 Tags llama3&#xff0c;选择你想运行的模型&#xff0c;例如&#xff0c;8b-instruct-q8_0 拷贝并运行命令&#xff0c;ollama run llama3:8b-…

秋招后端开发面试题 - Java语言基础(上)

目录 Java基础上前言面试题Java 语言的特点JVM JDK JRE什么是跨平台性&#xff1f;原理是什么&#xff1f;什么是字节码?采用字节码的好处是什么?Java 和 C 的区别&#xff1f;注释&#xff1f;关键字关键字 instanceof类型转换关键字 this 和 super关键字 final finally fin…

Android数据恢复:如何在手机上恢复丢失的文件和照片

我们都有 我们错误地从手机中删除重要内容的时刻。确实如此 不一定是我们的错。其他人可以对您的手机数据执行此操作 有意或无意。这在某个时间点发生在我们所有人身上。 但是&#xff0c;今天市场上有各种各样的软件可以 帮助恢复已删除的文件。这些类型的软件被归类为数据恢复…

Linux命令大全 以及搭建hadoop

Liunx系统目录 ├── bin -> usr/bin # 用于存放二进制命令 ├── boot # 内核及引导系统程序所在的目录 ├── dev # 所有设备文件的目录&#xff08;如磁盘、光驱等&#xff09; ├── etc # 配置文件默认路径、服务启动命令存放目录 ├── home # 用户家目录&#…

UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动

UEFI安全启动模式下安装ubuntu的nvidia显卡驱动 实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 一、NVIDIA官网下载驱动 1.1在浏览器地址栏输入https://www.nvidia.cn/drivers/lookup/进入网站&#xff0c;接着手动驱动搜索&#xff0c;并…

【C语言】:动态内存管理

1、为什么要有动态内存分配2、动态内存管理函数2.1 malloc2.2 free2.3 calloc2.4 realloc 3、常见的动态内存的错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块动态开辟内存的一部分3.5 对同一块动态内存多次…

stm32单片机开发三、DMA

DMA其实就是一种将ADC的数据寄存器、串口的数据寄存器等等一些数据放到sram中特定位置&#xff0c;方便CPU去读取 比如ADC转换&#xff0c;DMA直接转换的ADC的值放在内存中的特定位置&#xff0c;CPU可以直接去读取 uint16_t AD_Value[4]; //定义用于存放AD转换结果的全局…