激活函数


1. 激活函数

下面资料来自于 英文wiki Activation function,我只是 Google 翻译了。

激活函数应有的特性:

  • 非线性 - 当激活函数是非线性的时,则可以证明双层神经网络是通用函数逼近器。恒等激活函数不满足这个属性,当多个层使用恒等激活函数连接时,整个网络就近似于一个单层的模型。
  • 值域 - 当激活函数值域是有限的时,基于梯度的训练方法往往更稳定,因为仅影响有限的权重。当范围无限时,训练通常更有效,因为影响大多数权重。在后一种情况下,通常需要较小的学习率。
  • 处处可导性 - 使用基于梯度的优化算法时必须满足处处可导(ReLU不满足条件,但仍然可以用)。
  • 单调性 - 保证单层模型相关联的误差函数是凸函数。
  • 具有单调导数的平滑函数
  • 近似于原点附近的身份 - 激活函数 f(0)=0 ,f'(0)=1, f'在0处连续。

activation_func-1
figure 1

H 是阶跃函数,
\alpha 是在训练时从均匀分布中采样的随机变量,并且在测试时固定为期望值。
\sigma 是逻辑函数(logistic function)
\alpha > 0

特殊的激活函数:

activation_func-2
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>

png

png

评论
还没有评论
    发表评论 说点什么