我们在了解感知机和多层感知机时,很容易得到一个没有激活函数的单层神经网络模型,其数学表示如下:
其中的大写字母代表矩阵或者张量。下面搭建一个二层的神经网络模型并在模型中加入激活函数。假设激活函数的激活条件是比较0和输入值中的最大值,如果小于0,测输出结果为0;如果大于0,则输出结果是输入值本身。同时,在神经网络模型中加入偏置,偏置可以让我们搭建的神经网络模型偏离原点。如图所示:
模型偏离原点的好处就是能够使模型具有更强的变换能力,在面对不同的数据时拥有更好的泛化能力。在增加偏置后,我们之前的单层神经网络模型的数学表示如下:
如果搭建二层神经网络,那么加入激活函数的二层神经网络的数学表示如下:
可以看出,上面的模型存在一个很大的问题,它仍然是一个线性模型,如果不引入激活函数,则无论我们加深多少层,结果都一样,线性模型在应对非线性问题时会存在很大的局限性。激活函数的引入给我们搭建的模型带来了非线性因素,非线性的模型能够处理更复杂的问题,所以通过选取不同的激活函数便可以得到复杂多变的深度神经网络,来解决更复杂的问题。
Sigmoid
它的数学表达式如下:
几何图形如下:
缺点:会导致模型的梯度消失,在优化的过程中收敛速度变慢。所以要尽量使用零中心数据,且尽量保证计算得到的输出结果是零中心数据。
tanh
数学表达式如下:
几何图形如下:
在深度神经网络模型的后向传播过程中仍有可能出现梯度消失的情况。
Relu
目前在深度神经网络模型中使用率最高的激活函数,数学表达式如下:
几何图形如下:
优点:收敛速度非常快。但是它的输出并不是零中心数据,可能会导致某些神经元永远不会被激活,并且这些相对应的神经元的参数不能被更新。解决方法是:对模型参数使用更高级的初始化方法如Xavier,以及设置合理的后向传播学习速率,推荐使用Adam。它现在也已经出现很多的改进版本如Leaky-Relu、R-Relu等。