关于激活函数
激活函数,英文:Activation Function
大部分工具,都要考虑他使用的场景。百度词条上会将激活函数,和他所服务的神经网络联系在一起。他们注重全面、无错误,却没有解释到本质;不够熟悉神经网络这个体系架构、以及各种专业词的人,看这个解释基本都是云里雾里,这代表根本不理解。
什么叫激活?就是说,原来是死的,使用这个函数后活了。
不同的激活函数,体现的是:
1、有的继续死,有的活过来了;(有条件/阈值)
2、活过来的的血量不同,有人 80%,有人 40%。(有权重 )
下面介绍常用的不同的激活函数
阶跃函数
是有限段分段常数函数的组合
意思就是:
1、大于0 就为1,小于0就为0;
2、你可以想象成,达成某个标准就OK,没达成就不行。
比如 60分就及格,60分一下就不及格,简单粗暴。
sigmoid 函数
公式
$ g(z) = \frac{1}{1+e^{-z}} $
- g : R → [ 0 , 1 ] g:\mathbb{R} \to [0,1] g:R→[0,1]
- g ( 0 ) = 0.5 g(0)=0.5 g(0)=0.5
- g ( − ∞ ) = 0 g(- \infty)=0 g(−∞)=0
- g ( + ∞ ) = 1 g(+ \infty)=1 g(+∞)=1
- 0-1的优势,可以表示为概率。可用于数据的归一化。
- 缺点:梯度消失 和 偏置现象。
梯度消失
导数 f’(x)=f(x)(1-f(x)), 当x趋于无穷时,f(x)的两侧 导数逐渐趋于0。
在后向传递时,sigmoid向下传递的梯度包含了一个 f’(x)因子,因此,一旦落入两端的平滑区,f’(x) 就变得接近于0,导致了向后传递的梯度也非常小。
此时,网络参数很难得到有效训练,这种现象被称为梯度消失,一般在5层以内就会产生梯度消失的现 象。
sigmoid函数的输出均大于0,使得输出不是0 均值,称为偏置现象。
代码实现
def sigmoid(z):
return 1 / (1 + np.exp(-z))
nums = np.arange(-10, 10, step=1) #creates a vector containing 20 equally spaced values from -10 to 10
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(nums, sigmoid(nums), 'r')
RELU 函数
RELU:Rectified Linear Units,线性整流单元,或 修正线性单元。
公式
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x)
1、小于0,就全视为0;大于0,会去看你是多少;
2、可以通俗理解:有些地区女生相亲要看男方的房子,没房子就直接无视,不论其他方面有多优秀;有房子,再来看你的其他表现。
- 计算简单,能节省训练时间
- 当x>0时,梯度不变,解决了 sigmoid及tanh常见的梯度消失问题。
- 常用于多层感知机以及 CNN。
- 在RNN中不常见, 因为在多次循环神经元的操作之后,可能具有非常大的输出,与有界值的情况相比,更 容易发生
输出值爆炸
的情况。
tanh 函数
- 输入映射到-1和1之间,以0为中心对称。
- 梯度比sigmoid形梯度强(导数更陡 峭),因此收敛更快。
- 也存在着与sigmoid函数类似的
对两端值不敏感
,梯度消失
的问题。