一站式入门深度学习调参,深度学习模型面临的挑战与24种优化策略详解



1. 深度学习模型面临的挑战

1.1 神经网络学习映射功能

深度学习神经网络学习映射功能。开发模型需要历史数据作为训练数据。该数据由观察值或样本组成,输入元素描述了条件,输出元素捕获了样本特征。通常将输出为数量的问题描述为回归预测建模问题;而将输出作为标签的问题通常描述为分类预测建模问题。

神经网络模型使用这些样本来学习如何将特定的输入变量集映射到输出变量。它必须以这种映射规则对训练数据集进行表示,同时也可以对新的数据进行很好的表示。这种在特定样本和新样本上良好的能力称为模型的泛化能力。

多层感知器实际上是将输入值映射到输出值的数学函数。可以将输入变量和输出变量之间的关系描述为一个复杂的数学函数。对于给定的模型,存在一个真实的映射函数可以将输入变量最佳地映射到输出变量,并学习了实现最佳函数逼近的参数值。因此,可以将神经网络解决的更广泛的问题描述为函数逼近(function approximation)。它们从给定训练数据集中,学习近似且未知的基础映射函数。在给定的特定网络结构的前提下,它们通过学习权重和模型参数来做到这一点。


1.2 学习网络权重很困难

通常,很难找到神经网络的参数。对于许多更简单的机器学习算法,可以根据训练数据集计算最佳模型。例如,可以使用线性代数来计算线性回归模型的特定系数,以最大程度地减小平方误差的训练数据集。同样,当为非线性算法(例如逻辑回归或支持向量机)找到最佳的模型参数集时,可以使用有收敛保证的优化算法。为许多机器学习算法寻找参数涉及解决凸优化问题(convex optimization problem):形状像碗一样的误差面,只有一个最佳解。

深度学习神经网络不是这种情况。既不能直接计算模型的最佳权重集合,也无法获得全局收敛性保证来找到最佳权重集合。应用于非凸损失函数的随机梯度下降没有收敛保证,并且对初始参数的值敏感。

在神经网络中使用非线性激活函数意味着,为了找到模型参数而必须解决的优化问题是非凸的(Non-Convex)。解决此优化问题颇具挑战性,尤其是因为误差面包含许多局部最优解(local optima),平坦点(flat spots)和断点(cliffs)。必须使用迭代过程来求解模型的非凸误差面。


1.3 求解非凸误差面

在训练数据集上评估具有一组特定权重的模型,并将所有训练数据集的平均误差视为模型的误差。更改模型权重会更改模型误差,通过最小化误差来找到最佳的权重组合。这是一个搜索或优化过程,以这种方式运行的优化算法称为梯度优化算法,最常用于求解误差表面的算法称为随机梯度下降法(SGD)。可以使用为非凸优化问题设计的其他全局优化算法,例如遗传算法(genetic algorithm),但是SGD效率更高,因为它使用反向传播算法来更新模型权重。反向传播是指从微积分中计算出特定模型参数的模型误差的导数(例如,斜率或梯度)的方法,使得模型权重沿梯度下降的方向更新。


1.4 学习算法的构成

使用反向传播的随机梯度下降训练深度学习神经网络模型涉及选择许多组件和超参数。

1.4.1 损失函数

首先,必须为神经网络选择一个误差函数(error function),通常称为目标函数(objective/target function),成本函数(cost function)或损失函数(loss function)。通常,选择一个特定的概率推理框架,称为最大似然(Maximum Likelihood)。在这种框架下,通常选择的损失函数是分类问题的交叉熵(cross entropy)和回归问题的均方误差(mean squared error)

损失函数用于根据训练数据集中的样本对一组特定的权重来评估模型的性能。


1.4.2 权重初始化

搜索或优化过程需要一个起点来开始更新模型。起点由初始模型参数或权重定义。因为误差表面是非凸的,所以优化算法对初始起点很敏感。这样,尽管可以使用不同的技术来选择这些值的比例和分布,但是选择小的随机值作为初始模型权重。这些技术称为权重初始化(Weight Initialization)

权重初始化是在训练开始时,将初始小的随机值分配给模型权重的过程。


1.4.3 批次大小

更新模型时,必须使用训练数据集中的许多示例来计算模型误差,通常简称为损失(loss)。可以使用训练数据集中的所有样本,这可能适用于较小的数据集。或者使用单个样本,该方法适用于流式传输(streamed)样本或数据经常更改的问题。常用方法为指定训练数据集中的样本数量,用于估计误差梯度,实例数量的选择称为批次大小(Batch Size)。

批次大小是在更新模型参数之前用于估计误差梯度的样本数。


1.4.4 学习率

估计出误差梯度后,就可以计算出误差的导数,并将其用于更新每个参数。训练数据集中和误差梯度的估计值中可能存在统计噪声。同样,模型的深度(层数)和模型参数分别更新意味着很难准确地计算出改变每个模型参数的程度,以使整个模型在误差梯度沿下降最快的方向移动。实际上,每次迭代都会执行一小部分权重更新,控制更新模型权重量的超参数称为学习率(Learning Rate),进而控制模型在训练数据集上学习的速度。

学习率是每个训练周期内,学习算法更新每个模型参数的数量。


1.4.5 训练周期

训练过程必须重复很多次,直到找出一组良好或足够好的模型参数为止。训练周期(epoch)表示在训练过程终止之前,让模型遍历训练数据集的次数。


2. 深度学习模型优化策略

2.1 更好的学习技术

2.1.1 批次大小(Batch Size)

使用不同的的批次大小和不同的优化方法进行试验。
可以参考:【如何设置合适的Batch Size提高模型训练的稳定性

2.1.2 学习率(Learning Rate)

对比分析不同学习率对建模问题的影响,以及自适应学习率方法(例如Adam)是否合适。
可以参考:【如何配置神经网络的学习率

2.1.3 损失函数(Loss Function)

针对不同的问题选择不同的损失函数。
可以参考:【如何为神经网络选择损失函数

2.1.4 数据缩放(Data Scaling)

数据缩放包括归一化和标准化数据。
可以参考:【如何对数据进行标准化(standardization)和归一化(normalization)

2.1.5 批归一化(Batch Normalization)

批归一化层的设置。
可以参考:【如何使用Batch Normalization提高模型性能

2.1.6 梯度消失(Gradient Vanishing)

梯度消失(梯度弥散)是指训练深度多层网络时,靠近输入层的各层的权重不更新;避免梯度消失可以使用ReLU激活函数解决。
可以参考:【ReLU激活函数使用指南

2.1.7 梯度爆炸(Gradient Exploding)

梯度爆炸是指较大的权重更新会导致数值上溢或下溢,从而使网络权重为NaN或Inf值;可以使用梯度裁剪解决。
可以参考:【如何使用梯度裁剪(Gradient Clipping)避免梯度爆炸

2.1.8 贪婪逐层预训练(Greedy Layer-Wise Pretraining)

可以参考:【如何使用贪婪逐层预训练分析不同层数对深度神经网络的影响

2.1.9 迁移学习(Transfer Learning)

可以参考:【如何通过迁移学习(Transfer Learning)提高深度神经网络的性能

2.1.10 分类权重(Class Weight)

对于不平衡分类问题,可以设置分类权重提高模型性能。
可以参考:【不平衡分类问题中分类权重计算与设置


2.2 更好的泛化技术

更好的泛化技术是指更改神经网络模型或学习算法以减少模型过拟合,改善模型在验证或测试数据集上的性能的技术。

2.2.1 权重正则化(Weight Regularization)

损失函数的变化与模型权重的范数大小成比例地惩罚模型,鼓励使用较小的权重,进而降低模型的复杂度。
可以参考:【如何使用L1和L2正则化降低过拟合风险

2.2.2 权重约束(Weight Constraint)

权重的向量范数超过阈值时,更新模型以重新缩放权重。
可以参考:【如何通过权重约束减少过拟合

2.2.3 激活正则化(Activity Regularization)

损失函数的变化使模型与层激活的范数大小成比例地受到惩罚,从而鼓励使用更小或更稀疏的内部表示形式。
可以参考:【如何通过激活正则化减少泛化误差

2.2.4 添加噪声输入(Input Noise)

在输入层或隐藏层之间添加统计变化或噪声,以减少模型对特定输入值的依赖,降低过拟合风险。
可以参考:【如何通过添加高斯噪声降低过拟合风险

2.2.5 Dropout 正则化 (Dropout Regularization)

Dropout通过随即删除隐藏层神经元的连接,达到稀疏神经网络的目的。
可以参考:【如何使用Dropout正则化降低过拟合风险

2.2.6 设置及时停止回调(Early Stopping)

在训练过程中监视验证数据集上的指标(比如验证损失、验证准确率),当监视的验证集上的指标开始下降时,停止训练,避免过拟合。
可以参考:【如何通过设置及时停止避免过拟合


2.3 更好的预测技术

更好的预测技术是对模型训练过程的补充,以减少最终模型的预期性能差异。

最终模型的性能差异可以通过增加偏差来减小。将偏差引入最终模型的最常见方法是组合来自多个模型的预测,这称为集成学习。集成学习不仅可以减少最终模型的性能差异,而且还可以带来更好的预测性能。

2.3.1 重采样集成(Resampling Ensemble)

集成模型中的各子模型通过数据集的一个子集训练得到。

2.3.2 模型平均集成(Model Averaging Ensemble)

改变集成子模型的最简单方法可能是从训练数据集上多次运行学习算法收集子模型。
可以参考:【如何通过组合多个神经网络提高模型性能

2.3.3 水平集成(Horizontal Ensemble)

在一次训练即将结束时,从连续的训练周期集成各子模型。

2.3.4 Snapshot 集成(Snapshot Ensemble)

使用周期性学习率进行训练,并在每个学习率周期的最小值处集成各个子模型。

2.3.5 加权平均集成 (Weighted Average Ensemble/Blending)

使用表示各个模型中信任度的学习系数对每个子模型对集成模型预测的贡献进行加权。

2.3.6 堆叠泛化(Stacked Generalization/Stacking)

训练一个新模型,以学习如何最佳地结合各个子模型的预测。

2.3.7 平均模型权重集成(Average Model Weight Ensemble)

来自多个神经网络模型的权重被平均到用于做出预测的单个模型中。


2.4 网格搜索超参数

可以参考:【如何使用网格搜索寻找最佳超参数配置


参考:
https://machinelearningmastery.com/a-gentle-introduction-to-the-challenge-of-training-deep-learning-neural-network-models/
https://machinelearningmastery.com/framework-for-better-deep-learning/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章