本文主要是介绍ReLU Sigmoid and Tanh(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Sigmoid
它能够把输入的连续实值“压缩”到0和1之间。如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
当输入非常大或者非常小的时候,这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。所以,需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradientkill掉,这会导致网络变的很难学习。
Sigmoid的output不是0均值.这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
产生的一个结果就是:如果数据进入神经元的时候是正的(e.g.x>0 elementwise in f=wTx+b),那么w计算出的梯度也会始终都是正的。
当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的kill gradients 问题相比还是要好很多的。
tanh
tanh(x)=2sigmoid(2x)−1
与sigmoid不同的是,tanh是0均值的。因此,实际应用中,tanh会比 sigmoid更好(毕竟去粗取精了)。
ReLU
近年来,ReLU变的越来越受欢迎。数学表达式如下:
f(x)=max(0,x)
输入信号<0时,输出都是0,>0的情况下,输出等于输入。
ReLU的优点:
使用ReLU得到的SGD的收敛速度会比sigmoid/tanh快很多。有人说这是因为它是linear,而且non-saturating。相比于sigmoid/tanh,ReLU只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
ReLU的缺点:当然 ReLU也有缺点,就是训练的时候很”脆弱”,很容易就”die”了.
举个例子:一个非常大的梯度流过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。
如果这个情况发生了,那么这个神经元的梯度就永远都会是0.
实际操作中,如果你的learningrate很大,那么很有可能你网络中的40%的神经元都”dead”了。
当然,如果你设置了一个合适的较小的learningrate,这个问题发生的情况其实也不会太频繁。
Leaky-ReLU、P-ReLU、R-ReLU
Leaky ReLUs:就是用来解决这个“dyingReLU”的问题的。与 ReLU不同的是:
f(x)=αx,(x<0)
f(x)=x,(x>=0)
这里的α是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。
关于LeakyReLU的效果,众说纷纭,没有清晰的定论。有些人做了实验发现Leaky ReLU表现的很好;有些实验则证明并不是这样。
ParametricReLU:对于 Leaky ReLU中的α,通常都是通过先验知识人工赋值的。
然而可以观察到,损失函数对α的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢?KaimingHe的论文《DelvingDeep into Rectifiers: Surpassing Human-Level Performance on ImageNetClassification》指出,不仅可以训练,而且效果更好。
这篇关于ReLU Sigmoid and Tanh(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!