31 lines
1.9 KiB
Python
31 lines
1.9 KiB
Python
"""
|
||
|
||
ReLU函数:
|
||
|
||
1、ReLU 函数在正输入时是线性的,收敛速度快,计算速度快,同时符合恒等性的特点。当输入为正时,由于导数是1,能够完整传递梯度,不存在梯度消失的问题(梯度饱和问题)。
|
||
|
||
2、计算速度快。ReLU 函数中只存在线性关系且无论是函数还是其导数都不包含复杂的数学运算,因此它的计算速度比 sigmoid 和 tanh 更快。
|
||
|
||
3、当输入大于0时,梯度为1,能够有效避免链式求导法则梯度相乘引起的梯度消失和梯度爆炸;计算成本低。
|
||
|
||
4、它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许基于梯度的学习(尽管在 x=0 的时候,导数是未定义的)。当输入为负值的时候,ReLU 的学习速度可能会变得很慢,甚至使神经元直接无效,因为此时输入小于零而梯度为零,从而其权重无法得到更新,在剩下的训练过程中会一直保持静默。
|
||
|
||
ReLU不足:
|
||
|
||
1、ReLU的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“Dead Neuron”。为了解决ReLU函数这个缺点,在ReLU函数的负半区间引入一个泄露(Leaky)值,所以称为Leaky ReLU函数。
|
||
|
||
2、与Sigmoid一样,其输出不是以0为中心的(ReLU的输出为0或正数)。
|
||
|
||
3、ReLU在小于0的时候梯度为零,导致了某些神经元永远被抑制,最终造成特征的学习不充分;这是典型的 Dead ReLU 问题,所以需要改进随机初始化,避免将过多的负数特征送入ReLU。
|
||
|
||
"""
|
||
import torch
|
||
import torch.nn as nn
|
||
|
||
# Relu函数
|
||
print('*' * 25 + "Relu函数" + "*" * 25)
|
||
m = nn.ReLU()
|
||
input = torch.randn(2)
|
||
print("原:", input)
|
||
print("结果:", m(input))
|
||
print('*' * 50) |