《Noisy Activation Function》噪声激活函数(一)

本系列文章由 @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)我们的解决方案和收敛到损失最小的无噪声目标函数。



后面章节,待续~~~

时间: 2024-10-02 10:19:36

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

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

https://blog.csdn.net/weixin_34260991/article/details/87106463 这里使用比较简单的定义方式,只是在原有的激活函数调用中加入. 准备工作下载MXNet源代码,确认可以顺利编译通过.推荐在Linux下进行此操作: https://mxnet.incubator.apache.org/get_started/install.html 编写激活函数先前和先后传递在src/operator/mshadow_op.h里面,加入新的激活函数向前传递

激活函数-Activation Function

该博客的内容是莫烦大神的授课内容.在此只做学习记录作用. 原文连接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/2-6-A-activation-function/ 非线性方程 我们为什么要使用激活函数?用简单的语句来概括,就是因为显示并没有我们想象的那么美好 ,它是残酷多变的.哈哈,开个玩笑,不过激活函数也就是为了解决我们日常生活中不能用线性方程所概括的问题. 好了,我知道你的问题来了. 什么是线性方程(

Activation Functions:激活函数

1. 激活函数:激活函数是指在人工神经网络的神经元中,将输入映射到输出端的非线性函数.激活函数通常是非线性的,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,可以应用到非线性模型中. 一般进行线性操作后,就将线性操作的结果放入激活函数中映射.在CNN中,运算顺序通常是卷积 - 池化 - 批量归一化 - 激活函数 常见的激活函数:sigmoid.tanh.ReLU.Maxout.Leaky ReLU.ELU 2. sigmoid:将元素压缩(映射)到0和1之间,当参数过大

什么是激励函数 (Activation Function)

relu sigmoid tanh 激励函数. 可以创立自己的激励函数解决自己的问题,只要保证这些激励函数是可以微分的. 只有两三层的神经网络,随便使用哪个激励函数都可以. 多层的不能随便选择,涉及梯度爆炸,梯度消失的问题. 卷积神经网络推荐relu 循环神经网络推荐tanh或者relu

激励函数Activation Function

1.激励函数的作用 不使用激励函数的话,神经网络的每层都只是做线性变换,多层输入叠加后也还是线性变换.因为线性模型的表达能力不够,激励函数可以引入非线性因素. 2.Torch中的激励函数 import torch import torch.nn.functional as F import matplotlib.pyplot as plt #随便做一些数据来观看函数的图像 x = torch.linspace(-5, 5, 200) #tensor x_np = x.numpy() #把tens

开啃《机器学习》(周志华)- 第5章 神经网络

基本概念: Neural Networks:神经网络,由具有适应性的简单单元组成的广泛并行互联的网络,能够模拟生物神经系统对真实物体之间做出的交互反应 Neuron:神经元,神经网络的组成单元,收到的输入超过阀值时,会被激活,并传递信息到下一级神经元. M-P神经元模型:每个神经元接收到来自n个其他神经元传来的信号,每个输入信号带有一个connection weight(连接权重),加权得到一个总输入值与threshold(阀值)进行比较,通过activation function(激活函数,如

从程序员的角度设计一个Java的神经网络

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 来自维基百科: 人工神经网络(ANN)或连接系统是受生物神经网络启发构成生物大脑的计算系统.这样的系统通过考虑例子来学习(逐步提高性能)来完成任务,通常没有任务特定的编程. 用Java或任何其他编程语言设计神经网络我们需要理解人工神经网络的结构和功能. 人工神经网络执行的任务比如有模式识别.从数据中学习以及像专家一样预测趋势,而不像传统的算法方法那样需要执行一组步骤来实现所定义的目标.人工神经网络由于其高度交互的网络结构,可以学习如何自己解

deeplearning.ai课程学习(4)

第四周:深层神经网络(Deep Neural Networks) 1.深层神经网络(Deep L-layer neural network) 在打算使用深层神经网络之前,先去尝试逻辑回归,尝试一层然后两层隐含层,把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估. 2.前向传播和反向传播(Forward and backward propagation) 前向传播: 反向传播: 3.为什么使用深层表示?(Why deep representa

神经网络中的激活函数具体是什么?为什么Relu要好过与tanh和sigmoid function

为什么要引入激活函数? 如果不用激活函数(其实相当于激励函数是f(x)=x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机了. 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是是输入的线性组合,可以逼近任意函数).最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入.激活函数的作用是为了增加神经网络模型的非线性.否则你想