为什么使用ReLU而不是sigmoid
2017-10-12 13:25
169 查看
sigmoid计算复杂,需要计算指数
梯度弥散:
对于每层只有一个神经元的网络,考虑每一层的偏导数,我们发现
∂C∂b1=σ′(z1),w2σ′(z2),w3σ′(z3),w4σ′(z4),∂C∂a4.(122)
中间有多个wiσ′(zi)连乘,而观察sigmoid的导数可以发现,它的最大值为1/4,对于w,我们通常使用高斯分布初始化,所以它的值通常小于1,所以|wjσ′(zj)|<1/4,
真正的问题是每个层的学习速率不同
而如果使用ReLU的话它在大于零的情况下导数值为1,所以可以在一定的程度上避免这个问题。
ReLU的训练和sigmoid相同,只不过是要分段求导而已。
梯度弥散:
对于每层只有一个神经元的网络,考虑每一层的偏导数,我们发现
∂C∂b1=σ′(z1),w2σ′(z2),w3σ′(z3),w4σ′(z4),∂C∂a4.(122)
中间有多个wiσ′(zi)连乘,而观察sigmoid的导数可以发现,它的最大值为1/4,对于w,我们通常使用高斯分布初始化,所以它的值通常小于1,所以|wjσ′(zj)|<1/4,
真正的问题是每个层的学习速率不同
而如果使用ReLU的话它在大于零的情况下导数值为1,所以可以在一定的程度上避免这个问题。
ReLU的训练和sigmoid相同,只不过是要分段求导而已。
相关文章推荐
- 神经网络为什么要使用激活函数,为什么relu要比sigmoid要好
- Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传递 Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Python中为什么推荐使用isinstance来进行类型判断?而不是type
- 为什么要使用SLF4J而不是Log4J
- 为什么要使用SLF4J而不是Log4J
- 为什么我们使用 Nginx 而不是 Apache
- 为什么你应该使用OpenGL而不是DirectX?
- 为什么delegate属性使用delegate而不是retain?
- WPF:为什么使用ContentPresenter.ContentSource而不是Content属性?
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- ReLU为什么比Sigmoid效果好
- 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject
- 为什么要优先使用组合而不是继承 .
- JDBC为什么要使用PreparedStatement而不是Statement
- 为什么delegate属性使用assigne而不是retain?
- 为什么你应该使用OpenGL而不是DirectX?
- 为什么我们要尽可能使用Iterator接口中的remove方法而不是用Collection接口中的remove方法
- 为什么我们使用Nginx而不是Apache
- 为什么要使用SLF4J而不是Log4J