这周本来想写一篇个人笔记,关于神经网络中反向传播算法识别手写字符的实现。但是,在整理自己的思路的时候,发现本人把之前看的许多神经网络的东西都给忘了,内心很是着急啊!在看到激活函数的时候,突然不知道激活函数是干嘛用的!立马翻遍手里的纸质资料,都说的模糊不清。无奈,赶紧来网上看看!下面,我就把在网上看到的知识点,总结一下,形成读书笔记,方便大家学习!由于本人知识有限,文章有少部分参考网上,如有侵权,请告知!我会及时修改、删除!
一、 激活函数出现的原因
思考这么一个问题:
现在有一个二分类问题,我们要将下面的三角形和圆点进行正确的分类,如图1所示。我们试着用神经网络解决这个问题。跟大家说明一下,这是一个线性不可分的问题,就是你在这个平面里,找不到一条直线可以把图中的三角形和圆点完全分开。如果你能找到,算你厉害!
图1:二分类问题
解决思路:
(1)用不带激活函数的单层感知机来解决。
(1)用不带激活函数的单层感知机来解决。
首先我们想到利用最简单的单层感知机来解决,单层感知机可以画出一条直线,把平面分开,如图2所示。
图2:单层感知机分割平面
PS:如果你觉得这篇文章看起来稍微还有些吃力,或者想要系统地学习人工智能,那么推荐你去看床长人工智能教程。非常棒的大神之作,教程不仅通俗易懂,而且很风趣幽默。点击这里可以查看教程。
我来简单的解释一下图2。在图2中,左图是一个单层的感知机结构,其中W1、W2是网络上权重,b是偏置量。左图是一个没有激活函数单层感知机,它的工作原理是:输入特征X1和特征X2,如果y>0,证明是正类;如果y<0,证明是负类。我们这里不讨论y=0的特殊情况。根据单层感知机的工作原理,我们画出右边的坐标图。
总结:不带激活函数的单层感知机是一个线性分类器,不能解决线性不可分的问题。
(2)用不带激活函数的多个感知机来解决。
(2)用不带激活函数的多个感知机来解决。
不带激活函数的单层感知机解决不了问题,那我们就会想到用多个感知机进行组合,获得更强的分类能力,看看能不能解决我们的线性不可分问题。如图3所示。
图3 多个感知器
图3中,我们已经得到了多感知器分类器了,那么它的分类能力能否解决我们的线性不可分的问题呢?我们来分析一下,来对y进行一个合并同类项,整理后的公式如下:
y=X1(W1-11W2-1+W1-12W2-2+W1-13W2-3)+X2(W1-21W2-1+W1-22W2-2+W1-23W2-3)+W2-1b1-1+W2-2b1-2+W2-3b1-3
大家看一下,合并后的式子,还是一个关于X1和X2的线性表达式,合并后的多个感知器本质上还是一个线性分类器,还是解决不了非线性的问题。
不管是单层感知机还是多个感知器,只要不带激活函数,都只能解决线性可分的问题。解决不了我们的线性不可分问题。不信,那我们就在平面中画几条直线试试,结果发现这几条直线无论在平面中如何旋转,都不能完全正确的分开三角形和圆点。结果如图4所示。
图4:线性分类器解决不了问题
在上面的线性方程的组合过程中,我们其实类似的在做三条直线的线性组合,如图5所示。图5描述了,当我们直接用没有激活函数的分类器时,其实我们还是线性组合,最多也就是更复杂的线性组合罢了。有人在这里又要抖机灵了!我数学学的好,我记得学高等数学的时候,在不定积分那一块,有个画曲为直思想来近似求解。那么,我们可以来借鉴一下,用无数条直线去近似接近一条曲线,你很聪明啊!但是比着用非线性的激活函数来说,你这解决办法还是太低端了一些。
图5:没有激活函数的分类器
思考一个问题:抛开神经网络中神经元需不需要激活函数这点不说,如果没有激活函数,仅仅是线性函数的组合解决的问题太有限了,碰到非线性问题就束手无策了.那么加入激活函数是否能够解决呢?
二、激活函数作用
我们再设计一个神经网络,在所有的隐层和输出层加一个激活函数,这里激活函数我们就用Sigmoid函数,如图6所示。这样y输出的就是一个非线性函数了,y的输出更复杂,有了这样的非线性激活函数以后,神经网络的表达能力更加强大了。能不能解决我们一开始提出的线性不可分问题呢?我们接着来验证吧!
图6:带有非线性激活函数的感知机
我们把图6中的带有激活函数的单层感知机扩展到带有激活函数的多个神经元的情况。那么神经网络的表达能力更强,具体如图7所示。
图7:带有激活函数的多个神经元组成的神经网络
图8:带激活函数的非线性组合
和图7相对应的非线性组合是图8所示的样子。这样看起来,似乎已经能解决我们线性不可分的问题了。最后,我们通过最优化损失函数的做法,通过不断的学习,能够学到正确分类三角形和圆点的曲线。具体学到什么曲线,我们不知道,或许是图9所示的曲线,也可能是其他曲线。
图9:学习到的分类曲线
总结:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。
三、激活函数的实践
我们都知道异或问题是线性不可分的问题,那么我们可以用今天学的激活函数解决这个问题。