本文最后更新于 1651 天前,其中的信息可能已经有所发展或是发生改变。
1. 激活函数
下面资料来自于 英文wiki Activation function,我只是 Google 翻译了。
激活函数应有的特性:
- 非线性 – 当激活函数是非线性的时,则可以证明双层神经网络是通用函数逼近器。恒等激活函数不满足这个属性,当多个层使用恒等激活函数连接时,整个网络就近似于一个单层的模型。
- 值域 – 当激活函数值域是有限的时,基于梯度的训练方法往往更稳定,因为仅影响有限的权重。当范围无限时,训练通常更有效,因为影响大多数权重。在后一种情况下,通常需要较小的学习率。
- 处处可导性 – 使用基于梯度的优化算法时必须满足处处可导(ReLU不满足条件,但仍然可以用)。
- 单调性 – 保证单层模型相关联的误差函数是凸函数。
- 具有单调导数的平滑函数
- 近似于原点附近的身份 – 激活函数 $f(0)=0$ ,$f'(0)=1$, $f’$在0处连续。
figure 1
$H$ 是阶跃函数,
$\alpha$ 是在训练时从均匀分布中采样的随机变量,并且在测试时固定为期望值。
$\sigma$ 是逻辑函数(logistic function)
$\alpha$ > 0
特殊的激活函数:
figure 2
$$\delta_{ij}={
\begin
{cases}0 & {\text{if }}i \neq j,
\1 & {\text{if }}i=j.
\end{cases}}$$
上面表中 Order of continuity : $C^k$ 表示该函数的 1 到 k 阶导数均存在且连续
2. 常用激活函数的优缺点
2.1 Sigmoid
优点:能够把输入的连续实值“压缩”到 0 和 1 之间。可用于输出层。
缺点:1. 饱和区(也就是两端)会 kill 梯度(也就是梯度非常小,使得网络难以学习)。
2. 输出不是 0 均值
3. 运算复杂
2.2 tanh
优点:输出 0 均值,实际表现好于 Sigmoid.
缺点:同 Sigmoid 的 1, 3 缺点
2.3 ReLU
优点:SGD算法的收敛速度快,运算简单
缺点:训练的时候很”脆弱”,很容易就”die”。
例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0.
解决方案是使用较小的学习率。
2.4 Softmax
用于多分类问题的输出层。
3. tensorflow绘制常用激活函数
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os
%matplotlib inline
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# fake data
x = np.linspace(-10, 10, 200)
# following are popular activation func
y_relu = tf.nn.relu(x)
y_sigmoid = tf.nn.sigmoid(x)
y_tanh = tf.nn.tanh(x)
y_softplus = tf.nn.softplus(x)
y_softmax = tf.nn.softmax(x)
'''softmax is a special kind of
activation function, it is about probability'''
sess = tf.Session()
y_relu, y_sigmoid, y_tanh, y_softplus, y_softmax = sess.run([y_relu,
y_sigmoid,
y_tanh,
y_softplus,
y_softmax])
# plt to visualize these activation func
plt.figure(1, figsize=(8, 6))
plt.subplot(221)
plt.plot(x, y_relu, c='r', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')
plt.subplot(222)
plt.plot(x, y_sigmoid, c='g', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')
plt.subplot(223)
plt.plot(x, y_tanh, c='b', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')
plt.subplot(224)
plt.plot(x, y_softplus, c='y', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')
# plt.show()
plt.figure(2)
plt.plot(x, y_softmax, label='softplus')
plt.legend(loc='best')
<matplotlib.legend.Legend at 0x251fdfeda20>