其他
掌握这些步骤,机器学习模型问题药到病除
以下文章来源于AI公园 ,作者ronghuaiyang
作者 | Cecelia Shao
编译 | ronghuaiyang
来源 | AI公园(ID:AI_Paradise)
【导读】这篇文章提供了切实可行的步骤来识别和修复机器学习模型的训练、泛化和优化问题。
众所周知,调试机器学习代码非常困难。即使对于简单的前馈神经网络也是这样,你经常会在网络体系结构做出一些决定,重初始化和网络优化——所有这些会都导致在你的机器学习代码中出现bug。
正如Chase Roberts在一篇关于“How to unit test machine learning code”的优秀文章中所写的,他遇到的麻烦来自于常见的陷阱:
代码不会崩溃,不会引发异常,甚至不会变慢。 训练网络仍在运行,损失仍将下降。 几个小时后,数值收敛了,但结果很差
从最简单的开始 确认你的损失 检查中间输出和连接 对参数进行诊断 跟踪你的工作
1. 从最简单的开始
首先建立一个更简单的模型 在单个数据点上训练模型
首先,构建一个更简单的模型
在单个数据点上训练模型
2. 确认你的损失
损失适合于任务(对于多分类问题使用类别交叉熵损失或使用focal loss来解决类不平衡) 你的损失函数在以正确的尺度进行测量。如果你的网络中使用了不止一种类型的损失,例如MSE、adversarial、L1、feature loss,那么请确保所有损失都按正确的顺序进行了缩放
在随机表现上寻找正确的损失。确保在初始化小参数时得到预期的损失。最好先单独检查数据的loss(将正则化强度设置为零)。例如,对于使用Softmax分类器的CIFAR-10,我们期望初始损失为2.302,因为我们期望每个类的随机概率为0.1(因为有10个类),而Softmax损失是正确类的负对数概率,因此:-ln(0.1) = 2.302。
3. 检查内部的输出和连接
梯度更新的表达式不正确 权重更新没有应用 梯度消失或爆炸
初步方法 - 向我们展示训练模型整体结构的简单方法。这些方法包括打印出神经网络各层的形状或滤波器以及各层的参数。 基于激活的方法 - 在这些方法中,我们解码单个神经元或一组神经元的激活情况,以直观地了解它们在做什么 基于梯度的方法 - 这些方法倾向于在训练模型时操作由前向和后向传递形成的梯度(包括显著性映射和类激活映射)。
4. 参数诊断
Batch size - 你希望batch size足够大,能够准确地估计错误梯度,但又足够小,以便小批随机梯度下降(SGD)能够使你的网络归一化。小的batch size将导致学习过程以训练过程中的噪声为代价快速收敛,并可能导致优化困难。论文On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima描述了:
在实践中已经观察到,当使用一个较大的batch size时,模型的质量会下降,这可以通过它的泛化能力来衡量。我们研究了在大批量情况下泛化下降的原因,并给出了支持large-batch方法趋向于收敛于训练和测试函数的sharp的极小值这一观点的数值证据——众所周知,sharp的极小值导致较差的泛化。相比之下,小batch size的方法始终收敛于平坦的最小值,我们的实验支持一个普遍的观点,即这是由于梯度估计中的固有噪声造成的。
学习速率 - 学习率过低将导致收敛速度慢或陷入局部最小值的风险,而学习速率过大导致优化分歧,因为你有跳过损失函数的更深但是更窄部分的风险。考虑将学习率策略也纳入其中,以随着训练的进展降低学习率。CS231n课程有一大部分是关于实现退火学习率的不同技术。
梯度裁剪 - 在反向传播期间的通过最大值或最大范数对梯度进行裁剪。对于处理可能在上面的步骤3中遇到的任何梯度爆炸非常有用。 Batch normalization - Batch normalization用于对每一层的输入进行归一化,以解决内部协变量移位问题。如果你同时使用Dropout和Batch Norm,请确保在Dropout上阅读下面的要点。
本文来自Dishank Bansal的”TensorFlow中batch norm的陷阱和训练网络的健康检查“,里面包括了很多使用batch norm的常见错误。
随机梯度下降(SGD) - 有几种使用动量,自适应学习率的SGD,和Nesterov相比并没有训练和泛化性能上的优胜者。一个推荐的起点是Adam或使用Nesterov动量的纯SGD。 正则化 - 正则化对于构建可泛化模型至关重要,因为它增加了模型复杂度或极端参数值的代价。它显著降低了模型的方差,而没有显著增加其偏差。如CS231n课程所述:
通常情况下,损失函数是数据损失和正则化损失的总和(例如L2对权重的惩罚)。需要注意的一个危险是正则化损失可能会超过数据损失,在这种情况下,梯度将主要来自正则化项(它通常有一个简单得多的梯度表达式)。这可能会掩盖数据损失的梯度的不正确实现。
Dropout - Dropout是另一种正则化你的网络,防止过拟合的技术。在训练过程中,只有保持神经元以一定的概率p(超参数)活动,否则将其设置为零。因此,网络必须在每个训练批中使用不同的参数子集,这减少了特定参数的变化成为主导。 这里需要注意的是:如果您同时使用dropout和批处理规范化(batch norm),那么要注意这些操作的顺序,甚至要同时使用它们。这仍然是一个活跃的研究领域,但你可以看到最新的讨论:
来自Stackoverflow的用户MiloMinderBinder:Dropout是为了完全阻断某些神经元的信息,以确保神经元不相互适应。因此,batch norm必须在dropout之后进行,否则你将通过标准化统计之后的数据传递信息。” 来自arXiv:Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift — 从理论上讲,我们发现,当我们将网络状态从训练状态转移到测试状态时,Dropout会改变特定神经单元的方差。但是BN在测试阶段会保持其统计方差,这是在整个学习过程中积累的。当在BN之前的使用Dropout时,该方差的不一致性(我们将此方案命名为“方差漂移”)导致不稳定的推断数值行为,最终导致更多的错误预测。
5. 跟踪你的网络
快速回顾
从简单的开始 — 先建立一个更简单的模型,然后通过对几个数据点的训练进行测试
确认您的损失 — 检查是否使用正确的损失,并检查初始损失
检查中间输出和连接 — 使用梯度检查和可视化检查看图层是否正确连接,以及梯度是否如预期的那样更新
诊断参数 — 从SGD到学习率,确定正确的组合(或找出错误的)😅 跟踪您的工作 — 作为基线,跟踪你的实验过程和关键的建模组件
◆
精彩推荐
◆
推荐阅读
我所理解的零次学习
华为全球最快AI训练集群Atlas 900诞生
还怕电脑被偷吗?我用Python偷偷写一个自动木马程序
用Python进行金融市场文本数据的情感计算
前端也能玩转机器学习?Google Brain 工程师来支招!
6大思维模型, 揭秘硅谷高管如何做区块链应用决策
走出腾讯和阿里,大厂员工转型记
你点的每个“在看”,我都认真当成了喜欢“