深度学习中的基本问题总结

一、常用的激活函数

激活函数一般用于神经网络的层与层之间,将上一层的输出转换之后输入到下一层。如果没有激活函数引入的非线性特性,那么神经网络就只相当于原始感知机的矩阵相乘激活函数分为线性激活函数和非线性激活函数。

为什么需要非线性的激活函数:神经网络用于实现复杂的函数,而 非线性激活函数能够使神经网络逼近任意复杂的函数。如果没有激活函数引入的非线性,多层神经网络就相当于单层的神经网络。常用的非线性激活函数有sigmod, tanh, relu, lrelu, prelu, swish等。

1. sigmoid

Sigmoid也被称为逻辑激活函数(Logistic Activation Function)。它将一个实数值压缩到0至1的范围内。当我们的最终目标是预测概率时,它可以被应用到输出层。它使很大的负数向0转变,很大的正数向1转变。在数学上表示为:

1.gif

下图为sigmoid函数以及它的导数图像。

2.png

Sigmoid激活函数的三个主要缺点是:

  • 梯度消失:sigmoid函数在0和1附近是平坦的。也就是说,sigmoid的梯度在0和1附近为0。在通过sigmoid函数网络反向传播时,当神经元的输出近似于0和1时它的梯度接近于0。这些神经元被称为饱和神经元。因此,这些神经元的权值无法更新。不仅如此,与这些神经元相连接的神经元的权值也更新得非常缓慢。函数的梯度值<0.25,网络较深时,链式的反向传播导致梯度值非常小接近零, Grad=Error*Sigmoid`(x)*x,导致每经过一层Error都是成倍衰减,这个问题也被称为梯度消失。所以,想象如果有一个大型网络包含有许多处于饱和动态的sigmoid激活函数的神经元,那么网络将会无法进行反向传播;
  • 输出不以0为中心:输出均值不为零。反向传播时后一层将得到上一层输出的非0均值作为输入,会出现偏移现象;Δw将全为正数、或全为负数,使得梯度下降过程中出现z字型下降,导致权值更新效率降低;
  • 计算量太大速度慢:指数函数与其它非线性激活函数相比计算量太大了,指数计算速度慢。

2. tanh

Tanh也被称为双曲正切激活函数。类似sigmoid,tanh也是把一个实数值压缩。与sigmoid不同的是,tanh在-1到1的输出范围内是零均值的。可以把tanh函数看做是两个sigmoid加在一起: tanh(x)=sigmoid(2x)-1。

3.png

在实际运用中,tanh比sigmoid更好。这主要是因为Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感,一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。而tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好,有界,渐进于0、1,符合人脑神经饱和的规律,与 sigmoid 的区别是,tanh 输出是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。

Tanh唯一的缺点是:tanh函数也存在着梯度消失的问题,因此在饱和时会导致梯度消失。

1.png

3. 线性整流函数(ReLU)

ReLU是目前应用最为广泛的激活函数。 该函数以0为分界线,输入小于0的部分输出均为0,大于等于0的部分输出等于输入值。

ReLU及其导数的表达式:

1.gif

4.png

ReLU的优点:收敛速度快;至少在正数范围内没有饱和,能够对梯度消失有抵抗能力; 因为它是使用简单的阈值,在计算上非常有效率。

  • ReLU的导数不是常数,所以ReLU是非线性的。Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
  • ReLu虽然在大于0的区间是线性的,在小于等于0的部分也是线性的,但是它整体不是线性的,因为不是一条直线,所以Relu函数是非线性函数。

ReLU的缺点:

  • 输出不以0为中心
  • 对于ReLu中(x<0)的激活,此时梯度为0,因此在下降过程中权重不会被调整。其不会在任何数据点上再次激活。简单地说,ReLu可能导致神经元死亡。

4. 泄漏ReLU激活函数(Leaky ReLU)

为了解决ReLU中容易出现死神经元的问题,对负数部分进行修正,加入一个小的斜率(ɑ∈(0,1),一般取0.1、0.01等)使得负数输入不会全部被稀疏掉.

1.png

还有许多对ReLU改进的激活函数:PReLU、ELU、SELU等。

二、 过拟合问题

过拟合产生的原因

  1. 数据不足,无法拟合数据的真实分布

    • 数据有噪声;
    • 训练数据不足,有限的训练数据。
  2. 模型复杂

    • 模型假设过于复杂,参数过多,训练数据不足、噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力
    • 训练模型过度:权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征

过拟合的解决方法

  1. 从数据角度解决过拟合
    • 获取更多数据 :从数据源头获取更多数据;数据增强(Data Augmentation);
    • 数据处理和清洗(data ckeaning/Pruning):将错误的label 纠正或者删除错误的数据。
  2. 从模型角度解决过拟合
    • 正则化
    • Dropout
    • 提前停止(early stopping)

网络正则化

机器学习模型的关键是泛化问题,即在样本真实分布上的期望风险最小化。
而训练数据集上的经验风险最小化和期望风险并不一致。由于神经网络的拟合
能力非常强,其在训练数据上的错误率往往都可以降到非常低,甚至可以到0,
从而导致过拟合。因此,如何提高神经网络的泛化能力反而成为影响模型能力
的最关键因素。

在传统的机器学习中,提高泛化能力的方法主要是限制模型复杂度,比如采
用ℓ1 和ℓ2 正则化等方式。而在训练深层神经网络时,特别是在过度参数(Over-
Parameterized)时,ℓ1 和ℓ2 正则化的效果往往不如浅层机器学习模型中显著。
因此训练深度学习模型时,往往还会使用其它的正则化方法,比如数据增强、提前停止、丢弃法、集成法等。

ℓ1和ℓ2正则化

ℓ1 和ℓ2 正则化是机器学习中最常用的正则化方法,通过约束参数的ℓ1 和ℓ2
范数来减小模型在训练数据集上的过拟合现象。

通过加入ℓ1 和ℓ2 正则化,优化问题可以写为:

1.png

其中 L(·) 为损失函数,N 为训练样本数量,f(·) 为待学习的神经网络,θ 为其参
数,ℓp 为范数函数,p 的取值通常为{1, 2} 代表ℓ1 和ℓ2 范数,λ 为正则化系数。

2.png

正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。

给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡(trade-off),如果还像原来只优化f的情况下,那可能得到一组解比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。

ℓ1和ℓ2正则化的区别

ℓ1 正则化就是在 loss function 后边所加正则项为 ℓ1 范数,加上 ℓ1 范数容易得到稀疏解(0 比较多),能够实现特征的自动选择。ℓ2 正则化就是 loss function 后边所加正则项为 ℓ2 范数的平方,加上 ℓ2 正则相比于 ℓ1 正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于 0(但不是等于 0,所以相对平滑)的维度比较多,降低模型的复杂度。

ℓ1正则比ℓ2正则化获得稀疏解的原因:

1.jpg

2.jpg

3.jpg

Dropout

三、梯度爆炸和梯度消失

1. 产生原因

梯度消失原因

  • 深度神经网络角度:网络层数多

  • 激活函数角度:选择不合适的激活函数。e.g., sigmoid,tanh。

    梯度爆炸原因

  • 深度神经网络角度:网络层数多

  • 参数初始值过大

梯度消失/爆炸的根源—–深度神经网络和反向传播。 目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。

1.jpg

上图是一个5层的网络,设最终的损失函数为L,则利用反向传播方法求L关于w1的梯度过程如下:

1.png

在上述梯度反向传播的过程中,若权重参数初始值较小 |w|<1,随着网络层数的加深,梯度一直在衰减,使得浅层网络的参数的梯度接近于0,产生梯度消失,这时网络层数较深的原因;另外,若网络中选择sigmoid作为激活函数,而sigmoid的导数值<0.25, 链式的导数相乘中随着网络加深梯度的值快速衰减为0,这时选择了不合适的激活函数所致。

而当权重参数初始值比较大 |w|>1,梯度随着网络的深度的增加,使得参数的梯度非常大,长生梯度爆炸。

2. 解决方法

梯度爆炸的解决方法

1)使用梯度剪切预防梯度爆炸

梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。

2)权重正则化

比较常见的是l1正则,和l2正则。

梯度消失的解决方法

1) 使用relu、leakrelu、elu等激活函数
2) batchnorm

Batchnorm就是通过对每一层的输出做scale和shift的方法,通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正太分布,即严重偏离的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

3) 残差连接
4) LSTM

四、 归一化

五、 优化器

目前,深层神经网络的参数学习主要是通过梯度下降方法来寻找一组可以最小化结构风险的参数。在具体实现中,梯度下降法可以分为:批量梯度下降、随机梯度下降以及小批量梯度下降三种形式。

BGD(批量梯度下降)

BGD(批量梯度下降,这里的批量实际上是全部数据)每次迭代采用整个训练集数据来计算损失函数 J(θ)对参数 θ 的的梯度。

1.png

缺点:

在训练深层神经网络时,训练数据的规模比较大。如果在梯度下降时,每次迭代都要计算整个训练数据上的梯度需要比较多的计算资源,计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。 此外,大规模训练集中的数据通常也会非常冗余,也没有必要在整个训练集上计算梯度。

SGD(随机梯度下降)

和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。

2.png

缺点: SGD 因为更新比较频繁,带有随机性,会造成 cost function 有严重的震荡。
SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。所以虽然训练速度快,但是准确度下降,并不是全局最优。

## MBGD(最小批量梯度下降)

MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。

3.png

缺点: 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,损失函数就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)

为了更有效地进行训练深层神经网络,在标准的小批量梯度下降方法的基础上,也经常使用一些改进方法以加快优化速度。常见的改进方法主要从以下两个方面进行改进:学习率衰减和梯度方向优化。

## 改进一:调整学习率

在梯度下降中,学习率α 的取值非常关键,如果过大就不会收敛,如果过小则收敛速度太慢。从经验上看,学习率在一开始要保持大些来保证收敛速度,在收敛到最优点附近时要小些以避免来回震荡。因此,比较简单直接的学习率调整可以通过学习率衰减(Learning Rate Decay)的方式来实现。

除了采用如指数衰减等这些固定衰减率的调整学习率方法外,还有些自适应地调整学习率的方法,比如AdaGrad、RMSprop、AdaDelta 等。这些方法都对每个参数设置不同的学习率。

AdGrad

AdaGrad(Adaptive Gradient)算法是借鉴L2 正则化的思想,每次迭代时自适应地调整每个参数的学习率。在第t 迭代时,先计算每个参数梯度平方的累计值:

1.JPG

AdaGrad 算法的参数更新差值为:

2.JPG

Adagrad 算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由
于这时的学习率已经非常小,很难再继续找到最优点。

RMSprop

RMSprop算法是Geoff Hinton 提出的一种自适应学习率的方法,可以在有些情况下避免AdaGrad 算法中学习率不断单调下降以至于过早衰减的缺点。

RMSprop算法首先计算每次迭代梯度gt 平方的指数衰减移动平均:

3.JPG

RMSprop算法的参数更新差值为:

4.JPG

从上式可以看出,RMSProp 算法和Adagrad 算法的区别在于Gt 的计算由累积方式变成了指数衰减移动平均。在迭代过程中,每个参数的学习率并不是呈衰减趋势,既可以变小也可以变大。

改进二:梯度方向优化

除了调整学习率之外,还可以通过使用最近一段时间内的平均梯度来代替当前时刻的梯度来作为参数更新的方向。在小批量梯度下降中,如果每次选取样本数量比较小,损失会呈现震荡的方式下降。有效地缓解梯度下降中的震荡的方式是通过用梯度的移动平均来代替每次的实际梯度,并提高优化速度,这就是动量法。

Momentum (动量法)

动量是模拟物理中的概念。一般而言,一个物体的动量指的是这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积。动量法是用之前积累动量来替代真正的梯度。每次
迭代的梯度可以看作是加速度。

在第t 次迭代时,计算负梯度的“加权移动平均”作为参数的更新方向,

5.JPG

通过动量法,每个参数的实际更新差值取决于最近一段时间内梯度的加权平均值。当某个参数在最近一段时间内的梯度方向不一致时,其真实的参数更新幅度变小;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变大,起到加速作用。一般而言,在迭代初期,梯度方法都比较一致,动量法会起到加速作用,可以更快地到达最优点。在迭代后期,梯度方法会取决不一致,在收敛值附近震荡,动量法会起到减速作用,增加稳定性。从某种角度来说,当前梯度叠加上部分的上次梯度,一定程度上可以近似看作二阶梯度。

Adam(动量法 + RMSprop)

自适应动量估计(Adaptive Moment Estimation,Adam)算法可以看作是动量法和RMSprop 的结合,不但使用动量作为参数更新方向,而且可以自适应调整学习率。

Adam 算法一方面计算梯度平方 gt^2 的指数加权平均(和 RMSprop 类似),另一方面计算梯度gt 的指数加权平均(和动量法类似:

6.JPG

其中β1 和β2 分别为两个移动平均的衰减率,通常取值为β1 = 0.9, β2 = 0.99。

假设M0 = 0,G0 = 0,那么在迭代初期 Mt 和 Gt 的值会比真实的均值和方差要小。特别是当 β1 和 β2 都接近于1 时,偏差会很大。因此,需要对偏差进行修正。

7.JPG

Adam算法的参数更新差值为:

8.JPG

六、数据预处理

归一化方法

缩放归一化

缩放归一化是一种非常简单的归一化方法,通过缩放将每一个特征的取值范围归一到[0, 1] 或[−1, 1] 之间。对于每一维特征x,

9.JPG

标准归一化

标准归一化也叫 z-score 归一化,来源于统计上的标准分数。将每一个维特征都处理为符合标准正态分布(均值为0,标准差为1)。假设有N 个样本{x^(i)}, i=1, · · · ,N,对于每一维特征x,我们先计算它的均值和标准差:

10.JPG

特征减去均值初一标准差,得到新的特征值:

11.JPG