模型是否从小批量中所有数据点的平均值中学习?

人工智能 深度学习 训练 Python 张量流
2021-11-15 07:38:23

我使用了https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/5_DataManagement/tensorflow_dataset_api.py上的示例来创建我自己的分类模型。我使用了不同的数据,但使用了数据集的基本轮廓。

对于我的数据类型来说,打乱数据然后创建训练和测试集非常重要。然而,问题来自于洗牌。

当我使用 shuffled 训练集训练模型时,训练集的准确度为 +- 80%,测试集的准确度为 +- 70%。然后,我想将所有数据(即构成训练集和测试集的数据集)输入到模型中,以查看我拥有的该数据集的完全预测输出。

如果这个数据集作为训练集和测试集被打乱,我得到了大约 77% 的准确率,这符合预期,但是,如果我输入未打乱的数据(因为我需要查看预测),我得到 45%准确性。这怎么可能?

我认为这是由于模型学习不正确,并且它了解到数据点的顺序在这些数据点的预测中起作用。但这不应该发生,因为我只是试图(如 MNIST 示例)分别预测每个数据点。这可能是一个小批量训练问题。

在上面提到的示例中,使用数据集和批次进行训练,模型是从 mini-batch 中所有数据点的平均值中学习,还是认为一个 mini-batch 是一个数据点并以这种方式学习(即将意味着数据的顺序问题)?

或者如果有其他建议。

3个回答

如果我输入未打乱的数据(因为我需要查看预测),我会得到 45% 的准确率。这怎么可能?

当您构建数据集并将其拆分为训练集、测试集和验证集时,您必须确保训练包含测试集或验证集等方面。这就是为什么洗牌数据很重要。在您没有对数据集进行洗牌的情况下,您的 NN 会遇到它以前从未见过的对象(即在训练集中),然后无法对其进行正确分类。

模型是从 mini-batch 中所有数据点的平均值中学习,还是认为一个 mini-batch 是一个数据点并以这种方式学习(这意味着数据的顺序问题)?

使用小批量时,您可以决定小批量的大小 ( b_size) 和小批量的数量 ( n_batch)。然后,有时您将从和数组中n_batch绘制b_size随机索引,使用这些索引和进行构建,并在后面的 2 个数组上调整模型参数(并多次执行)。X_trainy_trainX_batchy_batchn_batch

因此,对数据集进行洗牌并随机抽取数据集的一部分来训练模型可确保您摆脱数据集两点之间的相关性并更好地泛化

问题中的示例使用了相对简单的卷积神经网络。这些不是有状态的,因此查询来自测试集的实例的预测的顺序应该不会影响这些预测。

在问题作者就他们自己的问题写的评论中,提到使用批量标准化似乎已被确认是问题的原因。鉴于此信息,问题中描述的问题的一个可能原因是错误使用了trainingTensorFlow 批量标准化实现的标志。官方文档包含有关此标志的以下信息

training: Python 布尔值或 TensorFlow 布尔标量张量(例如占位符)。是在训练模式(使用当前批次的统计数据归一化)还是在推理模式(使用移动统计数据归一化)返回输出。注意:确保正确设置此参数,否则您的训练/推理将无法正常工作。

如果这被错误地设置为True而不是False在训练阶段之外(即在评估性能时),预测可能会很差。仅此一项并不能解释为什么测试数据的顺序特别重要,如果仅此一项是问题,那么无论顺序如何,我们都希望测试性能很差。

另一种可能的解释是,代码中存在错误,仍然导致批量标准化moving_meanmoving_variance操作在测试/评估期间被更新。如上面链接的文档中所述,这些仅应在培训阶段进行更新。如果它们在测试阶段仍然在更新,并且如果在测试集的未打乱排序中存在有意义的结构(即按类排序的未打乱测试集,或者根据某些特征排序等),那么我们会期望正是问题中描述的问题才会发生

问题陈述

这些是跑步的特点。

  • 使用两个 2D 卷积和关联最大池化的 CNN 类预测
  • 小批量执行方法
  • 使用固定的洗牌过程

这些是结果。

  • 改组获得了 80%/70% 的训练/测试准确度
  • 整套改组获得 77% 的准确率
  • 整套无改组获得 45% 的准确度

列出的原因

这些是问题中列出的明显异常的潜在原因。

  • 模型学习不正确
  • 了解到数据点的顺序在它们的预测中起作用
  • 由于 mini-batching,数据点没有单独预测

未列出的其他因果可能性

请注意,这两种额外的可能性都与随机性模拟的不足有关,就像密码协议中的情况一样。

  • CNN 学习改组系统或它的某些方面,因此当改组被移除时,训练不再适用于输入模式
  • 训练和测试样本的抽取方式不够随机

附加问题

模型是否从小批量中所有数据点的平均值中学习?- 是的。

它认为一个小批量是一个数据点吗?— 不。它不会思考,并且循环不会在传播之前对数据点进行平均。Mini-batch 在将校正信号反向传播到参数张量之前简单地聚合结果。

顺序重要吗?—顺序在无状态系统中无关紧要,但如果在离散事件之间记住状态,则通常会如此。小批量需要平均,这需要有状态来累积加数。但这不是可能的原因。如何从样本中选择批次是影响准确性的一个更可能的因素。

理解原则

人工网络的收敛一般是基于训练场景的统计特征与使用场景的统计特征相匹配的。换句话说,要使用 PAC(可能近似正确)框架术语,从总人口中抽取训练样本的方式必须与从总人口中抽取验证样本的方式相同。因此,如果训练样本没有从总人口中抽取足够的随机性,则无法保证收敛。

需要考虑的问题

  • 我如何决定洗牌中的个别操作?
  • 我如何绘制火车和测试样本?
  • 我如何决定哪些样品在哪批中?
  • 数据示例中的自然顺序是什么,它真的是一个序列而不是一个集合吗?
  • 如果是一个序列,那么是一个经典的 CNN,不是开箱即用的设计来处理时间序列,正确的网络设计可以应用吗?

回答这些问题并获得对该方法的概率和统计方面的全面概念理解应该在考虑标准化之前发生,这可能会意外地解决您的问题,但不能成为异常的根本原因。