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