神经网络**函数学习总结
引言
学习神经网络的时候我们总是听到**函数这个词,而且很多资料都会提到常用的**函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下**函数方方面面的知识。本文的内容包括几个部分:
- 什么是**函数?
- **函数的作用?
- 有哪些**函数,都有什么性质和特点?
什么是**函数?
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为**函数(又称激励函数)。
**函数的作用?
上图显示了使用TensorFlow游乐场训练线性模型解决这个问题的效果。可以看出,这个模型并不能很好的区分黄点和蓝点。
从上图可以看出,在线性可分问题中,线性模型就能很好区分不同颜色的点。因为深度学习主要为解决复杂问题,是无法通过直线划分的。在现实生活中,绝大部分的问题都是无法线性分割的。如果将**函数换成非线性的,那么可以得到下图的结果,当加入非线性的元素之后,神经网络模型就可以很好的区分不同颜色的点了。
有哪些**函数,都有什么性质和特点?
Sigmoid函数
Sigmoid 是常用的非线性的**函数,它的数学形式如下:
Sigmoid的几何图像如下:
特点: 它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
缺陷:
- 有饱和区域,是软饱和,在大的正数和负数作为输入的时候,梯度就会变成零,使得神经元基本不能更新。
- 只有正数输出(不是zero-centered),这就导致所谓的zigzag现象。
tanh函数
tanh函数解析式:
tanh函数及其导数的几何图像如下图:它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
Relu函数
Relu函数的解析式:
Relu函数及其导数的图像如下图所示:ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被**,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
Leaky ReLU函数(PReLU)
函数表达式:
函数图像如下图: