深度学习的基本原理是基于人工神经网络,输入信号通过非线性的active function,传入到下一层神经元;再通过下一层神经元的activate,继续往下传递,如此循环往复,直到输出层。正是由于这些active functions的堆砌,深度学习才被赋予了解决非线性问题的能力。固然,仅仅靠active functions还不足于使得深度学习具备"超能力",训练过程当中的优化器对于组织神经网络中的各个神经元起到了相当重要的角色。本文简单汇总一些经常使用的active functions和optimizers,不求最全,可是尽可能保证简单易懂。html
固然,在介绍这些active functions以前,先简单汇总下active functions应该具有的性质。算法
sigmoid函数是深度学习中最基本,也是最为常见的一种激活函数。sigmoid函数公式以下:网络
$$f(x) = \frac{1}{1+e^{-x}}$$app
sigmoid函数的导函数形式为:$g(x) = f(x)(1-f(x))$dom
函数曲线和导函数曲线分别以下图所示:iphone
sigmoid函数的优势在于函数平滑且易于求导,可是其缺点也比较突出,例如:机器学习
tanh读做hyperbolic tangent,相对于sigmoid函数的缺点,它具备zero-centered形式的输出,所以被认为tanh通常老是好于sigmoid,由于函数值介于[-1,1]之间,激活函数的平均值接近于0,这样可使得下一层的神经元学习的更好。其公式表示以下:函数
$$f(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}}$$post
对应的导数形式为:$g(x) = 1-f(x)^2$性能
函数曲线和导函数曲线分别以下图所示:
实际上tanh是sigmoid平移后的结果。由于tanh老是优于sigmoid,因此sigmoid目前基本不用,但有一个例外的场景,那就是sigmoid更适合于作二分类系统的输出层。由于sigmoid的输出值介于[0,1]之间,能够很容易的去表征几率。
tanh和sigmoid函数的共同缺点就是当输入特别小或者特别大时,容易引发梯度弥散或梯度爆炸。而ReLU(Rectified Linear Units)能够在必定程度上缓解梯度弥散和梯度爆炸的问题,使得深度神经网络的训练能够更快速地达到收敛。所以目前神经网络中的隐含层中最为经常使用的默认激活函数就是ReLU了。其函数形式表示以下:
$$f(x) = \max(0, x)$$
函数和导函数曲线以下图所示:
经过上图能够发现,ReLU在0点是不可导的,所以ReLU在应用的时候有个小trick,在实践的时候能够将0点的导数强制赋值为0或者1。
ReLU虽然简单,但倒是深度学习激活函数方面几乎最为重要的成果,它有如下几大优势:
但其实ReLU也不是万能的,它的缺点能够简单提两点:
dying ReLU problem:因为ReLU特殊的函数形式,在训练过程当中某些神经元可能永远不会被激活,致使相应的参数永远不能被更新,并且这个问题会随着训练的进行持续恶化。
致使dying ReLU problem的缘由主要有两个:
dying ReLU problem详细细节能够参考这里:《What is the "dying ReLU" problem in neural networks?》
即便ReLU存在上述问题,可是ReLU目前是应用最为普遍和实用的激活函数。
Leaky ReLU就是针对dying ReLU problem而进行改进的,相对于ReLU而言,函数前半段再也不为0,而是一段线性函数。用公式表达以下:
$$f(x) = \alpha x, if x < 0$$
$$f(x) = x, if x \ge 0$$
其中,参数$\alpha$通常为远小于1的实数,好比0.01。下图显示了Leaky ReLU的两种函数形式,一种$\alpha$为定值,另一种$\alpha$为某范围内的随机值(也被称为Randomized Leaky ReLU):
除了具有ReLU的全部优势之外,Leaky ReLU不存在dying ReLU problem。从理论上讲,Leaky ReLU应该彻底优于ReLU的性能,可是实际应用中并无表现能够证实Leaky ReLU绝对优于ReLU。
同Leaky ReLU同样,ELU(Exponential Linear Unit)也是针对dying ReLU problem提出的。具体公式以下:
$$f(x) = \alpha (e^x-1), if x < 0$$
$$f(x) = x, if x \ge 0$$
具体函数曲线以下:
ELU也能够有效地解决dying ReLU problem,并且是近似zero-centered,但随之而来的缺点就是ELU再也不是简单的阈值计算,计算相对ReLU稍加复杂。
下表汇总了经常使用的一些active functions:
三种梯度降低算法能够参考以前博文《[Machine Learning] 梯度降低法的三种形式BGD、SGD以及MBGD》
上述三种梯度降低的优化算法均存在以下问题:
Learning rate若是选择的过小,收敛速度会很慢,若是太大,loss function就会在极小值处不停地震荡甚至偏离。
对全部参数更新时应用一样的Learning rate,若是咱们的数据是稀疏的,咱们更但愿对出现频率低的特征进行大一点的更新。
对于非凸函数,还要避免陷于局部极小值或者鞍点处,由于鞍点周围的error 是同样的,全部维度的梯度都接近于0,纯梯度降低很容易被困在这里。
关于鞍点的解释:
鞍点:一个光滑函数的鞍点邻域的曲线,曲面,或超曲面,都位于这点的切线的不一样边。 例以下图这个二维图形,像个马鞍:在x轴方向往上曲,在y轴方向往下曲,鞍点就是(0,0)。
目前对于优化器的研究基本围绕上述三个问题进行展开。
SGD算法的更新公式以下:
$$W:=W-\alpha dW$$
$$b:=b-\alpha db$$
咱们能够示意化的画出SGD优化路线图以下:
Momentum的改进思想是针对SGD算法波动大、收敛速度慢问题,简单来讲就是防止波动,取前几回波动的均值做为新的参数值。Momentum利用了梯度的指数加权平均数,引入了一个新的超参数$\beta$(通常取0.9),具体更新公式以下:
$$V_{dW}=\beta V_{dW}+(1-\beta)dW$$
$$V_{db}=\beta V_{db}+(1-\beta)db$$
$$W:=W-\alpha V_{dW}$$
$$b:=b-\alpha V_{db}$$
改进后的Momentum优化路线示意图以下:
Momentum背后的物理含义能够简单的这样理解:
当咱们将一个小球从山上滚下来时,没有阻力的话,它的动量会愈来愈大,可是若是遇到了阻力,速度就会变小。 加入这一项,可使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就能够加快收敛并减少震荡。
RMSprop是Geoff Hinton提出的一种自适应学习率方法,全称为Root Mean Square Prop,它的基本思想和Momentum相似,一样引入了额外的超参数$\beta$(通常取值0.999),其更新公式以下:
$$S_{dW}=\beta S_{dW}+(1-\beta)dW^2$$
$$S_{db}=\beta S_{db}+(1-\beta)db^2$$
$$W:=W-\alpha \frac{dW}{\sqrt{S_{dW}}}$$
$$b:=b-\alpha \frac{db}{\sqrt{S_{db}}}$$
针对上述更新公式,为了防止$W$和$b$更新过程当中分母项为0,通常在应用中加上特别小的一个实数$\epsilon$(通常取值为$10^{-8}$):
$$W:=W-\alpha \frac{dW}{\sqrt{S_{dW}+\epsilon}}$$
$$b:=b-\alpha \frac{db}{\sqrt{S_{db}+\epsilon}}$$
RMSprop示意图以下:
具体关于RMSprop更详细的讲解能够参考这篇博文《机器学习中使用的神经网络第六讲笔记》
研究者们其实提出了不少的优化算法,能够解决一些特定的优化问题,可是很难扩展到多种神经网络。而Momentum,RMSprop是很长时间来最经得住考研的优化算法,适合用于不一样的深度学习结构。因此有人就有想法,何不将这俩的方法结合到一块儿呢?Adam算法,全称Adaptive Moment Estimation,就随即问世了。因为Adam是Momentum+RMSprop,因此须要引入两个超参数,咱们表示为$\beta_1=0.9$,$\beta_2=0.999$。
$$V_{dW}=\beta_1 V_{dW}+(1-\beta_1)dW$$
$$V_{db}=\beta_1 V_{db}+(1-\beta_1)db$$
$$S_{dW}=\beta_2 S_{dW}+(1-\beta_2)dW^2$$
$$S_{db}=\beta_2 S_{db}+(1-\beta_2)db^2$$
$$V_{dW}^{corrected}=\frac{V_{dW}}{1-\beta_{1}^t}$$
$$V_{db}^{corrected}=\frac{V_{db}}{1-\beta_{2}^t}$$
$$S_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_{1}^t}$$
$$S_{db}^{corrected}=\frac{S_{db}}{1-\beta_{2}^t}$$
$$W:=W-\alpha \frac{V_{dW}}{\sqrt{S_{dW}^{corrected}}}$$
$$b:=b-\alpha \frac{V_{db}}{\sqrt{S_{db}^{corrected}}}$$
由于Adam结合上述两种优化算法的优势于一身,因此如今常常用的是Adam优化算法。
除了上述三种经常使用的改进算法,还有例如Adagrad等Optimizer,这里就不一一介绍了,感兴趣的能够去了解下各算法改进的motivation。
下面两个图分别展现了几种算法在鞍点和等高线上的表现: