目录
1. 神经网络有什么难点问题?
2. 训练神经网络时常用的优化算法有什么?
(1)小批量梯度下降(Mini-Batch Gradient Descent).
为什么要使用小批量梯度下降法?
影响小批量梯度下降法的主要因素有什么?
3. 学习率详细介绍
(1)学习率衰减是什么
(2)学习率衰减方法有什么
(3)学习率预热是什么
(4)自适应调整学习率的方法有什么
AdaGrad算法
RMSprop算法
AdaDelta算法
4. 梯度估计修正方法有什么
1)动量法
2)Nesterov加速梯度
3)Adam算法
4)梯度截断
5. 优化算法汇总与比较
6. 参数初始化的方法有什么
(1) 预训练初始化
(2) 随机初始化
常用的随机初始化方法有什么?
(3) 固定值初始化
(4)正交初始化
7. 数据归一化必要性及方法是什么
(1)为什么要进行数据预处理
(2)常用的归一化方法有什么
1)缩放归一化
2)标准归一化
3)白化
4)批量归一化
5)层归一化
6)权重归一化
8. 超参数优化
(1)常见的超参数有哪几类?
(2)超参数优化难点是什么?
(3)超参数优化方法有什么?
9. 数据增强方法有什么
(1)优化问题:神经网络模型是一个非凸函数,再加上在深度网络中的梯度 消失问题,很难进行优化;另外,深度神经网络模型一般参数比较多,训练数据也 比较大,会导致训练的效率比较低. (2)泛化问题:因为神经网络的拟合能力强,反而容易在训练集上产生过拟 合. 因此在训练深度神经网络时,同时也需要通过一定的正则化方法来改进网络 的泛化能力。
在训练深度神经网络时,训练数据的规模通常都比较大. 如果在梯度下降时, 每次迭代都要计算整个训练数据上的梯度,这就需要比较多的计算资源.
另外大 规模训练集中的数据通常会非常冗余,也没有必要在整个训练集上计算梯度. 因 此,在训练深度神经网络时,经常使用小批量梯度下降法(Mini-Batch Gradient Descent).
为了更有效地训练深度神经网络,在标准的小批量梯度下降法的基础上,也经常使用一些改进方法以加快优化速度,比如 如何选择批量大小、如何调整学习率以及如何修正梯度估计
1)批量大小
批量大小(Batch Size)对网络优化的影响也非常 大. 一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差. 批 量大小越大,随机梯度的方差越小,引入的噪声也越小,训练也越稳定,因此可以 设置较大的学习率. 而批量大小较小时,需要设置较小的学习率,否则模型会不收 敛. 学习率通常要随着批量大小的增大而相应地增大
下图为从 Epoch(回合)和 Iteration(单次更新)两个角度看,批量大小对损失下降的影响.
每一次小批量更新为一次Iteration,所有训练集的样本更新一 遍为一次Epoch,两者的关系为 1个 Epoch等于( 训练样本的数量 / 批量大小 )次Iterations.
关于图的分析:
从图a可以看出,批量大小越大,下降效果越明显,并且下降曲线越平滑.
但从图b可以看出,如果按整个数据集上的回合(Epoch)数来看,则是批量样本数越小,适当小的批量大小会导致更快的收敛.
批量大小和模型的泛化能力的也有一定的关系. 研究发现:批量大小越大,越有可能收敛到陡峭最小值;批量大小越小,越有可 能收敛到平坦最小值
2)学习率
学习率是神经网络优化时的重要超参数. 在梯度下降法中,学习率 的取值 非常关键,如果过大就不会收敛,如果过小则收敛速度太慢. 常用的学习率调整 方法包括学习率衰减、学习率预热、周期性学习率调整以及一些自适应调整学习 率的方法,比如 AdaGrad、RMSprop、AdaDelta 等. 自适应学习率方法可以针对 每个参数设置不同的学习率.
3)梯度估计.
在随机(小批量)梯度下降法中,如果每次选取样本数量比较小,损 失会呈现振荡的方式下降. 也就是说,随机梯度下降方法中每次迭代的梯度估计 和整个训练集上的最优梯度并不一致,具有一定的随机性. 一种有效地缓解梯度 估计随机性的方式是通过使用最近一段时间内的平均梯度来代替当前时刻的随 机梯度来作为参数更新的方向,从而提高优化速度.
经验上看,学习率在一开始要保持大些来保证收敛速度,在收敛到最优 点附近时要小些以避免来回振荡. 比较简单的学习率调整可以通过学习率衰 减(Learning Rate Decay)的方式来实现,也称为学习率退火(Learning Rate Annealing).
<1>分段常数衰减(Piecewise Constant Decay):
即每经过1 , 2 , ⋯ , 次迭代 将学习率衰减为原来的1 , 2 , ⋯ , 倍,其中 和 < 1为根据经验设置的超 参数. 分段常数衰减也称为阶梯衰减(Step Decay).
<2>逆时衰减(Inverse Time Decay):
其中 为衰减率
<3>指数衰减(Exponential Decay):
其中 < 1为衰减率
<4>自然指数衰减(Natural Exponential Decay):
其中 为衰减率.
<5>余弦衰减(Cosine Decay):
其中 为总的迭代次数
不同衰减方法的比较:
为了提高训练稳定性,我们可以在最初几轮迭代时,采用比较小的学习 率,等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为学习率预 热(Learning Rate Warmup).
一个常用的学习率预热方法是逐渐预热(Gradual Warmup)
假设预热的迭代次数为 ′,初始学习率为 0,在预热过程中,每次更新的学习率为
当预热过程结束,再选择一种学习率衰减方法来逐渐降低学习率.
AdaGrad(Adaptive Gradient)算法是借鉴ℓ2 正则化的 思想,每次迭代时自适应地调整每个参数的学习率. 在第 次迭代时,先计算每个 参数梯度平方的累计值
其中⊙为按元素乘积, ∈ ℝ|| 是第次迭代时的梯度
AdaGrad算法的参数更新差值为
其中是初始的学习率,是为了保持数值稳定性而设置的非常小的常数,一般取 值 −7 到 −10 .
在 AdaGrad 算法中,如果某个参数的偏导数累积比较大,其学习率相对较 小;相反,如果其偏导数累积较小,其学习率相对较大. 但整体是随着迭代次数的 增加,学习率逐渐缩小.
缺点:在经过一定次数的迭代依然没有找到最优点时,由 于这时的学习率已经非常小,很难再继续找到最优点.
RMSprop算法是 Geoff Hinton 提出的一种自适应学习率的方法 ,可以在有些情况下避免 AdaGrad 算法中学习率不断单调下降以至 于过早衰减的缺点.
RMSprop算法首先计算每次迭代梯度 平方的指数衰减移动平均,
其中 为衰减率,一般取值为0.9.
RMSprop算法的参数更新差值为
其中是初始的学习率,比如0.001.
在迭代过程中,每个参数的学习率并不是呈衰 减趋势,既可以变小也可以变大.
AdaDelta(算)法也是 AdaGrad 算法的一个改进. 和 RMSprop 算法类似,AdaDelta 算法通过梯度平方的指数衰减移动平均来调整学习 率. 此外,AdaDelta 算法还引入了每次参数更新差值 Δ 的平方的指数衰减权移 动平均
第 次迭代时,参数更新差值Δ 的平方的指数衰减权移动平均为
其中1 为衰减率. 此时Δ 还未知,因此只能计算到Δ−1.
AdaDelta算法的参数更新差值为
其中 的计算方式和RMSprop算法一样,为参数更新差值 Δ 的指数衰减权移动平均.
从上式可以看出,AdaDelta算法将 RMSprop算法中的初始学习率 改为动 态计算的,在一定程度上平抑了学习率的波动.
动量(Momentum)是模拟物理中的概念. 一般而言,一个物体的动量指的 是这个物体在它运动方向上保持运动的趋势,是物体的质量和速度的乘积. 动 量法(Momentum Method)是用之前积累动量来替代真正的梯度. 每次迭代的梯度可以看作是加速度。
一般而言,在迭代初期,梯度方向都比较一致,动量法会起到 加速作用,可以更快地到达最优点. 在迭代后期,梯度方向会不一致,在收敛值附 近振荡,动量法会起到减速作用,增加稳定性.
Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG),也叫Nesterov 动量法(Nesterov Momentum)是一种对动量法的改进
动量法和Nesterov加速梯度在参数更新时的比较如图所示
自适应动量估计(Adaptive Moment Estimation,Adam)算法 可以看作是动量法和 RMSprop 算法的结合,不但使用动量作为参 数更新方向,而且可以自适应调整学习率.
Adam 算法一方面计算梯度平方的指数加权平均(和 RMSprop 算法类 似),另一方面计算梯度g 的指数加权平均(和动量法类似)
其中1 和2 分别为两个移动平均的衰减率,通常取值为1 = 0.9, 2 = 0.99.
可以看作是梯度的均值(一阶矩), 可以看作是梯度的未减去均值的方 差(二阶矩).
Adam算法的参数更新差值为
其中学习率通常设为0.001,并且也可以进行衰减,比如
Adam 算法是 RMSProp 算法与动量法的结合,因此一种自然的 Adam 算法 的改进方法是引入Nesterov加速梯度,称为Nadam算法
在深度神经网络或循环神经网络中,除了梯度消失之外,梯度爆炸也是影响 学习效率的主要因素. 在基于梯度下降的优化过程中,如果梯度突然增大,用大 的梯度更新参数反而会导致其远离最优点. 为了避免这种情况,当梯度的模大于 一定阈值时,就对梯度进行截断,称为梯度截断(Gradient Clipping)
梯度截断是一种比较简单的启发式方法,把梯度的模限定在一个区间,当梯 度的模小于或大于这个区间时就进行截断. 一般截断的方式有以下几种:
按值截断: 在第 次迭代时,梯度为,给定一个区间[, ],如果一个参数的梯度 小于时,就将其设为;如果大于时,就将其设为.
按模截断: 按模截断是将梯度的模截断到一个给定的截断阈值.
如果,保持 不变. 如果,令
截断阈值是一个超参数,也可以根据一段时间内的平均梯度来自动调整. 实验 中发现,训练过程对阈值 并不十分敏感,通常一个小的阈值就可以得到很好的 结果
该图为再MINIST数据集上的比较(学习率为 0.001,批量大小为128).
不同的参数初始值会收敛到不同的局部最优解. 虽然这些 局部最优解在训练集上的损失比较接近,但是它们的泛化能力差异很大. 一个好的初始值会使得网络收敛到一个泛化能力高的局部最优解. 预训练初始化通常会 提升模型泛化能力的 一种解释是预训练任 务起到一定的正则化 作用. 通常情 况下,一个已经在大规模数据上训练过的模型可以提供一个好的参数初始 值,这种初始化方法称为预训练初始化(Pretrained Initialization). 预训 练任务可以为监督学习或无监督学习任务. 由于无监督学习任务更容易获 取大规模的训练数据,因此被广泛采用. 预训练模型在目标任务上的学习 过程也称为精调(Fine-tuning).
在线性模型的训练(比如感知器和 Logistic 回归)中,我们一 般将参数全部初始化为0. 但是这在神经网络的训练中会存在一些问题. 因 为如果参数都为0,在第一遍前向计算时,所有的隐层神经元的激活值都相 同. 在反向传播时,所有权重的更新也都相同. 这样会导致隐层神经元没有 区分性. 这种现象也称为对称权重现象. 为了打破这个平衡,比较好的方式是对每个参数都随机初始化(Random Initialization),这样使得不同神经 元之间的区分性更好
一种最简单的随机初始化方法是从一个固定均值(通常为 0)和方差 2 的分布中采样来生成参数的初始值主要有以下两种:
(1)高斯分布初始化:使用一个高斯分布(0, 2 )对每个参数进行随机初始 化.
(2)均匀分布初始化:在一个给定的区间[−, ]内采用均匀分布来初始化参 数. 假设随机变量在区间[, ]内均匀分布,则其方差为
因此,若使用区间为 [−, ] 的均分分布来采样,并满足 var() = 2 时,则 的取值为
在基于固定方差的随机初始化方法中,比较关键的是如何设置方差 2 . 如 果参数范围取的太小,一是会导致神经元的输出过小,经过多层之后信号就慢慢 消失了;二是还会使得 Sigmoid 型激活函数丢失非线性的能力
要高效地训练神经网络,给参数选取一个合适的随机初始化区间是非常重 要的. 一般而言,参数初始化的区间应该根据神经元的性质进行差异化的设置. 如果一个神经元的输入连接很多,它的每个输入连接上的权重就应该小一些, 以避免神经元的输出过大(当激活函数为 ReLU 时)或过饱和(当激活函数为 Sigmoid函数时).
初始化一个深度网络时,为了缓解梯度消失或爆炸问题,我们尽可能保持每 个神经元的输入和输出的方差一致,根据神经元的连接数量进行自适应的调整初 始化分布的方差,这类方法称为方差缩放(Variance Scaling)
<1>Xavier初始化: Xavier初始化激活函数适用于恒等函数、 Logistic 函数和 Tanh 函数
<2> He初始化:适用于ReLU 激活函数
对于一些特殊的参数,我们可以根据经验用一个特殊的固 定值来进行初始化. 比如偏置(Bias)通常用0来初始化,但是有时可以设 置某些经验值以提高优化效率. 在 LSTM 网络的遗忘门中,偏置通常初始 化为1或2,使得时序上的梯度变大. 对于使用ReLU的神经元,有时也可以 将偏置设为0.01,使得ReLU神经元在训练初期更容易激活,从而获得一定 的梯度来进行误差反向传播.
上面介绍的两种基于方差的初始化方法都是对权重矩阵中的每个参数进行 独立采样. 由于采样的随机性,采样出来的权重矩阵依然可能存在梯度消失或梯 度爆炸问题.
因此,一种更加直接的方式是将 () 初始化为正交矩阵,即 ()(()) T = ,这种方法称为正交初始化(Orthogonal Initialization)
正 交初始化的具体实现过程可以分为两步:首先,用均值为 0、方差为 1的高斯分布 初始化一个矩阵;其次,将这个矩阵用奇异值分解得到两个正交矩阵,并使用其中 之一作为权重矩阵.
缩放归一化是一种非常简单的归一化方法,通过缩放将每一个特征 的取值范围归一到 [0, 1] 或 [−1, 1] 之间. 假设有 个样本 对于每一维特征,
其中min()和max()分别是特征在所有样本上的最小值和最大值
标准归一化也叫 z-score 归一化,来源于统计上的标准分数. 将每一 个维特征都调整为均值为0,方差为1. 假设有 个样本,对于每一维特 征,我们先计算它的均值和方差:
然后,将特征 () 减去均值,并除以标准差,得到新的特征值
这里不能为0. 如果方差为0,说明这一维特征没有任务区分性,可以直接删掉
白化(Whitening)是一种重要的预处理方法,用来降低输入数据特征之间 的冗余性. 输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相 同的方差
白化的一个主要实现方式是使用主成分分析(Principal Component Analysis,PCA)方法去除掉各个成分之间的相关性
标准归一化和PCA白化的比较如下图所示
批量归一化(Batch Normalization,BN)方法是一种有效 的逐层归一化方法,可以对神经网络中任意的中间层进行归一化操作
对于一个深度神经网络,令第 层的净输入为 (),神经元的输出为 (),即
其中(⋅)是激活函数, 和是可学习的参数.
为了减少内部协变量偏移问题,就要使得净输入 () 的分布一致,比如都归 一化到标准正态分布. 虽然归一化操作可以应用在输入上,但其分布性质 不如 () 稳定. 因此,在实践中归一化操作一般应用在仿射变换之后,激活函数之 前.
为了提高归一化效 率,一般使用标准归一化,将净输入 () 的每一维都归一到标准正态分布.
其中 和 是指当前参数下, () 的每一维在整个训练集上的期望和 方差
批量归一化操作可以看作是一个特殊的神经层,加在每一层非线性激活函数 之前,即
其中因为批量归一化本身具有平移变换,所以仿射变换 不再需要偏置参 数.
批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量 样本的数量不能太小,否则难以计算单个神经元的统计信息. 此外,如果一个神经 元的净输入的分布在神经网络中是动态变化的,比如循环神经网络,那么就无法 应用批量归一化操作.
层归一化(Layer Normalization)是和批量归一化非常类似 的方法. 和批量归一化不同的是,层归一化是对一个中间层的所有神经元进行归 一化.
层归一化定义为
其中和 分别代表缩放和平移的参数向量,和 () 维数相同
层归一化和批量归一化整体上是十分类似的,差别在于归一化的方法不同. 对于 个样本的一个小批量集合,层归一化是对矩阵 () 的每一列进行归一化,而批量归一化是对每一行进行归一化. 一般而言,批量归 一化是一种更好的选择. 当小批量样本数量比较小时,可以选择层归一化
权重归一化(Weight Normalization)是对神经网络 的连接权重进行归一化,通过再参数化(Reparameterization)方法,将连接权重 分解为长度和方向两种参数
由于在神经网络中权重经常是共享的,权重数量往往比神经元数量要少,因 此权重归一化的开销会比较小.
1) 网络结构,包括神经元之间的连接关系、层数、每层的神经元数量、激活函 数的类型等.
2) 优化参数,包括优化方法、学习率、小批量的样本数量等.
3) 正则化系数
超参数优化(Hyperparameter Optimization)主要存在两方面的困难:
1) 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优 化,也没有一种通用有效的优化方法.
2)评估一组超参数配置(Configuration)的时间代价非常高,从而导致一些优化方法(比如演化算法(Evolution Algorithm))在超参数优化中难以应用
网格搜索(Grid Search)是一种通过尝试所有超参数的组合来寻址合适一 组超参数配置的方法. 假设总共有 个超参数,第个超参数的可以取 个值. 那么总共的配置组合数量为1 × 2 × ⋯ × . 如果超参数是连续的,可以将 超参数离散化
一般而言,对于连续的超参数,我们不能按等间隔的方式进行离散化,需要根据超 参数自身的特点进行离散化.
网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型 在开发集上的性能,选取一组性能最好的配置
不同超参数对模型性能的影响有很大差异. 有些超参数(比如正则化系数) 对模型性能的影响有限,而另一些超参数(比如学习率)对模型性能影响比较大. 在这种情况下,采用网格搜索会在不重要的超参数上进行不必要的尝试.
比较有效的改进方法是对超参数进行随机组合,然后选取一个性能最好的 配置,这就是随机搜索(Random Search)随机搜索在实 践中更容易实现,一般会比网格搜索更加有效
网格搜索和随机搜索都没有利用不同超参数组合之间的相关性,即如果模型 的超参数组合比较类似,其模型性能也是比较接近的. 因此这两种搜索方式一般 都比较低效.
贝叶斯优化(Bayesian optimization)是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合
一种比较常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBO)
时序模型优化方法如算法所示
贝叶斯优化的一个缺点是高斯过程建模需要计算协方差矩阵的逆,时间复杂 度是(3 ),因此不能很好地处理高维情况. 深度神经网络的超参数一般比较多, 为了使用贝叶斯优化来搜索神经网络的超参数,需要一些更高效的高斯过程建 模. 也有一些方法可以将时间复杂度从(3 )降低到()
动态资源分配的关键是将有限的资源分配给更有可能带来收益的超参数组 合. 一种有效方法是逐次减半(Successive Halving)方法
在数 据量有限的情况下,可以通过数据增强(Data Augmentation)来增加数据量,提 高模型鲁棒性,避免过拟合. 目前,数据增强还主要应用在图像数据上,在文本等 其他类型的数据上还没有太好的方法
图像数据的增强主要是通过算法对图像进行转变,引入噪声等方法来增加数 据的多样性. 增强的方法主要有几种:
(1) 旋转(Rotation):将图像按顺时针或逆时针方向随机旋转一定角度.
(2) 翻转(Flip):将图像沿水平或垂直方法随机翻转一定角度.
(3) 缩放(Zoom In/Out):将图像放大或缩小一定比例.
(4) 平移(Shift):将图像沿水平或垂直方法平移一定步长.
(5) 加噪声(Noise):加入随机噪声.