参考:
还有反向的求导过程
每个神经网络单元的工作包括两部分:计算 z,然后根据激活函数(sigmoid)计算 σ(z)
列向看,对应于不同的特征,就是神经网络中的该层的各个节点
行向看,对应于不同的训练样本
tanh
激活函数是 sigmoid
的平移伸缩结果,其效果在所有场合都优于sigmoid
,tanh
几乎适合所有场合sigmoid
激活函数tanh
、 sigmoid
两者的缺点:
变得特别小
,最后就会接近于0,导致降低梯度下降的速度。激活函数的选择经验:
sigmoid
函数,其它所有单元都选择Relu
函数Relu
激活函数。有时,也会使用tanh
激活函数,但Relu
的一个缺点是:当是负值的时候,导数等于0Relu
被称为Leaky Relu
,当是负值时,这个函数的值不等于0,而是轻微的倾斜,这个函数通常比Relu
激活函数效果要好,尽管在实际中Leaky ReLu
使用的并不多ReLu
、Leaky ReLu
的优点:
sigmoid
函数需要进行浮点四则运算,在实践中,使用ReLu
激活函数学习的更快sigmoid
和tanh
函数的导数在正负饱和区的梯度接近于0
,这会造成梯度弥散,而Relu
和Leaky ReLu
函数大于0部分都为常数,不会产生梯度弥散现象。(Relu
进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu
不会有这问题)ReLu
的梯度一半都是0,但是,有足够的隐藏层使得 z z z 值大于0,所以对大多数的训练数据来说学习过程仍然可以很快线性隐藏层一点用也没有,因为线性函数的组合本身就是线性函数,所以除非你引入非线性,否则你无法计算出更有趣的函数,即使网络层数再多也不行
ReLU
、tanh
、leaky ReLU
或者其他的非线性激活函数线性
激活函数非常少见sigmoid
tanh
ReLu
Rectified Linear Unit z=0 时,可以让导数为 0,或者 1
Leaky ReLU
Leaky linear unit z=0 时,可以让导数为 0.01,或者 1
对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用。
常数为什么是0.01,而不是100或者1000,sigmoid/tanh
激活函数在很平坦的地方,学习非常慢
当你训练一个非常非常深的神经网络,你可能要试试0.01以外的常数