深度学习——PyTorch实战计算机视觉5

激活函数

举例:

没有激活函数的单层神经网络模型,数学表示:

f(x)=W\cdot X

大写字母表示矩阵或张量。

有激活函数和偏置项的二层神经网络:(设激活条件为:若输入值大于0,输出该值,反之输出0)

g(x)=2\cdot x+3

上式是偏置为3的函数。偏置可以让模型偏离原点,而没有偏置项的函数必然会经过原点。模型偏离原点的好处是:能使模型具有更强的变换能力,面对不同的数据可以有更好的泛化力。增加偏置项后没有激活的单层神经网络模型的数学表示:

f(x)=W\cdot X+b

加入激活函数的二层神经网络数学表示:

f(x)=max(W_2\cdot max(W_1\cdot X+b_1,0)+b_2,0)

若上面的二层神经网络模型没有激活函数,继续加深网络也只是一味地加深层次,比如加到三层,数学表示为:

f(x)=W_3\cdot (W_2\cdot (W_1+b_1)+b_2)+b_3

可见这仍然是一个线性模型,若不引入激活函数的话会一直这样,线性模型用于非线性问题会存在很大局限性。而激活函数可以给模型带来非线性因素。非线性模型能够处理更复杂的问题。通过选取不同激活函数,可以获得复杂多变的深度神经网络。

下面举例三种常用的非线性激活函数:

1. Sigmoid

表达式:

f(x)=\frac{1}{1+e^{-x}}

根据Sigmoid函数,可得到其几何图形,如下图(来自百度百科):

可见数据经过激活后,输出区间限制到了[0,1]。

Sigmoid一开始被作为激活函数使用时收到了大众认可,主要原因是:从输入到经过Sigmoid激活函数激活输出的一系列过程与生物神经网络的工作机理非常相似。但Sigmoid作为激活函数也存在缺点:最明显的就是用Sigmoid作为激活函数会导致模型的梯度消失,因为Sigmoid导数的取值区间为[0,0.25]。

根据复合函数的链式法则,若每层神经网络的输出节点都用Sigmoid作为激活函数,那么在后向传播的过程中每逆向经过一个节点,就要乘上一个Sigmoid的导数值,而Sigmoid的导数值的取值区间为[0,0.25],所以即使每次都成最大值0.25,梯度值也会变为原来的四分之一。若模型达到了一个深度,就会导致梯度越来越小,直到消失。

其次,Sigmoid函数的输出恒大于0,那么模型优化过程中收敛速度变慢,又会增加时间成本。故而在选取参与模型中相关计算的数据时,要尽量使用零中心(Zero-Centered)数据,且尽量保证计算得到的输出结果是零中心数据。

2. tanh

表达式:

f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}

根据tanh函数,可得到其几何图形,如下图(来自百度百科):

由上图可见,tanh函数的输出结果是零中心数据,所以解决了激活函数在模型优化过程中收敛速度变慢的问题。然而tanh的导数取值区间为[0,1],还是不够大,仍有可能出现梯度消失

3. ReLU

表达式:

f(x)=max(0,x)

根据ReLU函数,可得到其几何图形,如下图(来自百度百科):

ReLU函数的收敛速度非常快,计算效率远高于Sigmoid和tanh。由上图可见,ReLU的输出并不是零中心数据,所以可能会导致某些神经元永远不会被激活,并且这些神经元相对应的参数不能被更新。这一般是由于模型参数在初始化时使用了全正或者全负的值,或者在后向传播过程中设置的学习率太快导致的。其解决方法是对模型参数使用更高级的初始化方法,如Xavier,以及设置合理的后向传播学习率,推荐使用自适应的算法如Adam。

发布了115 篇原创文章 · 获赞 33 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/102631843