在青蛙神经反射中,科学家们发现给予神经两个神经信号,输出的并不是两者的加和,而是仿佛有一个阈值,在总信号强度达到某一定值时,才会有输出信号。
由此科学家根据这一现象做出了一个模拟的神经网络
输入的x1、x2、x3信号经过节点的汇总加和后,传入下一个激活函数的节点。在该节点上,若总信号强度高于阈值,则会有输出信号,若不够则无输出。
在该激活函数(梯度函数)下,输出只有0和1,即有输出和无输出。
这种激活函数也可叫为单层感知器。
但这样的梯度函数也有问题,即无法求导,没有梯度。为解决此问题,科学家们又研发了多种激活函数:
(1)sigmoid / logistic函数
函数表达式为
其函数图像如下图所示:
曲线与y轴交点为0.5,曲线两端慢慢的接近于0和1。
这种激活函数十分适用于生物学中,当接收到的信号很小时,趋近于不响应的状态。而即使接受的信号很大,响应也不会很大。因此该激活函数会将-∞到+∞压缩到一个很小(0~1)的范围。
另外更重要的是对比于阶梯激活函数,这种sigmoid函数可导,其导数推导过程为:
由最终结果可见,在sigmoid函数的求导结果只与σ有关。另外其输出的结果在0至1之间,这正好对应于probility的结果特性(输出结果也是0至1),因此sigmoid激活函数应用很广。
但要注意的是sigmoid函数存在一个致命的问题,即当横坐标取值趋近于正无穷或负无穷时,导数接近于0,而求导时学习率与导数值得乘积时一直等于0,使得要更新的参数一直得不到更新,造成了梯度离散现象。
下面以代码进行讲解
import torch
a = torch.linspace(-100, 100, 10)
# 从-100至100的区间内,等间距的取10个数
print(a)
# 输出a
输出
tensor([-100.0000, -77.7778, -55.5556, -33.3333, -11.1111, 11.1111,
33.3333, 55.5555, 77.7778, 100.0000])
转化为sigmoid输出
print(torch.sigmoid(a))
输出为
tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])
由输出结果可见,当值为-100和100时输出趋近于0和1。因此sigmoid函数非常容易取到边缘值。
本文分享自 python pytorch AI机器学习实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!