ReLU Sigmoid and Tanh(2)

来源:互联网 发布:java多态的实现原理 编辑:程序博客网 时间:2024/05/16 17:38

Sigmoid

它能够把输入的连续实值“压缩”到01之间。如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.

缺点:

当输入非常大或者非常小的时候,这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。所以,需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradientkill掉,这会导致网络变的很难学习。

Sigmoidoutput不是0均值.这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

产生的一个结果就是:如果数据进入神经元的时候是正的(e.g.x>0 elementwise in f=wTx+b),那么w计算出的梯度也会始终都是正的。

当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的kill gradients 问题相比还是要好很多的。

tanh

tanh(x)=2sigmoid(2x)1

sigmoid不同的是,tanh0均值的。因此,实际应用中,tanh会比 sigmoid更好(毕竟去粗取精了)

 

ReLU

近年来,ReLU变的越来越受欢迎。数学表达式如下:

f(x)=max(0,x)

输入信号<0时,输出都是0>0的情况下,输出等于输入。

ReLU的优点:

使用ReLU得到的SGD的收敛速度会比sigmoid/tanh快很多。有人说这是因为它是linear,而且non-saturating。相比于sigmoid/tanhReLU只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。

ReLU的缺点:当然 ReLU也有缺点,就是训练的时候很”脆弱”,很容易就”die”了.

举个例子:一个非常大的梯度流过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。

如果这个情况发生了,那么这个神经元的梯度就永远都会是0.

实际操作中,如果你的learningrate很大,那么很有可能你网络中的40%的神经元都”dead”了。

当然,如果你设置了一个合适的较小的learningrate,这个问题发生的情况其实也不会太频繁。

 

Leaky-ReLUP-ReLUR-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》指出,不仅可以训练,而且效果更好。

阅读全文
0 0