TensorFlow学习系列:
TensorFlow_1参数初始化方法
TensorFlow_2学习率
TensorFlow_3激活函数
TensorFlow_4正则化
TensorFlow_5dropout
TensorFlow_6断点续训与Tensorboard可视化
TensorFlow_7优化器
TensorFlow_8损失函数
一, 什么是激活函数
如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。
二、 为什么要用
- 如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
- 如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
三、常用激活函数
3.1 Sigmoid函数
sigmoid函数也叫 Logistic 函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。
3.1.1 公式
3.1.2 图
3.1.3 优缺点
优点:
- 可以把输入映射到(0, 1)区间,可以用来表示概率(eg:logistic regression)
- 在物理意义上最为接近生物神经元
缺点:
- 梯度消失问题
反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:
sigmoid 原函数及导数图形如下:
由图可知,导数从 0 开始很快就又趋近于 0 了,易造成“梯度消失”现象
- Sigmoid outputs are not zero-centered
3.1.4 TensorFlow中使用
tf.sigmoid(x, name = None) == tf.nn.sigmoid(x, name = None)
# y = 1 / (1 + exp(-x))
3.2 Tanh函数
tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。
3.2.1 公式
3.2.2 图
3.2.3 优缺点
优点:
- Tanh outputs are zero-centered,把输入映射到(-1, 1)区间
缺点:
- 虽然 tanh 的导数区间为(0, 1],但仍然会导致梯度消失问题!
3.2.4 TensorFlow中使用
tf.tanh(x, name = None) == tf.nn.tanh(x, name = None)
# y = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
3.3 RELU函数
Rectified Linear Unit(ReLU) - 用于隐层神经元输出
3.3.1 公式
3.3.2 图
3.3.3 优缺点
优点:
- 比 sigmoid/tanh 收敛的更快(6x),creating sparse representations with true zeros( more likely to be linearly separable)
- 其导数在其权重和(z) 大于 0 的时候为 1,从而误差可以很好的传播,权重可以正常更新
缺点:
- 其导数在其权重和(z) 小于 0 的时候为 0,会导致梯度值为0,从而权重无法正常更新
- 输出具有偏移现象,即输出均值恒大于零
3.3.4 TensorFlow中使用
tf.nn.relu(features, name=None)
# y = max(features, 0)