在sigmod函数中我们可以看到,其输出是在(0,1)这个开区间内,这点很有意思,可以联想到概率,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。
tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。
ReLU(Rectified Linear Unit)函数是目前比较火的一个激活函数,相比于sigmod函数和tanh函数,它有以下几个优点:
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。
PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。
import torchfrom torch.autograd import Variableimport matplotlib.pyplot as pltimport torch.nn.functional as Fx= torch.linspace(-5,5,200)x= Variable(x)x_np=x.data.numpy()y_relu = torch.relu(x).data.numpy()y_sigmoid =torch.sigmoid(x).data.numpy()y_tanh = torch.tanh(x).data.numpy()y_softplus = F.softplus(x).data.numpy()plt.figure(1,figsize=(8,6))plt.subplot(221)plt.plot(x_np,y_relu,c='red',label='relu')plt.ylim(-1,5)plt.legend(loc='best')plt.subplot(222)plt.plot(x_np,y_sigmoid,c='red',label='sigmoid')plt.ylim(-0.2,1.2)plt.legend(loc='best')plt.subplot(223)plt.plot(x_np,y_tanh,c='red',label='tanh')plt.ylim(-1.2,1.2)plt.legend(loc='best')plt.subplot(224)plt.plot(x_np,y_softplus,c='red',label='softplus')plt.ylim(-0.2,6)plt.legend(loc='best')plt.show()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:莫烦PyTorch学习笔记(三)——激励函数 - Python技术站