DeepLearning:训练神经网络—激活函数的选择

训练神经网络—激活函数的选择


​ 神经元的输入在线性求和之后需要使用非线性的激活函数来把它激活,正是因为非线性的激活函数才能为神经网络带来非线性,才可以拟合非线性的决策边界以解决非线性的分类和回归问题。

​ 我们可以将激活函数分为两类:分别是“饱和激活函数”以及“非饱和激活函数”。

1、Sigmoid函数

Sigmoid函数表达式

σ ( x ) = 1 1 + e − x \sigma \left( x \right) =\frac{1}{1+e^{-x}} σ(x)=1+ex1 {$$}

Sigmoid函数图像

image-20211114145218841

Sigmoid函数特点

  • 该函数是挤压函数,可以把数值挤压在[0,1]之间。
  • 该函数可解释性好,可类比神经细胞是否激活,本质上可以划分为二分类问题,0为一类,1为一类。

Sigmoid函数缺点

​ 在实际编程中,我们几乎不选择Sigmoid函数作为激活函数,主要是因为Sigmoid函数存在三个问题:

①饱和性会导致梯度消失现象(x过大或过小的时候接近于0)

举例说明:
L    =    [ σ ( w x + b ) 2 ] , σ ( x ) = 1 1 + e − x ∂ L ∂ x = ∂ L ∂ σ ⋅ ∂ σ ∂ x    = 2 ⋅ σ ( w x + b ) ⋅ σ ′ ( x )    = 2 ⋅ σ ( w x + b ) ⋅ σ ( w x + b ) ( 1 − σ ( w x + b ) ) ⋅ w L\,\,=\,\,\left[ \sigma \left( wx+b \right) ^2 \right] ,\sigma \left( x \right) =\frac{1}{1+e^{-x}} \\ \frac{\partial L}{\partial x}=\frac{\partial L}{\partial \sigma}\cdot \frac{\partial \sigma}{\partial x} \\ \,\, =2\cdot \sigma \left( wx+b \right) \cdot \sigma '\left( x \right) \\ \,\, =2\cdot \sigma \left( wx+b \right) \cdot \sigma \left( wx+b \right) \left( 1-\sigma \left( wx+b \right) \right) \cdot w L=[σ(wx+b)2],σ(x)=1+ex1xL=σLxσ=2σ(wx+b)σ(x)=2σ(wx+b)σ(wx+b)(1σ(wx+b))w
​ 当x=-10时,局部梯度趋近于0

​ 当x= 0 时,局部梯度等于0.25

​ 当x = 10时,局部梯度等于0

②经过激活函数后,输出值不再关于零对称,且伴随ZigZagPath现象。

​ 每个神经元中函数关于权重值的导数同号,即所有的权重值要么一起增大要么一起减小,同步增长。

举例说明:

​ 假如有1,即有image-20211115084749235用f=sigmoid函数激活,对image-20211115084914549求偏导有image-20211115085552383,其中image-20211115085157360为本层输入(同时也可以看做上一层的输出),若上层神经元全用sigmoid激活,那么image-20211115085157360一定为正数,即image-20211115085552383的结果都是整数,即所有权重要么同时增大,要么同时减小,即会出现zigzagpath现象。

③exp()指数运算相较于其他运算会更加消耗计算资源。

2、双曲正切函数

双曲正切函数表达式

tanh ⁡ x = e x − e − x e x + e − x \tanh x=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanhx=ex+exexex

双曲正切函数图像

image-20211115085558789

双曲正切函数特点

​ 从双曲正切函数的图像和sigmoid函数类似,两者之间可以通过缩放,平移变换得到,相比于sigmoid函数的优点就是函数的输出值有正有负,解决了zigzagpath现象。

双曲正切函数缺点

①饱和现象

​ 双曲正切函数同样在输入值过大或过小时产生饱和现象,即会出现梯度消失现象。

3、Relu函数及其变形

Relu函数表达式

σ ( x ) = { x      i f    x ⩾ 0 0      o t h e r w i s e \sigma \left( x \right) =\begin{cases} x\,\,\,\,if\,\,x\geqslant 0\\ 0\,\,\,\,otherwise\\ \end{cases} σ(x)={xifx00otherwise

Relu函数图像

image-20211115091205455

Relu函数特点

​ 由图像可以看出来在x小于0的部分,函数的取值都为0,也就是把输入值x小于0的部分都抹平了,这也叫做整流(Relu函数叫做线性整流函数,又称修正线性单元)。该函数从图像上可以看出:随着x的增大,输出值也增大,不会发生饱和。由于在x大于0的部分,函数对数据没有经过处理,直接输出,所以relu函数易于计算,消耗的计算资源少(在CIFAR-10数据集上,使用不同的激活函数来训练4层的CNN网络收敛速度不同,relu要比sigmoid和tanh快6倍以上)

Relu函数缺点

①输出不关于0对称

​ 从图像可以看出,当x小于0时,图像输出为0,即函数的梯度也是0,代表神经元死亡或瘫痪。(Dead Relu will never activate which means never update)

产生原因

​ 1.初始化不良:随机初始化权重可能会导致产生大部分输入都是0甚至全部都是0的现象,即梯度也是0。2.学习率太大,会跳入黑洞。

改进优化
增添偏置项

​ 开始时Relu函数增加一个偏置项0.01即可保证不会出现输出值为0的情况:
σ ( x ) = max ⁡ ( 0 , x ) + 0.01 \sigma \left( x \right) =\max \left( 0,x \right) +0.01 σ(x)=max(0,x)+0.01

Leaky Relu

​ 函数表达式:
σ ( x ) = { x      i f    x ⩾ 0 α x      o t h e r w i s e \sigma \left( x \right) =\begin{cases} x\,\,\,\,if\,\,x\geqslant 0\\ \alpha x\,\,\,\,otherwise\\ \end{cases} σ(x)={xifx0αxotherwise
​ 函数图像:

image-20211115100444409

​ 函数特点:

​ 在Leaky Relu中,参数是提前人为指定的,通常为0.01,函数在所有取值上都不会饱和,同时解决了relu函数中当x小于0时出现梯度为0的情况。

PRelu

​ 函数表达式:
σ ( x ) = { x      i f    x ⩾ 0 α x      o t h e r w i s e \sigma \left( x \right) =\begin{cases} x\,\,\,\,if\,\,x\geqslant 0\\ \alpha x\,\,\,\,otherwise\\ \end{cases} σ(x)={xifx0αxotherwise
​ 函数图像:

image-20211115100444409

​ 函数特点:

​ 参数化修正线性单元(Parametic Rectifier),在PRelu中,参数是反向传播过程中根据数据值大小,由神经网络自己学习的,而非预先定义,通常为0.01,函数在所有取值上都不会饱和,同时解决了relu函数中当x小于0时出现梯度为0的情况。

RRelu

​ 函数表达式:
σ ( x ) = { x      i f    x ⩾ 0 α x      o t h e r w i s e \sigma \left( x \right) =\begin{cases} x\,\,\,\,if\,\,x\geqslant 0\\ \alpha x\,\,\,\,otherwise\\ \end{cases} σ(x)={xifx0αxotherwise
​ 函数图像:

image-20211115101639477

​ 函数特点:

​ 随机修正线性单元( randomized leaky rectified),在RRelu中,参数在训练集中是随机的,即在某个区间内变动,在之后的测试中就变成了固定的值,不再改变。

ERelu

​ 函数表达式:
σ ( x ) = { x                              i f    x ⩾ 0 α ( e x − 1 )       o t h e r w i s e \sigma \left( x \right) =\begin{cases} x\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,if\,\,x\geqslant 0\\ \alpha \left( e^x-1 \right) \,\,\,\,\,otherwise\\ \end{cases} σ(x)={xifx0α(ex1)otherwise
​ 函数图像:

image-20211115104120246

​ 函数特点:

​ 随机修正线性单元( randomized leaky rectified),在RRelu中,参数在训练集中是随机的,即在某个区间内变动,在之后的测试中就变成了固定的值,不再改变。

4、Maxout

参考:Maxout

Maxout表达式

h i ( x )    =    max ⁡ j ∈ [ 1 , k ] z i j z i j    =    x T W . . . i j    +    b i j h_i\left( x \right) \,\,=\,\,\underset{j\in \left[ 1,k \right]}{\max}z_{ij} \\ z_{ij}\,\,=\,\,x^TW_{...ij}\,\,+\,\,b_{ij} hi(x)=j[1,k]maxzijzij=xTW...ij+bij

Maxout函数示意图(k=2)

​ before:

maxout-01.png

​ 该图是基本的Maxout连接示意图,前半部分与常见的全连接层并无区别,之后每两个单元"连接"到一个单元上(由于五参数,故并非真正连接),从这两个单元中如何选出一个单元值呢,那也就是比较这两个单元中的最大值,大的值便可通过,这也就是maxout。

after:

​ 两个单元中最大的单元被选出。

maxout-02.png

Maxout函数特点

​ Maxout不仅仅是激活函数,还改变了神经网络的结构。我们知道在该层神经网络中,每个单元都是上层特征的线性组合,那么如果一个单元学到了y=0,另一个学到了y=x,那么本质上相当于Relu激活函数。

​ 如果我们使每个k单元都连接到一个单元上,那么Maxout可以学习到更多段的分段函数作为激活函数,当k足够大时,理论上可以拟合任何凸函数。

总结

  • Use Relu.Be careful with your learning rates.(要使用Relu,但是我们要注意学习率不要太大,否则可能会跳入黑洞)
  • Try out tanh but donnot except much.(可以使用双曲正切函数,但是不要对结果抱有太大希望)
    都连接到一个单元上,那么Maxout可以学习到更多段的分段函数作为激活函数,当k足够大时,理论上可以拟合任何凸函数。

总结

  • Use Relu.Be careful with your learning rates.(要使用Relu,但是我们要注意学习率不要太大,否则可能会跳入黑洞)
  • Try out tanh but donnot except much.(可以使用双曲正切函数,但是不要对结果抱有太大希望)
  • Donnot use sigmoid(不要在中间层轻易使用sigmoid)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ELU(指数线性单元)是一种神经网络激活函数,与ReLU(整流线性单元)等其他激活函数相比,具有更好的凸性和收敛性。在Matlab中,可以使用nlm函数来实现ELU激活函数的计算。 在Matlab中,首先需要定义一个ELU函数的函数句柄: function y = elu(x, a) y = max(x, 0) + (a * (exp(min(x, 0)) - 1)); end 其中,a是一个参数,它控制了ELU函数在负半轴上的斜率。对于大多数情况,可以将a设置为1。 然后,在使用神经网络时,可以将ELU函数应用于激活层的输出: net = feedforwardnet([10 5]); net.layers{1}.transferFcn = 'elu'; 其中,feedforwardnet创建一个前馈神经网络对象,[10 5]定义其结构,'elu'将ELU函数应用于第一层的激活函数。 在训练过程中,可以使用常规的反向传播算法来更新神经网络的权重和偏差。使用ELU激活函数可能会提高模型的准确性和收敛速度,因为它可以在避免梯度爆炸的同时加速神经网络的收敛。 ### 回答2: 激活函数elu(Exponential Linear Unit)是一种常用的神经网络的非线性激活函数之一,在Matlab中可以通过使用relu函数来实现。 具体来说,elu函数可以通过以下公式来定义: f(x) = x, if x >= 0, alpha * (exp(x) - 1), if x < 0 其中,alpha是一个常数,通常设置为1。当x小于0时,elu函数将返回一个指数特征值减1的值。这个指数特征值使得elu函数具有负值输入的鲁棒性,并且在整个实数范围内都是连续可微的。 在Matlab中,可以通过创建一个matlab Function对象来定义elu函数,并且使用这个对象在神经网络中进行激活操作。下面是一个关于如何在Matlab中实现elu函数的示例代码: function [y] = elu(x) alpha = 1; y = max(x, 0) + alpha * (exp(min(x, 0))-1); end 然后,我们可以在神经网络使用这个elu函数作为激活函数,比如: layer1 = convolution2dLayer(5,20,'Padding',2); layer1.ActivationFcn = @elu; ### 回答3: ELU(Exponential Linear Unit)是一种常用的非线性激活函数,可以被用于卷积神经网络和深度神经网络中。 在Matlab中,可以使用feval函数和'elu'字符串调用ELU激活函数。实现代码如下: function output = elu(input) alpha = 1.0; %设置alpha参数,可以根据实际情况进行调整 mask = input > 0; %创建mask过滤器 output = input; output(~mask) = alpha * (exp(output(~mask)) - 1); %将负值的部分变换为指数函数 end 以上代码定义了一个ELU函数,其中alpha参数可以根据实际情况进行调整,mask过滤器用来过滤非正数的输入,然后对非正数的部分进行指数函数变换处理,从而得到输出结果。 同时,在深度学习中,也可以使用Matlab内置的Deep Learning Toolbox来实现ELU激活函数。只需要在构建网络模型时,将'elu'作为激活函数的名称,即可使用ELU激活函数。代码示例如下: layers = [ imageInputLayer([28 28 1]) fullyConnectedLayer(1024) reluLayer('Name','relu1') %使用ReLU激活函数 fullyConnectedLayer(512) eluLayer('Name','elu1') %使用ELU激活函数 fullyConnectedLayer(10) softmaxLayer classificationLayer]; 在以上代码中,reluLayer函数和eluLayer函数分别被用作激活函数,用来实现不同的非线性变换,从而提高模型的表达能力。 综上所述,在Matlab中可以通过自己编写代码或调用Deep Learning Toolbox来实现ELU激活函数,而且使用方便,也有很好的软件支持,可以大大提高深度学习效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值