pytorch神经网络学习笔记(1)

四种激励函数

relu

又称修正线性单元,是一种分段线性函数,弥补了sigmoid函数以及tanh函数的梯度消失问题。relu函数的公式及图形,导数公式如下图
在这里插入图片描述
特点:
1、在输入为正数的时候(对于大多数输入 zz 空间来说),不存在梯度消失问题。
2、计算速度要快很多。relu函数只有线性关系,不管是前向传播还是反向传播,都比sigmoid和tanh要快很多。(sigmoid和tanh要计算指数,计算速度会比较慢)
3、当输入为负时,梯度为0,会产生梯度消失问题
relu目前仍是最常用的激活函数,在搭建人工神经网络的时候推荐优先尝试!

sigmoid

单极性,sigmoid 是常用的非线性的激活函数,该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (0,1)之间,它的数学形式和图像如下:
在这里插入图片描述
sigmod激励函数符合实际,当输入很小时,输出接近于0;当输入很大时,输出值接近1,但是sigmoid函数作为非线性激活函数,但是其并不被经常使用,它具有以下几个缺点:
1、当 zz 值非常大或者非常小时,通过右上图我们可以看到,sigmoid函数的导数 g′(z)g′(z) 将接近 0 。这会导致权重 WW 的梯度将接近 0 ,使得梯度更新十分缓慢,即梯度消失。
2、非零中心化,也就是当输入为0时,输出不为0,,因为每一层的输出都要作为下一层的输入,而未0中心化会直接影响梯度下降 。
3、计算量比较大。
sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不要使用在隐藏层。

tanh

双极性,该函数是将取值为 (−∞,+∞)(−∞,+∞) 的数映射到 (−1,1)(−1,1) 之间,其数学形式与图形为:
在这里插入图片描述
特点:
1、tanh函数在 0 附近很短一段区域内可看做线性的。由于tanh函数均值为 0 ,因此弥补了sigmoid函数均值为 0.5 的缺点。
2、当z为非常大或者非常小的时候,由导数推断公式可知,此时导数接近与0,会导致梯度很小,权重更新非常缓慢,即梯度消失问题。
3、幂运算问题仍然存在,计算量比较大。

softplus

和relu一样为近似生物神经激活函数,函数数学形式和图像如下:(log里面加1是为了避免非0出现)
在这里插入图片描述
特点:
1、softplus可以看作是ReLu的平滑。

构建网络时怎样选择激励函数

1、在少量层结构中, 我们可以尝试很多种不同的激励函数. 在卷积神经网络 的卷积层中, 推荐的激励函数是 relu. 在循环神经网络中, 推荐的是 tanh 或者是 relu 。
2、如果使用 relu,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky relu、Prelu 或者 Maxout.
3、relu->Lecky relu/Elu>tanh>sigmoid

python代码关于画图部分

import torch
import torch.nn.functional as F# 激励函数都在这
from torch.autograd import Variable
import matplotlib.pyplot as plt

 

# 做一些假数据来观看图像
x = torch.linspace(-5, 5, 200)  # x data (tensor), shape=(100, 1)
x = Variable(x)
x_np=x.data.numpy()
print(x_np)


y_relu=F.relu(x).data.numpy()
y_sigmoid=F.sigmoid(x).data.numpy()
y_tanh=F.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()

执行结果图:
在这里插入图片描述
参考文献:
1、https://www.cnblogs.com/carrollCN/p/11370960.html
2、https://morvanzhou.github.io/tutorials/machine-learning/torch/2-03-activation/

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值