每个神经元的正向传播步骤计算输入的加权和加上偏差:
![60fc1cead84dbcd8b5c764648aa6144e.gif](https://i-blog.csdnimg.cn/blog_migrate/40588e6b3fb983bc7f9c68cff39137ce.gif)
然后应用激活函数A在每个神经元处生成输出:
![0eac09c2ff487b5206ef665aac615fef.gif](https://i-blog.csdnimg.cn/blog_migrate/bac103c7ab271b52dd4ce56f0ac21b6f.gif)
激活函数执行Y 的非线性变换,该范围将基于某个阈值确定神经元是否将触发。将许多这些神经元堆叠在一起,最终得到一个神经网络。
非线性变换是激活函数的重要特性。如果你的激活函数是线性的,那么无论你的神经网络中有多少层,最终结果仍然是线性函数。
有许多激活函数各有其优缺点。以下是当今最常用激活函数。
sigmoid
sigmoid激活函数定义如下:
![24afdd97527ad6099b39f241db66a2d2.png](https://i-blog.csdnimg.cn/blog_migrate/5705aae104cc3a6699c6c1c2fb58246c.jpeg)
最初常用于隐藏层和outer层,现在主要用于outer层。它介于0和1之间,是二元分类问题的理想选择。
由于速度的原因,隐层中sigmoid函数的使用减少了。这个函数遇到了所谓的梯度消失问题。看看下面的图。在负的和正的极端情况下导数都接近于0。这给深度神经网络带来了一个问题,因为模型停止学习或以非常小的速度学习,从而成倍地增加了训练时间。
在使用sigmoid激活函数时,反向传播也没有得到优化。在预处理步骤中,通常将值归一化为均值0,以提高梯度法的效率。以0.5为中心的sigmoid函数在这方面没有帮助。
由于上述原因,sigmoid函数现在主要用于outer层中以进行二元分类任务。
![2069c405e3a870297dc5e16b2fde8787.png](https://i-blog.csdnimg.cn/blog_migrate/49c43c7a1782068094333f51ae78f790.jpeg)
sigmoid函数的向量化python实现如下:
![c26fe487f90c20567d535cacb254bd85.png](https://i-blog.csdnimg.cn/blog_migrate/9c876b2312edb5a71ef2238f0914f664.jpeg)
SOFTMAX
当处理多类分类问题时,该函数通常用于神经网络的输出层。
与sigmoid函数类似,Softmax将其输入转换为0到1之间的范围。它用所有类的指数和除以每一项的e来归一化输出。结果是一个分类概率分布。
最有可能为True的类是概率最大的类。很容易看出为什么,这是在输出层选择多类分类的函数,将网络的输出转化为分类概率分布。
Softmax的公式如下:
![500b1f0bb363bfb6943b0d93fdbf5a80.gif](https://i-blog.csdnimg.cn/blog_migrate/27b7e5b71987022a48da71c05bf6f3fc.gif)
其中z是向量,K是向量维度,j是向量的第i个元素。
![9da763c47655f4dd505e57dc3de12b67.png](https://i-blog.csdnimg.cn/blog_migrate/4a87a1881730110a223dc4a3a28c6062.jpeg)
要在python中实现softmax函数,您将执行以下向量化实现:
![ecefcccc353186bdef6ebb04c0b32f52.png](https://i-blog.csdnimg.cn/blog_migrate/98efbce54176752aecd854a3bda4c1d0.jpeg)
如果我们将上面图像的向量传递给此函数,您将得到相同的结果:
z=[0.5,2.3,0.8]softmax(z)
array([ 0.11905462, 0.72023846, 0.16070692])
RELU
RELU通常用于神经网络的隐藏层。
它们是机器学习从业者能够训练更深层神经网络的原因之一。RELU没有表现出前面描述的梯度消失问题,允许在更快的时间内训练大型神经网络。
Relu的公式如下:
![657424cf8e6c674dedffc3759ed5ac68.png](https://i-blog.csdnimg.cn/blog_migrate/b3f4d2d8dbeb313c3c13934ea329d4a7.jpeg)
RELU的导数总是1或0,不包括0处的导数,0处的导数没有定义,但通常被1代替,这意味着在外部范围内的导数不会变得非常小,就像sigmoid函数或其他激活函数(如tanh)的情况一样。
![008fcc52bf6318ea5838cec1a4c87b40.png](https://i-blog.csdnimg.cn/blog_migrate/2670c756f3a947fd00fe295d2ecd78e3.jpeg)
并不是所有关于RELU的事情都是完美的,他们可以表现出一个不同的问题,称为Dying Relu问题,特别是当学习率太高的时候。简而言之,较大的梯度会导致权重更新,从而导致RELU在任何其他数据点不再激活。因此,表现出这种反应的神经元永远不会再fires,因此被认为是死的。
即使存在Dying Relu问题的可能性,但经验法则是在隐藏层中使用RELU,除非你有充分的理由不这样做。
要在python中实现RELU,请使用以下代码:
![bd6e0756d8de58f36243fc5d96816850.png](https://i-blog.csdnimg.cn/blog_migrate/0f2d408799bdbf9f5f652999b8c64c8c.jpeg)
结论
我们现在已经了解了神经网络中最常用的3种激活函数,您可以在实现算法时使用以下经验法则,特别是如果您刚刚开始并且不知道从哪里开始。
- 对于二元分类,请在outer层使用sigmoid函数。
- 对于多标签分类,请在outer层使用sigmoid函数。
- 对于多类分类,请在outer层使用softmax函数。