神经网络的激活函数
双曲正切函数tanh(x)
- 之前我们使用的神经网络,一直选择sigmoid函数作为激活函数,但实际上,激活函数可以是任何函数。
使用双曲正切函数,它的表现比sigmoid函数更好。
tanh(x)函数公式:
函数曲线:介于(-1,1),类似于sigmoid函数的平移版本。
使用tanh(x)的好处:
①函数图像过原点。(sigmoid函数的图像不过原点)
②收敛速度快于sigmoid函数。 - 由于双曲正切函数介于(-1,1)之间,使用它作为激活函数好于sigmoid函数。因为使用它,激活函数的平均值更接近于0,让下一层的学习更方便。
- 将双曲正切函数用于任何情况作为激活函数都是好的,除了将它用于输出层,因为如果y的真实值是二元分类的0或1,那么让y_hat介于0到1之间更为合理,此时使用sigmoid函数更合理。
- sigmoid函数和tanh函数都有一个缺点,当Z很大或很小的时候,会使α十分接近1或-1,此时两个函数的斜率接近于0(以Logistic回归为例,改变参数W和b,Z的变化缓慢,导致y_hat - y的变化缓慢,降低梯度下降算法的速度),会降低梯度下降算法的速度。
ReLU函数-修正线性单元
- ReLU函数公式:
- ReLU函数图像:
激活函数的选择
- 如果我们正在进行二元分类,理想的输出介于(0,1),那么使用sigmoid函数作为输出层的激活函数更理想。(除了用在二元分类问题中,其他情况下一定不要用)
- tanh在任何场合下都比sigmoid函数更优越。
- 而对于其他情况,使用ReLU函数已经变成激活函数的默认选择。如果不确定使用什么函数作为激活函数,那么就可以选择ReLU函数。
- ReLU函数的一个缺点是,当Z<0时,ReLU函数的导数为0。在实践中,使用它仍然是没问题的。但ReLU函数还有另一个版本,叫带泄露的ReLU函数(Leaky ReLU)。
👆当Z小于零时,Leaky ReLU函数的斜率不为0。其函数表达式为:α = max(0,01z,z)
。
为什么神经网络需要非线性的激活函数?
如果仅仅使用线性激活函数,那么最后得到的输出,也会是输入的线性组合,在神经网络中一直在做的只是计算线性激活函数,这种情况下,不如将所有的隐藏层都去掉。
- 基本上,在机器学习问题中,只有一种情况下会使用到线性激活函数,即在线性回归问题当中。比如说,预测房价,输出不是介于0到1,而是一个实数。
- 神经网络中间的隐藏层不可以使用线性激活函数,它可以用ReLU、tanh、Leaky ReLU等进行激活。所以在正常的神经网络中,唯一可能用到线性激活函数的地方,通常就是输出层。 除了这种情况,使用线性激活函数非常罕见。
激活函数的导数
当对神经网络进行反向传播计算时,需要真实地计算激活函数的斜率或导数。
- 以sigmoid函数为例:
sigmoid函数的表达式:
sigmoid函数关于z的到导数:dg(z)/dz = g(z)×(1-g(z))
,于神经网络中还可以写作g'(z) = a × (1-a)
如上,当sigmoid函数的参数z很大的时候,导数会很接近于0,相反如果z很小的时候,导数也会很接近于0,当z = 0时,导数为 1/4 。 - 以tanh函数为例:
函数的导数g'(z) = dg(z)/dz = 1 - (tanh(z))^2
。当z很大时,导数接近于0;当z很小时,导数也很接近于0。当z = 0时,导数为1。 - 以ReLU和Leaky ReLU函数为例:
ReLU函数:g(z) = max(0,z)
。
导数:g'(z) = 0,z < 0 ; g'(z) = 1,z>0。
而z = 0处,ReLU函数不可导,可以令此处的导数为0。
Leaky ReLU函数:g(z) = max(0.01z,z)
。
神经网络的梯度下降法
- 区分正向传播和反向传播:
神经网络中的正向传播就是自输入矩阵X计算出输出A【2】,具体计算如下图:
👆如果是一个二元分类问题,那么可以将g设置为σ函数。
未完待续。
转载:https://blog.csdn.net/fatfairyyy/article/details/115756112
查看评论