学习神经网络的时候我们总是听到激活函数这个词, 而且很多资料都会提到常用的激活函数, 比如 Sigmoid 函数, tanh 函数, Relu 函数. 肯定很多人刚开始和我一样一头雾水, 接下来就让我们详细了解一下激活函数方方面面的知识.
目录
1. 激活函数的概念和作用;
2. 通俗的理解一下激活函数(图文结合);
3. 几种激活函数的对比;
4. 如何选择合适的激活函数?
1. 激活函数的概念和作用
概念: 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值, 并将输入值传递给下一层, 输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层). 在多层神经网络中, 上层节点的输出和下层节点的输入之间具有一个函数关系, 这个函数称为激活函数(又称激励函数).
关于神经网络中的激活函数的作用, 通常都是这样解释: 不使用激活函数的话, 神经网络的每层都只是做线性变换, 多层输入叠加后也还是线性变换. 因为线性模型的表达能力通常不够, 所以这时候就体现了激活函数的作用了, 激活函数可以引入非线性因素. 疑问就来了, 激活函数是如何引入非线性因素呢?
2. 通俗的理解一下激活函数(图文结合);
为了解释激活函数如何引入非线性因素, 接下来让我们以神经网络分割平面空间作为例子.
(1)无激活函数的神经网络
神经网络最简单的结构就是单输出的单层感知机, 单层感知机只有输入层和输出层, 分别代表了神经感受器和神经中枢. 下图是一个只有 2 个输入单元和 1 个输出单元的简单单层感知机. 图中 x1,w2 代表神经网络的输入神经元受到的刺激, w1,w2 代表输入神经元和输出神经元间连接的紧密程度, b 代表输出神经元的兴奋阈值, y 为输出神经元的输出. 我们使用该单层感知机划出一条线将平面分割开, 如图所示:
同理, 我们也可以将多个感知机 (注意, 不是多层感知机) 进行组合获得更强的平面分类能力, 如图所示:
再看看包含一个隐层的多层感知机的情况, 如图所示:
通过对比可以发现, 上面三种没有激励函数的神经网络的输出是都线性方程, 其都是在用复杂的线性组合来试图逼近曲线.
(2)带激活函数的神经网络
让我们在神经网络每一层神经元做完线性变换以后, 加上一个非线性激励函数对线性变换的结果进行转换, 结果显而易见, 输出立马变成一个不折不扣的非线性函数了, 如图所示:
拓展到多层神经网络的情况, 和刚刚一样的结构, 加上非线性激励函数之后, 输出就变成了一个复杂的非线性函数了, 如图所示:
总结: 加入非线性激励函数后, 神经网络就有可能学习到平滑的曲线来分割平面, 而不是用复杂的线性组合逼近平滑曲线来分割平面, 使神经网络的表示能力更强了, 能够更好的拟合目标函数. 这就是为什么我们要有非线性的激活函数的原因. 如下图所示说明加入非线性激活函数后的差异, 上图为用线性组合逼近平滑曲线来分割平面, 下图为平滑的曲线来分割平面:
3. 几种激活函数的对比;
首先让我们看看激活函数的大分类, 如下图所示:
首先让我们看看什么是饱和激活函数:
反之, 不满足以上条件的函数则称为非饱和激活函数.
sigmoid 和 tanh 是 "饱和激活函数", 而 ReLU 及其变体则是 "非饱和激活函数". 使用 "非饱和激活函数" 的优势在于两点:(1)"非饱和激活函数" 能解决所谓的 "梯度消失" 问题.(2)它能加快收敛速度.
Sigmoid 函数需要一个实值输入压缩至 [0,1] 的范围 ---------σ(x) = 1 / (1 + exp(−x))
tanh 函数需要讲一个实值输入压缩至 [-1, 1]的范围 ---------tanh(x) = 2σ(2x) − 1
由于使用 sigmoid 激活函数会造成神经网络的梯度消失和梯度爆炸问题, 所以许多人提出了一些改进的激活函数, 如: tanh,ReLU,Leaky ReLU,PReLU,RReLU,ELU,Maxout. 下面我们具体来分析一下这几个激活函数的区别.
(1)Sigmoid
Sigmoid 是常用的非线性的激活函数, 它的数学形式如公式 4:
其函数图像如图所示:
导函数图像如图所示:
Sigmoid 函数在历史上曾经非常的常用, 输出值范围为 [0,1] 之间的实数. 但是现在它已经不太受欢迎, 实际中很少使用. 原因是 sigmoid 存在 3 个问题:
sigmoid 函数饱和使梯度消失(Sigmoidsaturate and kill gradients). 我们从导函数图像中可以看出 sigmoid 的导数都是小于 0.25 的, 那么在进行反向传播的时候, 梯度相乘结果会慢慢的趋近于 0. 这样, 几乎就没有梯度信号通过神经元传递到前面层的梯度更新中, 因此这时前面层的权值几乎没有更新, 这就叫梯度消失. 除此之外, 为了防止饱和, 必须对于权重矩阵的初始化特别留意. 如果初始化权重过大, 可能很多神经元得到一个比较小的梯度, 致使神经元不能很好的更新权重提前饱和, 神经网络就几乎不学习.
sigmoid 函数输出不是 "零为中心"(zero-centered). 一个多层的 sigmoid 神经网络, 如果你的输入 x 都是正数, 那么在反向传播中 w 的梯度传播到网络的某一处时, 权值的变化是要么全正要么全负.
如上图所示: 当梯度从上层传播下来, w 的梯度都是用 x 乘以 f 的梯度, 因此如果神经元输出的梯度是正的, 那么所有 w 的梯度就会是正的, 反之亦然. 在这个例子中, 我们会得到两种权值, 权值范围分别位于图 8 中一三象限. 当输入一个值时, w 的梯度要么都是正的要么都是负的, 当我们想要输入一三象限区域以外的点时, 我们将会得到这种并不理想的曲折路线(zig zag path), 图中红色曲折路线. 假设最优化的一个 w 矩阵是在图 8 中的第四象限, 那么要将 w 优化到最优状态, 就必须走 "之字形" 路线, 因为你的 w 要么只能往下走(负数), 要么只能往右走(正的). 优化的时候效率十分低下, 模型拟合的过程就会十分缓慢.
指数函数的计算是比较消耗计算资源的.
(2)tanh
tanh 函数跟 sigmoid 还是很像的, 实际上, tanh 是 sigmoid 的变形, 如公式 5 所示. tanh 的具体公式如公式 6 所示, 其图像如下图所示:
tanh 与 sigmoid 不同的是, tanh 是 "零为中心" 的. 因此, 实际应用中, tanh 会比 sigmoid 更好一些. 但是在饱和神经元的情况下, tanh 还是没有解决梯度消失问题.
优点: tanh 解决了 sigmoid 的输出非 "零为中心" 的问题
缺点:(1)依然有 sigmoid 函数过饱和的问题.(2)依然进行的是指数运算
(3)ReLU
近年来, ReLU 函数变得越来越受欢迎. 全称是 Rectified Linear Unit, 中文名字: 修正线性单元. ReLU 是 Krizhevsky,Hinton 等人在 2012 年《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的一种线性且不饱和的激活函数. 它的数学表达式如 7 所示
函数图像如下图所示:
优点:(1)ReLU 解决了梯度消失的问题, 至少 x 在正区间内, 神经元不会饱和;(2)由于 ReLU 线性, 非饱和的形式, 在 SGD 中能够快速收敛;(3)算速度要快很多. ReLU 函数只有线性关系, 不需要指数计算, 不管在前向传播还是反向传播, 计算速度都比 sigmoid 和 tanh 快
缺点:(1)ReLU 的输出不是 "零为中心"(Notzero-centered output).(2)随着训练的进行, 可能会出现神经元死亡, 权重无法更新的情况. 这种神经元的死亡是不可逆转的死亡
总结: 训练神经网络的时候, 一旦学习率没有设置好, 第一次更新权重的时候, 输入是负值, 那么这个含有 ReLU 的神经节点就会死亡, 再也不会被激活. 因为: ReLU 的导数在 x>0 的时候是 1, 在 x<=0 的时候是 0. 如果 x<=0, 那么 ReLU 的输出是 0, 那么反向传播中梯度也是 0, 权重就不会被更新, 导致神经元不再学习. 也就是说, 这个 ReLU 激活函数在训练中将不可逆转的死亡, 导致了训练数据多样化的丢失. 在实际训练中, 如果学习率设置的太高, 可能会发现网络中 40% 的神经元都会死掉, 且在整个训练集中这些神经元都不会被激活. 所以, 设置一个合适的较小的学习率, 会降低这种情况的发生. 所以必须设置一个合理的学习率. 为了解决神经元节点死亡的情况, 有人提出了 Leaky ReLU,P-ReLu,R-ReLU,ELU 等激活函数.
引出的问题: 神经网络中 ReLU 是线性还是非线性函数? 为什么 relu 这种 "看似线性"(分段线性)的激活函数所形成的网络, 居然能够增加非线性的表达能力?
(1)relu 是非线性激活函数.
(2)让我们先明白什么是线性网络? 如果把线性网络看成一个大的矩阵 M. 那么输入样本 A 和 B, 则会经过同样的线性变换 MA,MB(这里 A 和 B 经历的线性变换矩阵 M 是一样的)
(3)的确对于单一的样本 A, 经过由 relu 激活函数所构成神经网络, 其过程确实可以等价是经过了一个线性变换 M1, 但是对于样本 B, 在经过同样的网络时, 由于每个神经元是否激活 (0 或者 Wx+b) 与样本 A 经过时情形不同了(不同样本), 因此 B 所经历的线性变换 M2 并不等于 M1. 因此, relu 构成的神经网络虽然对每个样本都是线性变换, 但是不同样本之间经历的线性变换 M 并不一样, 所以整个样本空间在经过 relu 构成的网络时其实是经历了非线性变换的.
(4)Leaky ReLU
ReLU 是将所有的负值设置为 0, 造成神经元节点死亡情况. 相反, Leaky ReLU 是给所有负值赋予一个非零的斜率. Leaky ReLU 激活函数是在声学模型 (2013) 中首次提出来的. 它的数学表达式如公式 8 所示:
其图像如下图:
优点:
(1). 神经元不会出现死亡的情况.
(2). 对于所有的输入, 不管是大于等于 0 还是小于 0, 神经元不会饱和.
(3). 由于 Leaky ReLU 线性, 非饱和的形式, 在 SGD 中能够快速收敛.
(4). 计算速度要快很多. Leaky ReLU 函数只有线性关系, 不需要指数计算, 不管在前向传播还是反向传播, 计算速度都比 sigmoid 和 tanh 快.
缺点:(1).Leaky ReLU 函数中的α, 需要通过先验知识人工赋值.
总结: Leaky ReLU 很好的解决了 "dead ReLU" 的问题. 因为 Leaky ReLU 保留了 x 小于 0 时的梯度, 在 x 小于 0 时, 不会出现神经元死亡的问题. 对于 Leaky ReLU 给出了一个很小的负数梯度值α, 这个值是很小的常数. 比如: 0.01. 这样即修正了数据分布, 又保留了一些负轴的值, 使得负轴信息不会全部丢失. 但是这个α通常是通过先验知识人工赋值的.
(5)RReLU
RReLU 的英文全称是 "Randomized Leaky ReLU", 中文名字叫 "随机修正线性单元".RReLU 是 Leaky ReLU 的随机版本. 它首次是在 Kaggle 的 NDSB 比赛中被提出来的, 其图像和表达式如下图所示:
RReLU 的核心思想是, 在训练过程中,α是从一个高斯分布 中随机出来的值, 然后再在测试过程中进行修正. 在测试阶段, 把训练过程中所有的 取个平均值.
特点:
(1).RReLU 是 Leaky ReLU 的 random 版本, 在训练过程中,α是从一个高斯分布中随机出来的, 然后再测试过程中进行修正.
(2). 数学形式与 PReLU 类似, 但 RReLU 是一种非确定性激活函数, 其参数是随机的
(6)ReLU,Leaky ReLU,PReLU 和 RReLU 的比较
各自图像如下图所示:
总结:
(1)PReLU 中的α是根据数据变化的;
(2)Leaky ReLU 中的α是固定的;
(3)RReLU 中的α是一个在给定范围内随机抽取的值, 这个值在测试环节就会固定下来.
(7)ELU
ELU 的英文全称是 "Exponential Linear Units", 中文全称是 "指数线性单元". 它试图将激活函数的输出平均值接近零, 从而加快学习速度. 同时, 它还能通过正值的标识来避免梯度消失的问题. 根据一些研究显示, ELU 分类精确度是高于 ReLU 的. 公式如 12 式所示.
ELU 与其他几种激活函数的比较图:
优点:
(1)ELU 包含了 ReLU 的所有优点.
(2)神经元不会出现死亡的情况.
(3)ELU 激活函数的输出均值是接近于零的.
缺点:
(1)计算的时候是需要计算指数的, 计算效率低的问题.
(8)Maxout
Maxout "Neuron" 是由 Goodfellow 等人在 2013 年提出的一种很有特点的神经元, 它的激活函数, 计算的变量, 计算方式和普通的神经元完全不同, 并有两组权重. 先得到两个超平面, 再进行最大值计算. 激活函数是对 ReLU 和 Leaky ReLU 的一般化归纳, 没有 ReLU 函数的缺点, 不会出现激活函数饱和神经元死亡的情况. Maxout 出现在 ICML2013 上, 作者 Goodfellow 将 maxout 和 dropout 结合, 称在 MNIST,CIFAR-10,CIFAR-100,SVHN 这 4 个数据集上都取得了 start-of-art 的识别率. Maxout 公式如 13 所示.
其中
, 假设 w 是 2 维的, 那么我们可以得出公式 14.
分析公式 14 可以注意到, ReLU 和 Leaky ReLU 都是它的一个变形. 比如的时候, 就是 ReLU.Maxout 的拟合能力非常强, 它可以拟合任意的凸函数. Goodfellow 在论文中从数学的角度上也证明了这个结论, 只需要 2 个 Maxout 节点就可以拟合任意的凸函数, 前提是 "隐含层" 节点的个数足够多.
优点:
(1)Maxout 具有 ReLU 的所有优点, 线性, 不饱和性.
(2)同时没有 ReLU 的一些缺点. 如: 神经元的死亡.
缺点:
(1)从这个激活函数的公式 14 中可以看出, 每个 neuron 将有两组 w, 那么参数就增加了一倍. 这就导致了整体参数的数量激增.
4. 如何选择合适的激活函数?
看了这多激活函数, 想必大家都应该有所了解, 那这么多的激活函数该如何选择呢? 目前还不存在定论, 在实践过程中更多还是需要结合实际情况, 考虑不同激活函数的优缺点综合使用. 我在这里给大家一点在训练模型时候的建议.
(1)通常来说, 不能把各种激活函数串起来在一个网络中使用.
(2)如果使用 ReLU, 那么一定要小心设置学习率(learning rate), 并且要注意不要让网络中出现很多死亡神经元. 如果死亡神经元过多的问题不好解决, 可以试试 Leaky ReLU,PReLU, 或者 Maxout.
(3)尽量不要使用 sigmoid 激活函数, 可以试试 tanh, 不过我还是感觉 tanh 的效果会比不上 ReLU 和 Maxout.
参考链接:
https://zhidao.baidu.com/question/565740454826072204.html
以上就是本次学习心得, 欢迎交流!
来源: https://www.cnblogs.com/XDU-Lakers/p/10557496.html