计算机视觉教程核心版(四)激活函数

目录

基础神经网络

常用非线性函数

基础神经网络

在线性分类中,我们不同视觉类别的得分函数是通过f=Wx,W是权重矩阵,x是一个输入列向量。在神经网络中,我们计算的是f=W_{2}max(0,W_{1}x),如图所示结构。

函数max(0,x)是一个非线性化函数,其作用于输入的每个像素。像这样的非线性化函数有许多,但这个是一个常用的选择,其将所有的输入小于零的值归零,其他不变。如上图,假设输入shape为[1*3072],最终W_{2}的size[100*100],最终我们得到10个类别得分。

非线性函数

每一个输入函数接受一个数字作为输入,并且对数字执行特定的数学操作。这里介绍一些实际中可能也遇到的激活函数。

1、Sigmoid

Sigmoid非线性化压缩输入值域到[0,1]。

sigmoid过去常常被使用,因为它可以被看做神经元的饱和放电率。但如今已经过时了。它主要由两个缺点:

  • Sigmoid饱和并杀死梯度:sigmoid函数一个非常不理想的特性。当神经元饱和要么在0,要么在1,梯度在这些区域近乎为零。反向传播过程,本地梯度将会乘以门控输出梯度。因此,如果本地梯度非常小,它将会杀死梯度并且几乎没有更新权重信号能够流动在神经网络。例如初始权重太大,神经元将会饱和,神经网络很难学习到有用信息。如下图

当x=-10输出为0,则本体梯度可以计算为0,则最终梯度几乎为零。由此,此节点之后,更多节点梯度将被其杀死。x=10同理

  • sigmoid输出非零中心zero-centered。zero-centered指的是数据有正有负,以零为中心分布。(数据处理中常常用减去均值的办法,使得每个数据达到zero-centered)对于sigmoid函数,在误差反向传播的过程中,我们可以得到其导数:

                                                                        \frac{\partial L}{\partial w}=\frac{\partial L}{\partial x} * \frac{\partial g}{\partial x}

\frac{\partial g}{\partial x}=x,\frac{\partial L}{\partial x}=g*(1-g)>0,则\frac{\partial L}{\partial x}的符号与输入保持一致。假设现在有w1、w2,为了达到最优的参数,当前的权值需要增大、减小,然而因为输入全为正值或者负值,导致二者更新方向总是同时增大或者同时减小,优化过程将会变为zig--zag过程。如下图

如果输入神经网络的数据都是正数,。最终求得的梯度要么全都是正数,要么全都是负数,相当于把上游的符号传下来。

如果训练的数据并不是“零为中心”,我们将多个或正或负的梯度结合起来就会使这种情况有所缓解,但是收敛速度会非常缓慢。该问题相对于神经元饱和问题来说还是要好很多。具体可以这样解决,我们可以按batch去训练数据,那么每个batch可能得到不同的信号或正或负,这个批量的梯度加起来后可以缓解这个问题。

  • sigmoid中指数函数的计算比较消耗资源。

2、Tanh函数

tan函数表达式

                                          g(x)=2/((e^{-2x}+1))-1

导数

                         

                                          

tanh非线性化函数及其导数如下图,黄色线表示tanh函数,蓝色线表示其导数

tanh函数与Sigmoid函数对比

                                                                 

由图看出tanh函数相比于Sigmoid特点:

  • tanh将输入压缩到[-1,1]之间
  • 输出值以0为中心
  • 依然在饱和的时候杀死梯度

3.Relu函数

函数表达式

                                     g(x)=max(0,x)

函数导数

                                                 

               

Relu函数特点:

  • 以0为界,负值为0,正值为等值大小;导数是负值为0,正值为

优点:

  • 在输入为正时候避免了梯度消失,从而计算SGD时速度比较快

缺点

  • 依然输出有非0为中心的问题
  • 在输入为负(x=0时候梯度为零)时,会产生梯度消失问题。

dead Relu原因

  • 你的初始权重设置的特别差,导致大部分数据为负。
  • 当你的学习率很大时候,权值不断波动,当有一个较大的梯度传来,导致w的分布改变。Relu开始正常,之后变差最后挂掉。参考

多数时候人们将Relu偏置设为0

4.Leaky Relu

表达式f(x)=max(0.01x,x),如下图绿色表示原图,红色表示其导数图像

Leaky Relu特点:

  • 当x<0,y不再为0,而是一个比例函数

优点:

  • 理论上有Relu的一切优点,并且去除了‘Dyling Relu’问题。

缺点:

  • 实际中的表现并非如理论那般那么好

5.PRelu

表达式f(x)=max(ax,x),0<a<1。PRelu将LRelu的参数0.01替换为a,将它当做一个可以反向传播和学习的参数,这给与了它更多的灵活性。

6.ELU

指数线性单元ELU

表达式

                                               f(x)=\left \{_{a(exp(x)-1) \ if \ <=0} ^{x \if \ x > 0} \right.

特点:

  • 当x<0时候,y为指数函数
  • 理论上由Relu一切优点,去除了Dying Relu,同时输出近似zero-centered

缺点:

计算耗时

建议使用Relu,注意权重初始化和学习率大小设置。

猜你喜欢

转载自blog.csdn.net/tianzhiya121/article/details/89890379