激活函数二三事
本篇主要来复习一下关于激活函数的一些知识,其中包括激活函数的定义,作用,发展历程以及不同激活函数的优缺点与适用范围。
什么是激活函数
激活函数(activation function)又称非线性映射函数或是隐藏单元,是神经网络中中最主要的组成部分之一。 “激活”这个名字来自于生物上的神经网络结构。 我们知道,人工神经网络最初是受到生物上的启发,设计出了神经元这种单位结构,在每个神经元中,需要一个“开关”来决定该神经元的信息是否会被传递到其相连的神经元去,这个“开关”在这里也就是激活函数。
那么为什么要设计这样一个激活函数呢?
我们举例来说,通常一个两层的简单的全连接神经网络(MLP)可以写成(省略偏置项):
y=\sigma_2(W_2\sigma_1(W_1x))
其中\sigma为激活函数,W为参数,x,y分别为输入和输出。
如果我们将激活函数去掉,那么这个两层的MLP就变成y=W_2W_1x,显而易见的,这个两层的神经网络就退化为一个单层的线性网络。 如果没有激活函数的非线性来赋予神经网络表达能力,那么无论多少层的网络结构都可以用一个单层网络来代替。
除了引入非线性外,在神经网络的输出层,激活函数还担任将前一层的输出映射到最终预测结果的任务。例如,对于一个二分类问题,通常最终输出层的激活函数就是sigmoid函数,而多分类任务则往往对应softmax函数。
总结一下,激活函数的意义如下:
- 模拟生物神经元特性,接受输入后通过一个阈值模拟神经元的激活和兴奋并产生输出
- 为神经网络引入非线性,增强神经网络的表达能力
- 导出神经网络最后的结果(在输出层时)
各类激活函数
阶跃函数
前面提到,激活函数最初是为了模仿生物神经元的激活特性,那么很自然想到,我们就用一个简单的阈值来判断是否激活好了,比如大于0的话就是激活该神经元,否则即为未激活,即如下的阶跃函数:
f(x)=\left\{\begin{aligned}1\quad (x\ge0)\\ 0\quad (x\le0) \end{aligned}\right.
但是这简单方法的缺点也是非常明显的。 首先它是不连续且不光滑的,这就导致在反向传播时这一层很难学习。 其次阶跃函数“非黑即白”的特性虽然可能最符合生物神经网络,但是实际中有时我们需要表达“20%被激活”这种概念,即我们需要一个模拟的激活值而非简单的“01”二值.
Sigmoid 函数
既然阶跃函数有许多不足,特别是不连续。那么我们找一个相近的但是既光滑又连续的函数来代替不就可以了。 由此许多人想到了sigmoid函数。
严格上来说sigmoid函数不是一个单独的函数,而是指满足“S型”曲线的函数族,但是我们通常就用其中最常用的logistic函数来代指sigmoid函数:
f(x)=\frac{1}{1+e^{-x}}
如图可以看出, sigmoid函数和阶跃函数非常相似,但是解决了光滑和连续的问题,同时它还成功引入了非线性。 由于其值域处在0~1,所以往往被用到二分类任务的输出层做概率预测。
那么这样一个函数是不是就完美了呢?
其实不然,简单观察就可以发现,当输入值大于3或者小于-3时,梯度就非常接近0了,在深层网络中,这非常容易造成“梯度消失”(也就是反向传播时误差难以传递到前面一层)而使得网络很难训练。此外,sigmoid函数的均值是0.5,但是不符合我们对神经网络内数值期望为0的设想。因而,人们提出了它的一个变种。