上一篇文章中我们说神经网络的基本结构,神经网络训练的基本原理,这篇文章我们先来说一说神经网络中一个特别重要的东西---激活函数。
还是引用上一篇文章的老图。
如果按照上图的结构来输出最终的结果,那么计算过程如下:
hj=i=1nxicijy=j=1mwjhj
现在开始解释这个式子:
第一个式子是计算每个神经元的值:第j个神经元的值等于每个输入的x值乘相对应的权重c后再相加。
第二个式子是计算神经网络最终输出的值:将各个神经元的值乘以相对于的权重w后相加。
将两个式子合并后就得到了上述图片过程的计算式:
y=j=1mwjhj=j=1mwji=1nxicij
如果用矩阵形式表示如下:
y=x1x2…xnc11c12c21⋱…c1m…c2m⋮⋮cn1cn2⋱⋮…cnmw1w2⋮wm
可以明显看出来,如果使用矩阵的话,神经网络的运算将会便捷很多。在电脑中gpu(显卡)的矩阵运算速度比cpu更快,这也是为什么神经网络训练时会多使用gpu训练而非cpu。
但是问题就来了,如果使用上述式子计算神经网络,那么神经网络的输出将会是线性的。那么什么是线性?
请大家思考一下,假设给定两个式子:
如果将他们合成一个式子,会得到下述式子:
可以看出,无论有多少个式子,他们最终都会被整理成一个线性式子。神经网络的矩阵运算也是如此,如果仅仅只是线性的相乘相加运算,那么无论有多少层神经元,总能被一层神经元所表示。这样的神经网络复杂度往往不能满足实际的要求。
为了解决这个问题,我们必须往神经网络中引入非线性的因素,简单来说,我们必须把线性的神经网络“掰弯”。前人把将线性运算非线性化的函数称之为“激活函数”,在神经网络中,运算往往是一层层进行的,我们把进行非线性化运算的计算层称之为“激活函数”。
下面简单介绍一种简单的激活函数,以便读者理解激活函数的用法。
Sigmoid函数是一种常被使用的激活函数,他的函数式子如下所示:
在神经网络中,如果输出值经过激活层,那么将会被代入上述函数σ(x)中,进行非线性化处理。
如图所示为sigmoid函数的图像,输出为0到1,所以sigmoid函数也常常被用于二分类问题的激活函数。
那么问题又来了,上篇文章的时候我们说了神经网络的训练方法是梯度下降,那么如果引入了激活函数,那么该如何训练神经网络?答案是照样求偏导数,照样代入公式更新参数。但是有时候训练过程中,由于引入了非线性的因素,计算梯度时有可能会出现以下情况:
- 梯度消失与梯度爆炸:当神经网络层过于多时,由于神经网络的方向传播过程是求偏导相乘。这个过程可能会使梯度过小导致梯度消失,这个时候神经网络无法正常训练下去;也有可能会使梯度过大,导致梯度爆炸,这个时候神经网络的参数更新将会变得异常导致无法正常训练神经网络。
- 神经元死亡:这是由于训练过程中,某个神经元的权重过小接近于零,这个时候此神经元对于神经网络将会没有贡献,导致神经网络性能不佳。
读者们可以尝试变化学习率、替换激活函数、改变初始化权重来解决此类问题。
标签:函数,梯度,神经网络,初学者,激活,式子,神经元 From: https://blog.csdn.net/flyless_sparrow/article/details/144398237