激活函数(activation function)层又称非线性映射(non-linearity mapping)层,激活函数的引入为的是增加整个网络的表达能力(即非线性)。否则,若干线性操作层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数。在实际应用中,有多达十几种激活函数可以选择。本文就先讲讲Sigmoid 型函数和ReLU函数的优缺点。
Sigmoid函数
直观上,激活函数模拟了生物神经元特性:接受一组输入信号并产生输出。在神经科学中,生物神经元通常有一个阈值,当神经元所获得的输入信号累积效果超过了该阈值时,神经元就被激活而处于兴奋状态;否则处于抑制状态。在人工神经网络中,因Sigmoid型函数可以模拟这一生物过程,从而在神经网络发展历史进程中曾处于相当重要的地位。
Sigmoid型函数也被称为Logistic函数:
由上图可以看出,经过Sigmoid 型函数作用后,输出响应的值域被压缩到[0,1]之间,而0对应了生物神经元的“抑制状态”,1则恰好对应了“兴奋状态”。
同时,观察发现,在Sigmoid型函数两端,对于大于5(或者小于-5)的值无论多大(或者多小),都会被压缩到1(或0)。如此便带来一个严重问题,即梯度的“饱和效应”。对照Sigmoid型函数的梯度图,大于5(或者小于-5)部分的梯度接近0,这会导致在误差返现传播过程中,导数处于该区域的误差将很难甚至无法传递至前层,进而导致整个网络无法训练(导数为0将无法更新网络参数)。此外,在参数初始化的时候还需要特别注意,要避免初始化参数直接将输出值域带入这一区域。一种可能的情形是当初始化参数过大时,将直接引发梯度饱和效应而无法训练。
ReLU函数
为了避免梯度饱和效应的发生,进而引入了ReLU函数,ReLU函数是目前深度卷积神经网络中最为常用的激活函数之一。
ReLU实际上是一个分段函数,其定义为:
ReLU函数的梯度在x>=0时为1,反之为0。对于x>=0的部分完全消除了Sigmoid型函数的梯度饱和效应。同时,在实验中还发现相比Sigmoid型函数,ReLU函数有助于随机梯度下降方法收敛,收敛速度约快6倍左右。正是由于ReLU函数的这些优秀特性,ReLU函数已成为目前卷积神经网络及其他深度学习模型(如递归神经网络RNN等)激活函数的首选之一。
注:文章选自《解析深度学习—卷积神经网络原理与视觉实践》魏秀参著