本系列文章由 @yhl_leo 出品,转载请注明出处。

文章链接: http://blog.csdn.net/yhl_leo/article/details/51736830


Noisy Activation Functions是ICML 2016年新发表的一篇关于激活函数的论文,其中对以往的激活函数进行了深入的分析,并提出了训练过程中添加噪声的新方法,效果不错,觉得很有意义,目测会在今后的深度学习领域产生比较大的影响,因此将其原论文翻译,并略作注解(计划分两篇博客来写,本文涵盖从摘要到第三节的内容),希望能够帮助大家理解,如有纰漏,请指正。

Paper URL: http://arxiv.org/pdf/1603.00391v3.pdf

Abstract

神经网络中使用的常见的非线性激活函数(Nonlinear Activation Functions,同样也可以简称为 NAF),由于激活函数本身的饱和(Saturation)现象(饱和现象,后文有讲解是指训练收敛接近目标时,导数趋向于0的现象,这对于收敛是不利的,也就是越接近目标,如果学习率固定的话,每次迭代更新的结果与前一次迭代结果的差异性就会越小),会导致训练困难,这种情形中可能会使得一些 vanilla-SGD (只使用一阶梯度)不敏感的相关性损失。论文提出注入合适的噪音,从而让梯度更加显著(相对于不使用噪声的激活函数可能会出现零梯度的情形)。引入大量噪声会支配无噪声梯度(意思是引入噪声,改变了无噪声情形下的梯度大小以及方向),使得随机梯度下降(Stochastic Gradient Descent, SGD)算法在收敛过程中可以进行更多的尝试。我们通过在记过函数的不确定部分(problematic parts)添加噪声(在后文可以看到,噪声添加在激活函数两端导数为零的部分,这部分可能被称为 problematic parts),尝试让优化过程探索退化/饱和与激活函数良好部分(良好部分应该是与不确定部分互补的部分吧)之间的边界。当噪声的数量呈退火下降,会使得优化硬目标函数更加容易,我们建立了模拟退火关系。通过实验发现,用含噪声变量的激活函数替代传统的饱和激活函数,能够在很多情形下帮助训练,在不同数据集和任务中,产生非常好的结果,尤其是当训练看似非常困难的时候,例如,当需要通过课程学习(Curriculum Learning, Bengio et al., 2009)获得好的结果时。

1.Introduction

类似 ReLU 和 Maxout (Goodfellow et al., 2013)这种分段线性激活函数的引入,对于深度学习具有深远的影响,并成为一种主要的催化剂使得训练更深层的神经网络成为可能。多亏有了ReLU,我们才能第一次意识到深层纯监督网络可以进行训练(Glorot et al., 2011),而此之前的 tanh 非线性函数只能训练浅层的网络。关于最近涌起的对于这些分段线性激活函数的关注的似乎合理的假设认为,这是由于这些激活函数对于使用 SGD 和 BP(Back-Propagation)优化更加容易(相对于使用平滑的激活函数,例如 sigmiodtanh)。最近我们可以在计算机视觉领域中看到分段线性函数的成功案例,这也使得 ReLU 成为了卷积网络中激活层的标配。

我们提出一种新的训练神经网络的技术,当输入非常巨大时使用强饱和的激活函数。做法是在激活函数的饱和部分注入噪声,并学习噪声的规模。使用这种方法,我们发现使用更加广泛的激活函数种类来训练神经网络是可行的。而在此之前,就已经有人提出在 ReLU 单元中添加噪声(Bengio et al., 2013; Nair & Hinton, 2010)在前反馈网络(feed-forward networks)和玻尔兹曼机(Boltzmann machines)中,用以激励单元进行更多的探索,简易优化过程。

最近重新兴起了一股对于复杂闸门(Gate)架构的关注,例如 LSTMs (Hochreiter& Schmidhuber, 1997)和 GRUs (Cho et al., 2014),同时围绕神经的注意机制(Neural Attention Mechanisms, Desimone et al., 1995)出现了 NTM (Graves et al., 2014), Memory Networks (Weston et al., 2014),automatic image captioning (Xu et al., 2015), video caption generation(Yao et al., 2015)以及更为广泛的应用(LeCun et al., 2015)。贯穿这些研究工作的一点就是使用软饱和非线性函数,来模拟逻辑电路中的硬决策问题,例如 sigmiodsoftmax。尽管取得了一些成功,但是存在两点不容忽视的问题:

  1. 由于非线性函数的饱和特征,导致当穿越“闸门”时存在梯度消失问题;
  2. 由于非线性函数只是软饱和的,并不能实现硬决策。

因为闸门经常在软饱和状态下运作(Karpathy et al., 2015; Bahdanau et al., 2014; Hermann et al., 2015),这种架构下导致闸门无法完全开启或者关闭。我们采用一种新颖的方法来解决上述问题。我们的方法,通过使用硬饱和非线性函数来解决第二个问题,这种方法允许闸门在饱和状态时完全开启或者关闭。由于闸门可以完全开启或者关闭,将不存在软闸门架构泄露性导致的信息损失问题(因为软闸门的决策或者分类,都是一种近似)。

使用硬饱和非线性函数后,因为梯度在饱和状态时,被精确设置为0而不是趋向于0,这加重了梯度流的问题。然而,通过在激活函数中进入随着饱和程度变化的噪声,能够促进随机探索。(这两句话,我觉得是这样理解的,单纯使用硬饱和非线性函数后,由于在饱和状态时梯度为0,就没办法继续优化,这样看硬饱和非线性函数虽然具备硬决策的优势,但是却不利于训练,于是为了避免在饱和状态下无法继续优化和探索,第二句指出,如果根据饱和的程度/量级,引入适当的噪声,这样梯度就不为0,SGD等方法仍然可以继续探索。)

在测试时,激活函数中的噪声可以剔除或者使用期望值替换,而且根据实验显示,(我们的方法)在多种任务的决策网络中的实验结果胜过软饱和函数的方法,而且只要简单直接地替换掉现有训练代码中非线性函数部分,就能获得抢眼的表现。

我们提出的技术解决了优化困难问题,在测试时能够针对闸门单元实现硬激活,另外,我们提出一种应用于神经网络的模拟退火方法。

Hannun et al. (2014); Le et al. (2015) 在简单 RNNs 中使用过 ReLU 激活函数。本文,我们成功证实了,在带闸门架构的循环网络(例如, LSTM, GRU’s)中使用分段线性激活函数是可行的。

2. Saturating Activation Functions

定义 2.1: 激活函数(Activation Function)。激活函数值得是一种映射关系 h : R → R, 几乎在整个定义域内都是可微的。(R是数域中的实数集,也就是映射关系中的象与原象都是实数)

定义 2.2: 饱和(Saturation)。当激活函数 h(x) 的导函数 h’(x) 满足x → ∞(或者 x → −∞)时值为0,则称其为右(左)饱和。当激活函数同时满足左、右饱和时,就称其为饱和。(用数学公式表示如下)

大多数常见的使用在循环网络中的激活函数(例如 sigmoidtanh )都是饱和的。并且它们都是软饱和,也就是说,它们只能在极限状态下达到真正的饱和状态。

定义 2.3 :硬/软饱和(Hard and Soft Saturation)。对于任意的x,如果存在常数c,满足 x > c 有 h’(x) = 0和 x < c 有h’(x)=0,则称这种激活函数为硬激活,而像前面所述的那些只有在极限状态下偏导数等于0的函数,称之为软饱和。(为了方便理解,我在matlab中绘制出两种函数曲线,见图 1。)



图 1 硬/软饱和

我们可以通过泰勒展开(Taylor expansion)在0点附近展开,将软饱和函数进行近似(只保留到一阶导部分),从而构造成硬饱和函数。

以 sigmoid 函数和 tanh 函数为例,在0附近进行展开:

截取得到的线性近似解:

(同样把hard-sigmoid(x)和hard-tanh(x)给绘制出来,见图 2。)



图 2 hard-sigmoid 和 hard-tanh

这样构造的动机为了使靠近0时函数具有线性特性,从而在单元还未饱和时,梯度流向更加显著,而在饱和部分能够获得硬决策。

hard-sigmoid 和 hard-tanh 函数能够获得硬决策,但代价却是导致饱和区域的梯度为0。这会导致训练困难,(于是提出)引入一些小但不是无穷小的变化在预激活前能够帮助解决这个问题,与此同时却不会影响整体的梯度。

在文档后续部分,我们用h(x)表示一般的激活函数,使用u(x)来表示前面所述的通过泰勒在0处展开保留到一阶导数部分的线性函数。(见图 2)hard-sigmoid函数在区间x小于等于-2和大于等于2内,处于饱和状态,而hard-tanh在区间x小于等于-1和大于等于1内饱和。我们令xt 为函数(饱和边界)阈值。对于两种函数其绝对值分别是 xt=2(hard-sigmoid)和 xt=1(hard-tanh。

需要注意的是,我们指出 hard-sigmoid(x) 和 hard-tanh(x)函数都是收缩的映射(contractive mapping)。这种收缩只有在输入值的绝对值大于阈值(前面刚提到的)时成立。这些激活函数的一个非常重要的差异在于不动点不同(fixed point,对于不动点、吸性不动点在该篇博客中都有讲述)。hard-sigmoid(x)的不动点为x=2/3, 而 sigmoid(x) 的不动点约为0.69。对于在区间-1到1之间的任意实数,都是 hard-tanh(x) 函数的不动点,而 tanh(x) 函数的不动点只有个x=0。另外,tanh(x) 和 sigmoid(x) 函数的不定点属于吸性不动点。这些饱和激活函数在数学上的差异性,导致它们在 RNNs 和深层网络中表现出入较大。

在某些应用中,那些陡峭不平滑的梯度下降轨迹,获得的参数有可能使得激活单元趋向于0梯度的区域,而在这种情形下很有可能会难以摆脱并被困在这种0梯度区域。

当(激活)单元饱、梯度消失时,算法补救的方法,往往是投入更多的训练数据和进行大量的计算去弥补。



Figure 1. 各种激活函数的导数图

3. Annealing with Noisy Activation Functions

给定一个噪声激活函数 φ(x,ξ) ,我们注入独立同分布的(Independent Identically Distributed, IID)的噪声ξ,来代替像前文中提到的 hard-sigmoid 和 hard-tanh 这样的饱和非线性函数。接下来的部分,我们将会描述所提出的噪声激活函数,但在之前我们想先介绍一下这类噪声激活函数家族。

令ξ具有方差为 σ^2,,均值为0。我们想描述,当我们逐渐将噪声退火,也就是从大量噪声逐渐减少到不存在噪声,会发生什么。

而且,我们假设 φ 满足,当噪声的量级非常大时, φ 对 x 求导存在极限:

而在噪声为0处对应的极限φ(x,0),就是前面提到的普通的确定性的非线性激活函数,在我们的实验中,这种(噪声激活函数 φ )是分段线性而且可以通过学习得到我们想要的复杂的函数。Figure 2阐述了刚刚提到的概念,在噪声数量趋向于无穷大时,BP算法由于 φ 偏导数较大而获得较大梯度,由此噪声会淹没信号(就像示例中给出的方差为无穷大时的梯度远远大于方差为0时(此时的输入认为是真实信号))。因此,SGD就带着模型待求解参数随着噪声到处探索,而且由于梯度是无穷大,也就无法得知所谓的趋势方向。

Figure 2. 一种1-维,非凸的目标函数,使用简单的梯度下降方法效果不佳。当噪声数量较大时,SGD算法能够通过大量探索,避免鞍点以及局部最小极值点。当噪声数量退火到趋近于0时,SGD算法能够最终收敛到一个局部极值点x*。

退火过程与信噪比(Signal to Noise Ratio, SNR)是相关的,此处信噪比可以定义为信号和噪声方差之比:

如果 SNR 趋向于0,模型就会随机探索(没有所谓的梯度下降趋势)。随着退火过程,SNR 将会逐渐增大(噪声方差减少),而当噪声方差收敛到0时,训练探索中唯一噪声来源就是Monte Carlo估算的随机梯度。

以往的研究中恰好有一些方法,例如 simulated annealing( Kirkpatrick et al., 1983)和 continuation methods(Allgower & Georg, 1980),在上文提到的优化那种非凸包的目标时,对我们都非常有帮助。虽然充斥着大量噪声,让 SGD 自由地探索更多参数空间。随着噪声减少,往往趋向于停留在信号强度足够被 SGD 感受到的区域:给定有限的 SGD 迭代步骤,噪声非均匀分布而且其方差占主导地位的区间。这时 SGD 会花费更多时间在全局较优的参数空间内。当噪声接近于0时,就相当于我们在微调(fine-tuning)我们的解决方案和收敛到损失最小的无噪声目标函数。


后面章节,待续~~~

《Noisy Activation Function》噪声激活函数(一)的更多相关文章

  1. 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激活 ...

  2. The Activation Function in Deep Learning 浅谈深度学习中的激活函数

    原文地址:http://www.cnblogs.com/rgvb178/p/6055213.html 版权声明:本文为博主原创文章,未经博主允许不得转载. 激活函数的作用 首先,激活函数不是真的要去激 ...

  3. 激活函数:Swish: a Self-Gated Activation Function

    今天看到google brain 关于激活函数在2017年提出了一个新的Swish 激活函数. 叫swish,地址:https://arxiv.org/abs/1710.05941v1 pytorch ...

  4. MXNet 定义新激活函数(Custom new activation function)

    https://blog.csdn.net/weixin_34260991/article/details/87106463 这里使用比较简单的定义方式,只是在原有的激活函数调用中加入. 准备工作下载 ...

  5. caffe中的sgd,与激活函数(activation function)

    caffe中activation function的形式,直接决定了其训练速度以及SGD的求解. 在caffe中,不同的activation function对应的sgd的方式是不同的,因此,在配置文 ...

  6. ML 激励函数 Activation Function (整理)

    本文为内容整理,原文请看url链接,感谢几位博主知识来源 一.什么是激励函数 激励函数一般用于神经网络的层与层之间,上一层的输出通过激励函数的转换之后输入到下一层中.神经网络模型是非线性的,如果没有使 ...

  7. TensorFlow Activation Function 1

    部分转自:https://blog.csdn.net/caicaiatnbu/article/details/72745156 激活函数(Activation Function)运行时激活神经网络中某 ...

  8. 转载-聊一聊深度学习的activation function

    目录 1. 背景 2. 深度学习中常见的激活函数 2.1 Sigmoid函数 2.2 tanh函数 2.3 ReLU函数 2.4 Leaky ReLu函数 2.5 ELU(Exponential Li ...

  9. TensorFlow实战第一课(session、Variable、Placeholder、Activation Function)

    莫烦tensorflow教学 1.session会话控制 Tensorflow 中的Session, Session是 Tensorflow 为了控制,和输出文件的执行的语句. 运行session.r ...

随机推荐

  1. bzoj [JSOI2010]Group 部落划分 Group【二分+并查集】

    我是zz吗这么简单都写错-- 一眼二分,然后判断的话是枚举点,然后计算这个点到已有联通块的最小距离,如果这个点到一些联通块的距离小于当前二分的val,则把这些联通块合并起来,这里用并查集维护,最后看这 ...

  2. JAVA的双色球 小程序

    还是挺简单的,功能过于强大. import java.util.Arrays; import java.util.Random; import java.util.Scanner; public cl ...

  3. c++ strcmp函数

    用法:加头文件 #include <string.h> 功能:比较字符串s1和s2. 一般形式:strcmp(字符串1,字符串2) 返回值: 当s1<s2时,返回值<0 当s1 ...

  4. python自动化测试学习笔记-9测试框架

    学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:

  5. ASP.NET MVC5 之 客户端实现文件的下载

    MVC 实现下载功能主要借助于 File 属性: //下载文件接口 public ActionResult GetTrackTempIsc(ICSModels icsModels) { bool fl ...

  6. Objective-C设计模式——单例Singleton(对象创建)

    单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...

  7. from scipy import spatial 出现 from .qhull import * ImportError: DLL load failed: The specified module could not be found. 错误

    错误描述: 本人机器window8.1 64位,python2.7. Traceback (most recent call last): File "C:/Users/Hamid/Docu ...

  8. Verification Mind Games---how to think like a verifier像验证工程师一样思考

    1. 有效的验证需要验证工程师使用不同于设计者的思维方式思考问题.具体来说,验证更加关心在严格遵循协议的基础上发现设计里面的bug,搜索corner cases,对设计的不一致要保持零容忍的态度. m ...

  9. 用rownum先排序后分页

    今天突然想到rownum可以解决分页问题,于是做了各种实验,找个几个文章,最后有了一定成果. 现有表tablename,含有字段showorder,要求提取showorder的第11行到20行数据. ...

  10. re模块,正则表达式

    re模块 作用:取文本或者字符串内你所需要的东西 正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. ^叫做元字符,元 ...