形象的解释神经网络激活函数的作用是什么?
这篇文章首先回答了一个人们都忽略的问题:在神经网络中,一个小小的激活函数为何如此重要?它的作用到底是什么?然后我就目前主流的激活函数做了一个对比讨论,并提出一些建议。
这里首先引出结论: 激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。 这里举一个例子来说明:假如我的任务是:将下面的这幅图中的三角形和圆形分开,也就是一个典型的二分类问题。
就是上图右边的直线,无论如何更改参数,它都不能很好的完成这个二分类问题,因为问题本身就是 线性不可分 的。
那么如何才能完美解决这个问题呢?我们试一试多感知器的表现
如果仔细观察,你就会发现,多感知器形成的方程其实也是一条直线(不信你把上面的那个式子因式分解一下),上面已经说了,该问题是线性不可分的,所以多感知器也不能解决这个问题。接下来,就让我们看看激活函数能不能解决。在每一层叠加完后,我们为输出与输入之间加上一个激活函数,此时的方程就变成了这样:
这样也许就能将这个线性不可分的问题解决了。最后也许就是这个样子:
从上面的分析来看,我们可以看出激活函数是神经网络在拟合函数方面超过传统机器学习方法的一个关键因素。对比传统机器学习方法中, 即使是最复杂的SVM, 在拟合方面非线性曲线差神经网络n条街。
常见的激活函数
除了以上介绍的几个激活函数外, 还有一些比较小众的激活函数,如 Leaky ReLU、PReLU 或者 Maxout。
如何选择激活函数是一门大学问, 我的研究还不够深,做的实验还不够多, 因此很难有所定论, 这里先引用几篇博客里面和吴恩达视频中的结论。
1.除非在二分类问题中,否则请小心使用sigmoid函数。
2.可以试试 tanh,不过大多数情况下它的效果会比不上 ReLU 和 Maxout。
3.如果你不知道应该使用哪个激活函数, 那么请优先选择Relu。
4.如果你使用了Relu, 需要注意一下Dead Relu问题, 此时你需要仔细选择 Learning rate, 避免出现大的梯度从而导致过多的神经元 “Dead” 。
5.如果发生了Dead Relu问题, 可以尝试一下leaky ReLU,ELU等Relu变体, 说不定会有惊喜。