【TensorFlow】激活函数(Activation Functions)原理解析(十二)

来源:互联网 发布:webpack压缩单个js文件 编辑:程序博客网 时间:2024/06/08 20:06

神经网络结构的输出为所有输入的加权和,这导致整个神经网络是一个线性模型。如果将每一个神经元的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,使得神经网络可以更好地解决较为复杂的问题。这个非线性函数也就是激活函数

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。因此,激活函数是深度神经网络中不可或缺的部分。

从定义来看,几乎所有的连续可导函数都可以用作激活函数。但目前常见的多是分段线性和具有指数形状的非线性函数。下文将依次对它们进行总结。

TensorFlow提供的激活函数有:
详见官方文档
1、tf.nn.relu(features, name=None)
2、tf.nn.relu6(features, name=None)
3、tf.nn.softplus(features, name=None)
4、tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
5、tf.nn.bias_add(value, bias, name=None)
6、tf.sigmoid(x, name=None)
7、tf.tanh(x, name=None)
除了上述的激活函数,TensorFlow当然还可以自定义激活函数

下面具体解析常用的激活函数tf.nn.relu()、tf.sigmoid()、tf.tanh():

1、tf.nn.relu(features, name=None)
这里写图片描述

对应的图像是:这里写图片描述

ReLU的优点:

a. 相较于sigmoid和tanh函数,ReLU 对于 SGD(梯度下降优化算法) 的收敛有巨大的加速作用(Alex Krizhevsky 指出有 6 倍之多)。有人认为这是由它的线性、非饱和的公式导致的。

b. 相比于 sigmoid和tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算。

c. 有效缓解了梯度消失的问题。

d. 在没有无监督预训练的时候也能有较好的表现。

e. 提供了神经网络的稀疏表达能力

ReLU的缺点:

a. 它在训练时比较脆弱并且可能“死掉”。举例来说:一个非常大的梯度经过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。

b. 合理设置学习率,会降低这种情况的发生概率。

后续又有相关ReLU衍生的激活函数,比如:ReLU6、SReLU、Leaky ReLU 、PReLU、RReLU、CReLU

1.1、ReLU6
这里写图片描述

1.2、LReLU、PReLU与RReLU
这里写图片描述
通常在LReLU和PReLU中,我们定义一个激活函数为这里写图片描述
-LReLU
ai比较小而且固定的时候,我们称之为LReLU。LReLU最初的目的是为了避免梯度消失。但在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的a,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU

-PReLU
PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。

2、tf.sigmoid(x, name=None)

这里写图片描述

对应的图像是:这里写图片描述

sigmoid的使用场景是只对一种类别进行分类。首先设置阈值(shrehold),当sigmoid函数输出值大于阈值,则认为【是】这一类,否则认为【不是】这类。

sigmoid优点:

a. Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。

b. 求导容易。

sigmoid函数曾被广泛地应用,但由于其自身的一些缺陷,现在很少被使用了。

sigmoid缺点:

a. 函数饱和使梯度消失

sigmoid 在值为 0 或 1 的时候接近饱和,这些区域,梯度几乎为 0。因此在反向传播时,这个局部梯度会与整个损失函数关于该单元输出的梯度相乘,结果也会接近为 0 。因此这时梯度就对模型的更新没有任何贡献

除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习。

b. sigmoid 函数关于原点中心不对称

这个特性会导致后面网络层的输入也不是零中心的,进而影响梯度下降的运作。因为如果输入都是正数的话(如y=wx+b中每个元素都 x>0),那么关于w的梯度在反向传播过程中,要么全是正数,要么全是负数(具体依据整个表达式y而定),这将会导致梯度下降权重更新时出现z字型的下降。

如果是按 batch 训练,那么每个 batch 可能得到不同的信号,整个批量的梯度加起来后可以缓解这个问题。

后续又有相关sigmoid 衍生的激活函数,比如:softplus、softmax、softsign

2.1、 softmax是sigmoid函数的多分类样本,可以将输出值对应到多个类别标签,概率值最高的一项就是模型预测的标签。

2.2、 softplus
这里写图片描述

2.3、 softsign这里写图片描述

目前使用的比较少,在这里就不详细讨论了。

3、tf.tanh(x, name=None)

这里写图片描述

对应的图像是:这里写图片描述

tanh函数与sigmoid一样也存在饱和问题,但它的输出是零中心的,因此实际应用中tanh比sigmoid 更受欢迎。tanh函数实际上是一个放大的sigmoid函数

tanh优点:

a. 比Sigmoid函数收敛速度更快。

b. 相比Sigmoid函数,其输出以0为中心。

tanh缺点:

a. 还是没有改变Sigmoid函数的最大问题–由于饱和性产生的梯度消失

总结:深度学习的快速发展,催生了形式各异的激活函数。如何做出选择目前尚未有统一定论,仍需依靠实验指导。一般来说,在分类问题上建议首先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。然后可考虑使用具备学习能力的PReLU,并使用正则化技术,例如应该考虑在网络中增加Batch Normalization层。

参考:
1、浅谈深度学习中的激活函数 - The Activation Function in Deep Learning
2、深度学习中的激活函数导引

阅读全文
1 0
原创粉丝点击