Activation Functions
- 平滑非线性激活单元(sigmoid,tanh,elu,softplus and softsign)
- 连续但不是处处可导的激活单元(relu,relu6,crelu and relu_x)
- 随机正则化单元(dropout)
所有的激活操作都是应用在元素级上的,生成一个和输入张量形状一样的张量
激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
激活函数有哪些性质?
- 非线性:当激活函数是线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即f(x)=x,就不满足这个性质,而且如果MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
- 可微性:当优化方法是基于梯度的时候,就体现了该性质;
- 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数;
- f(x)≈x:当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
- 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的Learning Rate。
连续但不是处处可导的激活单元
1.
tf.nn.relu(features, name=None)
f = max(0, features)
2.
tf.nn.relu6(features, name=None)
加了个上限:f = min(max(features, 0), 6)
3.
tf.nn.crelu(features, name=None)
concatenates a ReLU which selects only the positive part of the activation with a ReLU which selects only the negative part of the activation
这会产生两倍通道的结果
4.
tf.nn.lrelu(features, name=None)
f = max(α·features, features)
平滑非线性激活单元
1.
tf.nn.elu(features, name=None)
论文:Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs)
小于0的部分相当于实现了一个BN的功能
ELU在超过5层的网络上面效果更显著,而且速度更快。BN对带有ELU的网络提升不大
反向传播的效率非常高,α是一个控制exp(x)-1范围的数,也就是负值输入饱和状态的值。
2.
tf.nn.softplus(features, name=None)
f = log(exp( fetures ) + 1)
3.
tf.nn.softsign(features, name=None)
f = features / (abs( features ) + 1)
f’ = f(1-f)
4.
tf.sigmoid(x, name=None)
带有偏置
y=1 / (1 + exp( - x))
5.
tf.tanh(x, name=None)
双曲正切
Dropout
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
正则化机制
(1 - keep_prob)元素被置为0,剩下的元素放大为1 / keep_prob倍
偏置相加
tf.nn.bias_add(value, bias, data_format=None, name=None)
# value: Tensor
# bias: 1-D Tensor
# data_format='NHWC' or 'NCHW'
下面在一个只包含一个卷积层和一个全连接层的简单网络上,改变卷积层中的激活函数,看看网络性能的变化:(卷积核5x5x16,全连接层是sigmoid)
可以看出小网络上relu6最好 sigmoid最差
卷积层用rule,改变全连接层中的激活函数,看看网络性能的变化:
注意:在卷积层中表现最好的relu6在全连接层中表现最差