深度学习笔记2-神经网络优化
2.1 多分类与Softmax回归
2.1.1 Softmax回归
对于多分类问题,种类个数C,则输出层的神经元个数必须为C,每个神经元的输出依次对应为每个类别的概率。
输出层:$Z^{[L]}=W^{[L]}A^{[L-1]}+b^{[L]}$$
Softmax公式:$a_i^{[L]} = \dfrac{e^{Z_i^{[L]}}}{\sum\limits_{j=1}^{C}e^{Z_j^{[L]}}}$,满足$\sum\limits_{i=1}^{C}a_i^{[L]}=1$
理解:$e^{z_i}$的占比
2.1.2 交叉熵损失与One-hot编码
对于Softmax回归,使用交叉熵损失(Cross Entropy Loss)函数:
$$
L(\hat{y},y)=-\sum\limits_{i=1}^{C}y_i\log(\hat{y}_i)
$$
$C=2$时,即对应逻辑回归的对数损失函数$L(\hat{y},y)=-(y\log(\hat{y})+(1-y)\log(1-\hat{y}))$
one-hot编码(独热编码):将标签转换为向量,只有一个元素为1,其他元素为0。
以图2.1.1为例,$y=7$,则one-hot编码对应为$y=[0,0,0,0,0,0,0,1,0,0]$。
由于除了正确类别外,其他类别$y_i=0$,因此可以简单计算交叉熵:$L(\hat{y},y)=-1\times\log(0.10)$
这一项的预测值越接近1,交叉熵越接近0,模型效果越好
2.2 梯度下降算法改进
深度学习在大规模数据集上的训练速度很慢,难以在大数据领域发挥最大效果。
优化算法能够加速训练模型,提高计算效率。
2.2.1 梯度下降遇到的问题
梯度消失与梯度爆炸:由于链式法则是一个连乘的过程,当层数越深时,梯度以指数速度增长传播。
- 梯度消失:梯度小于1,多次连乘后,梯度趋近于0,导致参数几乎不更新、模型难收敛
- 梯度爆炸:梯度大于1,多次连乘后,梯度趋近于无穷,导致参数更新过大甚至溢出
局部最优解:损失函数可能存在鞍点/局部最小值
- 较大的神经网络,局部最优解的可能性较小
- 鞍点附近的平稳段会使得学习非常缓慢,需要优化算法加速学习
解决方法:
- 初始化参数策略:比如在1.4.4中提到的将权重初始化为较小的随机数
- 批梯度下降、Mini-batch梯度下降、随机梯度下降
- 梯度下降算法内部优化:动量梯度下降、RMSProp算法、Adam算法
- 学习率衰减
- 非算法优化:标准化输入
2.2.2 批梯度下降、Mini-batch梯度下降、随机梯度下降
批梯度下降(Batch Gradient Descent):同时处理整个训练集
- 在更新参数前,必须先处理整个训练参数集,才能进行一步梯度下降
- 如果训练集很大,计算量会很大,训练速度很慢
- 噪声低,代价函数值平滑减小
- 训练样本的大小较小(小于2048)时,选择Batch梯度下降
Mini-batch梯度下降:将训练集分为多个固定大小的批次,每次只处理一个批次的数据
- 训练样本的大小较大时,选择Mini-batch梯度下降,通常为64、128、256、512等
随机梯度下降(Stochastic Gradient Descent, SGD):mini-batch大小为1,每次只处理一个样本
- 训练速度快,但丢失了向量化编程的优势
- 代价函数值波动大,噪声大,总体向全局最小值靠近,但难以收敛,容易在鞍点震荡
2.2.3 指数加权平均
指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,通常用在序列场景,如金融序列分析、温度变化序列分析。
$$
S_t = \begin{cases}
x_t &, t=1 \\
\beta S_{t-1}+(1-\beta)x_t &, t>1
\end{cases}
$$
理解:上一结果的权重为$\beta$,当前数据的权重为$1-\beta$。
下图,黄色$\beta=0.5$,红色$\beta=0.9$,绿色$\beta=0.98$
2.2.4 动量梯度下降
动量梯度下降(Momentum Gradient Descent):利用梯度的指数加权平均来更新参数
$$
S_{dW} = \beta S_{dW}+(1-\beta)dW \\
S_{db} = \beta S_{db}+(1-\beta)db \\
W = W-\alpha S_{dW} \\
b = b-\alpha S_{db}
$$
利用累加的梯度值,减少梯度下降的震荡,加速收敛
- 前后梯度方向不一致时,梯度值减小,减少震荡
- 前后梯度方向一致时,梯度值增大,加速收敛
2.2.5 RMSProp算法
RMSProp算法(Root Mean Square Propagation):再对梯度进行指数加权平均的基础上,引入平方和平方根
$$
S_{dW} = \beta S_{dW}+(1-\beta)dW^2 \\
S_{db} = \beta S_{db}+(1-\beta)db^2 \\
W = W-\alpha \dfrac{dW}{\sqrt{S_{dW}+\epsilon}} \\
b = b-\alpha \dfrac{db}{\sqrt{S_{db}+\epsilon}}
$$
其中,$\epsilon$是一个很小的数,避免分母过小导致数值不稳定。
RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率$\alpha$,加快算法学习速度。
2.2.6 Adam算法
Adam算法(Adaptive Moment Estimation,自适应矩估计):结合了Momentum和RMSProp算法,同时考虑梯度的一阶矩估计和二阶矩估计
假设用一个mini-batch计算$dW$和$db$,第$t$次迭代时,计算动量梯度结果:
$$
V_{dW} = \beta_1 V_{dW}+(1-\beta_1)dW \\
V_{db} = \beta_1 V_{db}+(1-\beta_1)db \\
V_{dW}^{corrected} = \dfrac{V_{dW}}{1-\beta_1^t}
$$
计算RMSProp结果:
$$
S_{dW} = \beta_2 S_{dW}+(1-\beta_2)dW^2 \\
S_{db} = \beta_2 S_{db}+(1-\beta_2)db^2 \\
S_{dW}^{corrected} = \dfrac{S_{dW}}{1-\beta_2^t}
$$
计算移动平均数时,使用系数$\dfrac{1}{1-\beta_1^t}$进行修正。
例如$m_0=0,m_1=0.9m_0+0.1m_1$,导致$m_1$的值过小,修正后恰好为$m_1$的值。
随着迭代次数增加,修正系数趋近于1,保证了移动平均数的准确性。
Adam算法更新参数:
$$
W = W-\alpha \dfrac{V_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\epsilon} \\
b = b-\alpha \dfrac{V_{db}^{corrected}}{\sqrt{S_{db}^{corrected}}+\epsilon}
$$
2.2.7 学习率衰减
如果随着时间慢慢减少学习率$\alpha$的大小,在初期$\alpha$较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小$\alpha$的值,即减小步长,有助于算法的收敛,更容易接近最优解。
最常用的学习率衰减方法:$\alpha = \dfrac{1}{1+decay_ rate \times epoch_ num} \times \alpha_0$
- $\alpha_0$:初始学习率
- $decay_ rate$:衰减率,超参数
- $epoch_ num$:迭代次数
一种指数衰减学习率:$\alpha = 0.95^{epoch_ num} \times \alpha_0$
2.2.8 非算法优化:标准化输入
对于输入数据进行标准化处理,能够缓解梯度消失和梯度爆炸问题,并且加速算法的收敛。
- 标准化公式:$X = \dfrac{X-\mu}{\sigma}$,其中$\mu$为均值,$\sigma$为标准差
2.3 深度学习正则化
正则化(Regularization):在成本函数中加入一个正则化项(惩罚项),惩罚模型的复杂度,防止网络过拟合
2.3.1 数据集划分
- 训练集(Training Set):用于模型的训练过程
- 验证集(Validation Set):利用验证集(又称为简单交叉验证集,hold-out cross validation set)进行交叉验证,选择出最好的模型
- 测试集(Test Set):用于评估模型的能力
- 小数据量(小于10万)比例:无验证集7:3,有验证集6:2:2
- 大数据量比例:98:1:1、99.5:0.25:0.25
2.3.2 偏差和方差
“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。
泛化误差可分解为偏差、方差与噪声,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。
- 偏差:度量学习算法的期望预测与真实结果的偏离程度,反映了模型本身的拟合能力
- 方差:度量同样大小的训练集的变动所导致的学习性能的变化,反映了模型的稳定性
- 噪声:当前任务下任何学习算法所能达到的期望泛化误差的下界,反映了问题本身的难度
偏差、方差与数据集划分的关系及解决方法:
- 训练集错误率小、测试集错误率大:高方差,可能出现了过拟合
- 增大数据集,使训练尽可能包含所有情况
- 寻找更合适的网络结构
- 正则化
- 训练集错误率大、测试集错误率大:高偏差,可能出现了欠拟合
- 扩大网络规模,例如增加隐藏层或神经元数量
- 寻找更合适的网络结构,使用更大的网络(如AlexNet)
- 增加训练时间、迭代次数
- 训练集错误率小、测试集错误率小:方差和偏差都小,模型效果较好
2.3.3 逻辑回归的L1和L2正则化
逻辑回归中,参数$W$的数量由特征数决定,正则化如下:
- L1正则化:$J(W,b) = \dfrac{1}{m}\sum\limits_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})+\dfrac{\lambda}{2m}||W||_1$
- L2正则化:$J(W,b) = \dfrac{1}{m}\sum\limits_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})+\dfrac{\lambda}{2m}||W||_2^2$
- L2范数:$\dfrac{\lambda}{2m}||W||2^2 = \dfrac{\lambda}{2m}\sum\limits{i=1}^{n}W_i^2=\dfrac{\lambda}{2m}W^TW$
- 解释:所有W参数的平方和
正则化因子$\lambda$:超参数,控制正则化项的权重,$\lambda$越大,正则化项的影响越大,模型越简单,防止过拟合。
L1正则化后,$W$的某些参数会变为0,使模型变稀疏,因此L2正则化更常用。
梯度下降的目的是减小损失函数$J(W,b)$值的大小。
在损失函数中增加了一项,导致$dW$增大,$W$减小的更多(多减去一项),因此L2范数也称为权重衰减(Weight Decay)。
2.3.4 神经网络中的L2正则化
对每一层的权重矩阵$W^{[l]}$进行正则化,每一层都有若干个权重,可以理解为矩阵
$$
J(W^{[1]},b^{[1]},…,W^{[L]},b^{[L]}) = \dfrac{1}{m}\sum\limits_{i=1}^{m}L(\hat{y}^{(i)},y^{(i)})+\dfrac{\lambda}{2m}\sum\limits_{l=1}^{L}||W^{[l]}||_F^2
$$
其中,$||W^{[l]}||_F^2$为Frobenius范数,表示矩阵的所有元素的平方和。
正则化减小过拟合的原理:正则化因子设置的足够大的情况下,为了使损失函数最小化,权重矩阵会趋向于0,消除了一些神经元的影响,使较大的网络变得简单,减小了过拟合的风险。
2.3.5 Dropout正则化
Dropout正则化:在训练过程中,随机关闭一些神经元,减少神经元之间的依赖关系,防止过拟合。
Inverted Dropout:在训练过程中,对每一层的神经元,以概率$keep_prob$保留。
1 | keep_prob = 0.8 # 保留概率 |
加入了Droupout后,输入的特征都存在被随机清除的可能,所以该神经元不会再特别依赖于任何一个输入特征。
通过传播过程,Dropout将产生和L2正则化相同的收缩权重的效果。
对于神经元较多的层,设置较小的keep_prob,对于神经元较少的层,设置keep_prob=1。
在CV领域,图像具有更多的特征,Dropout是一种非常有效的正则化方法。
缺点:
- 因为每次会随机消除一部分神经元,成本函数无法被明确定义
- 参数无法确定具体是哪些,在反向传播的时候带来计算上的麻烦,无法保证当前网络是否损失函数下降的
2.3.6 早停止法(Early Stopping)
如果训练迭代的次数过高,会发生过拟合,损失函数图像如下:
早停止法:在测试集上的损失减少到一定程度后,停止训练,防止过拟合。
这种方法治标不治本,还是需要从根本上解决数据或模型的问题。
2.3.7 数据增强(Data Augmentation)
算法在学习区分两种类别时,可能会寻找到一个最明显的特征。
例如在区分两种不同型号的车时,如果训练集中,型号1的车都朝左,型号2的车都朝右,那么模型可能会认为车的朝向是区分两种车的最重要特征。
在测试集中,如果出现了朝右的型号1车,模型可能认为是型号2车。
因此,需要减少数据集中不相关的特征的数量。
数据增强:通过对训练集进行一系列的随机变换(如剪切、旋转、翻转、缩放等),增加训练集的样本数量,提高模型的泛化能力。
在上面的例子中,可以通过水平翻转图像,以防止模型学习到不相关的模式。
- 离线增强:预先进行所有的必要转换,从根本上增大数据集规模(如水平翻转后,保存为新的图像,数据集增大为原来的两倍)
- 在线增强:在训练过程中,对即将输入模型的小批量数据进行相应变换,同一张图每次训练被随机执行一些变化操作,相当于不同数据集
数据增强的效果如下
2.4 神经网络调优和批标准化
2.4.1 神经网络调优
算法层面:
- 学习率$\alpha$
- $\beta_1,\beta_2,\epsilon$:Adam算法的超参数,常用值$\beta_1=0.9,\beta_2=0.999,\epsilon=10^{-8}$
- 正则化参数$\lambda$
模型层面:
- hidden units:隐藏层神经元数
- layers:隐藏层层数
调参技巧
- 网格搜索:遍历所有可能的参数组合,测试每一组的效果,选择效果最好的参数组合。
- 尽量让每一组差别明显,避免重复测试
- 合理的参数设置
- 学习率$\alpha$:通常设置为0.0001、0.001、0.01、0.1等
- 指数移动参数$\beta$: 通常设置为0.999、0.9995、0.9999等,尽可能接近1(指数增加效应)
问题:调参过程麻烦、训练时间长
2.4.2 批标准化(批标准化)
论文地址:批标准化: Accelerating Deep Network Training by Reducing Internal Covariate Shift
训练深度神经网络很复杂,因为在训练期间每层输入的分布发生变化,因为前一层的参数发生了变化。
这通过要求较低的学习率和仔细的参数初始化来减慢训练速度,并且使得训练具有饱和非线性的模型变得非常困难。
我们将这种现象称为内部协变量偏移,并通过标准化层输入来解决问题。
我们的方法的优势在于使标准化成为模型体系结构的一部分,并为每个培训小批量执行标准化。
批标准化允许我们使用更高的学习率并且不太关心初始化。
它还可以充当调节器,在某些情况下可以消除对Dropout的需求。
应用于最先进的图像分类模型,批量标准化实现了相同的精度,培训步骤减少了14倍,并且显着地超过了原始模型。
使用批量标准化网络的集合,我们改进了ImageNet分类的最佳发布结果:达到4.9%的前5个验证错误(和4.8%的测试错误),超出了人类评估者的准确性。
批标准化:在神经网络的每一层的激活函数之前,对每一层的输入进行标准化处理,使得每一层的输入数据服从均值为0、方差为1的正态分布。
批标准化公式:
$$
\mu = \dfrac{1}{m}\sum\limits_{i=1}^{m}Z^{(i)} \\
\sigma^2 = \dfrac{1}{m}\sum\limits_{i=1}^{m}(Z^{(i)}-\mu)^2 \\
Z_{norm}^{(i)} = \dfrac{Z^{(i)}-\mu}{\sqrt{\sigma^2+\epsilon}}
$$
其中,$\mu$为均值,$\sigma^2$为方差,$\epsilon$为一个很小的数,避免分母为0。
如果各隐藏层的输入均值在靠近0的区域,即处于激活函数的线性区域,不利于训练非线性神经网络,从而得到效果较差的模型。
因此添加两个可学习的参数$\gamma$和$\beta$,对标准化后的数据进行缩放和平移。
$$
\tilde{Z}^{(i)} = \gamma Z_{norm}^{(i)}+\beta
$$
批标准化优化训练过程的原理:
数据的分布会随着不同数据集改变。
网络的参数会因训练集数据分布的变化而变化;测试的数据分布与训练集的数据分布不同,也会导致准确性下降。
批标准化的作用就是减小了数据分布的变化带来的影响,让模型更健壮,鲁棒性更强。
即使输入的值改变,由于批标准化的作用,均值和方差的变化会被消除,后续的学习更加容易。
批标准化减少了各层W和b之间的耦合性,让各层更加独立,实现自我训练学习的效果
批标准化也起到微弱的正则化效果,但是不能将批标准化作为正则化的手段,而是当作加速学习的方式。
批标准化 主要解决的还是反向传播过程中的梯度问题(梯度消失和爆炸)。