1959年,生物科学家研究青蛙神经元的时候发现,青蛙的神经元有多个输入,神经元中间有一个多输入加权后的相应,当该响应小于阈值时没有输出,当该响应大于阈值是会有一个固定的输出。当时的计算机科学家借鉴于此发明了一个计算机模型,如下图:
假设z为输入经过加权后的值,z小于阈值输出0,z大于阈值输出1。(阶梯函数)
为了解决阶梯函数在阶梯处不可导的缺点,计算机学家们引入了sigmoid函数
(1)sigmoid定义
从图中可以看出sigmoid函数处处可导,在x趋于负无穷时,y趋于0,导数趋于0:在x趋于正无穷时,y趋于1,导数趋于0。
(2)sigmoid求导
由于sigmoid函数输出范围在0-1,这非常符合概率和像素点取值的范围,所以用途较广,但sigmoid函数有一个致命的缺陷,当x较大时,sigmoid导数趋于0,使得梯度下降时参数更新的非常缓慢,这就是所谓的梯度离散。
(3)sigmoid在pytorch中的实现
(1)tanh定义
tanh函数相当于sigmoid函数横坐标压缩到之前一半,纵坐标扩展到两倍,再向下平移一个单元,因此范围是[-1,1],在RNN模型中用的非常多。
(2)tanh求导
(3)tanh在pytorch中的实现
(1)ReLU定义
(2)ReLU求导
一方面ReLU**函数求导非常方便,导数恒为1,另一方面很少产生梯度离散或者梯度爆炸,因此现如今ReLU**函数是深度学习中运用最为广泛的**函数。
(3)ReLU在pytorch中的实现