SkikitLearn 学习曲线强烈依赖于 MLPClassifier 的批量大小???或者:如何诊断 NN 的偏差/方差?

Posted

技术标签:

【中文标题】SkikitLearn 学习曲线强烈依赖于 MLPClassifier 的批量大小???或者:如何诊断 NN 的偏差/方差?【英文标题】:SkikitLearn learning curve strongly dependent on batch size of MLPClassifier ??? Or: how to diagnose bias/ variance for NN? 【发布时间】:2019-08-16 13:24:48 【问题描述】:

我目前正在使用求解器 adam 和激活 relu 在 ScikitLearn 中处理两个类的分类问题。为了探索我的分类器是否存在高偏差或高方差,我使用 Scikitlearns 内置函数绘制了学习曲线:

https://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html

我正在使用具有 8 个拆分的 Group-K_Fold 交叉验证。 但是,我发现我的学习曲线很大程度上取决于分类器的批量大小:

https://imgur.com/a/FOaWKN1

应该是这样的吗?我认为学习曲线正在解决依赖于训练数据部分的准确性分数,独立于任何批次/时期?我真的可以将此内置函数用于批处理方法吗?如果是,我应该选择哪个批次大小(全批次或批次大小=训练示例的数量或介于两者之间)以及我从中得到什么诊断?或者您通常如何诊断神经网络分类器的偏差/方差问题?

非常感谢您的帮助!

【问题讨论】:

也许也适用于这个例子:我的诊断是什么?对我来说,这看起来像是高偏差,因为训练和交叉验证分数很低。但是,看看 200 的批大小,看起来好像我会采用批大小 = 训练示例数,训练分数会很高,而且看起来会过拟合。 【参考方案1】:

是的,学习曲线取决于批量大小。

最佳批量大小取决于数据类型和数据总量。 在理想情况下,批量大小为 1 是最好的,但在实践中,对于大量数据,这种方法是不可行的。 我认为您必须通过实验来做到这一点,因为您无法轻易计算出最佳值。

此外,当您更改批量大小时,您可能还想更改学习率,以便保持对过程的控制。 但确实有一个工具可以找到最佳(内存和时间)批量大小。


什么是随机梯度下降?

随机梯度下降,通常缩写为 SGD,是梯度下降算法的一种变体,它计算误差并为训练数据集中的每个示例更新模型。

每个训练样例的模型更新意味着随机梯度下降通常被称为在线机器学习算法。

什么是批量梯度下降?

批量梯度下降是梯度下降算法的一种变体,它计算训练数据集中每个示例的误差,但仅在评估所有训练示例后才更新模型。

整个训练数据集的一个周期称为一个训练时期。因此,人们常说批量梯度下降在每个训练 epoch 结束时进行模型更新。

什么是小批量梯度下降?

小批量梯度下降是梯度下降算法的一种变体,它将训练数据集分成小批量,用于计算模型误差和更新模型系数。

实现可以选择对 mini-batch 上的梯度求和或取梯度的平均值,这进一步降低了梯度的方差。

小批量梯度下降寻求在随机梯度下降的鲁棒性和批量梯度下降的效率之间找到平衡。它是深度学习领域最常用的梯度下降实现。


来源:https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

【讨论】:

我对小批量理解的另一个问题:处理一批后更新权重是否正确?但是,为什么在每个训练示例之后学习曲线都会发生变化?我这边好像有什么误解,希望大家能澄清一下 我想我刚刚明白了:每批后模型都会更新。但是,学习曲线会评估每个训练示例的模型。在最后一批的最后更新范围内,训练示例越多,训练得分越高。但是,那么学习曲线对于整批是没有用的,因为我的学习曲线永远不会更新?这是正确的吗? 学习曲线对神经网络有用吗,因为您无论如何都要训练几个时期?您如何评估 NN 模型?尤其是在 ScikitLearn 中?

以上是关于SkikitLearn 学习曲线强烈依赖于 MLPClassifier 的批量大小???或者:如何诊断 NN 的偏差/方差?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中绘制 MLP 模型的训练损失和准确度曲线?

sklearn MLP(多层感知机Multi-layer Perceptron)模型使用RandomSearchCV获取最优参数及可视化

动手学深度学习 3-3 Mlp

MLP 神经网络未正确训练,可能收敛到局部最小值

车牌识别系统原理与代码「YOLO+MLP」

JAVA学习曲线存技术讨论