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

Scikit learn SkikitLearn学习曲线强烈依赖于MLP分类器的批量大小???或者:如何诊断NN的偏差/方差?,scikit-learn,neural-network,mlp,Scikit Learn,Neural Network,Mlp,我目前正在用ScikitLearn中的两个类处理一个分类问题,使用解算器adam和激活relu。为了探索我的分类器是否存在高偏差或高方差,我使用Scikitlearns内置函数绘制了学习曲线: 我使用的是一个包含8个拆分的Group-K_折叠交叉验证。 然而,我发现我的学习曲线强烈依赖于分类器的批量大小: 应该是这样吗?我认为学习曲线处理的是依赖于独立于任何批次/时期的训练数据部分的准确性分数?我是否可以将此内置函数用于批处理方法?如果是,我应该选择哪个批次大小(完整批次或批次大小=培训示例

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

我使用的是一个包含8个拆分的Group-K_折叠交叉验证。 然而,我发现我的学习曲线强烈依赖于分类器的批量大小:

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


非常感谢您的帮助

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

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

此外,当您更改批量大小时,您可能还希望更改学习速率,以便保持对过程的控制。
但事实上,拥有一个工具来找到最佳(内存和时间方面的)批处理大小是非常有趣的


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

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

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

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

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

实现可以选择对小批量的梯度求和,或者取梯度的平均值,这将进一步减少梯度的方差

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



资料来源:

也许也适用于这个例子:我的诊断是什么?对我来说,这看起来像是高偏差,因为训练和交叉验证分数都很低。然而,看看batchsize的200,看起来好像我会选择batchsize=训练示例的数量,训练分数会很高,而且看起来会过拟合。我理解minibatch的另一个问题是:在处理一个批次后更新权重是否正确?然而,为什么每次培训后学习曲线都会发生变化?我这边似乎有一个误解,希望任何人都能澄清这一点,我想我刚刚得到了它:在每批模型更新之后。然而,学习曲线评估每个训练示例的模型。在最后一批的最后一次更新范围内,培训示例越多,培训分数越高。然而,学习曲线对于整个批次来说是无用的,因为我的学习曲线中永远不会有更新?这是正确的吗?而且学习曲线对神经网络有用吗,因为你要在几个时期内进行训练?您如何评估NN模型?尤其是在学习方面?