没有传递给损失函数的点会影响它吗?

数据挖掘 机器学习 喀拉斯 训练 损失函数
2022-02-15 05:01:09

如果我要构建一个模型,其中只有一部分训练数据被传递给损失函数,数据集的其他部分会影响拟合吗?

更具体地说,在第一个示例中:

model.fit(x_train_subset, y_train_subset, val=[x_val, y_val])

在这里,我传递模型,然后传递损失函数,只传递要训练的子集。

在另一个例子中:

model.compile(loss=CustomLoss) #this loss will be based on x_train_subset
model.fit(x_train, y_train, val=[x_val, y_val])

在这里,我已将整个训练集传递给拟合,但仅使用其中的一个子集来查找损失。

我的问题是:

  1. 从概念上讲,这些是一样的吗?
  2. 如果一个点没有被传递给损失函数,它对模型训练过程是否有效?
2个回答

1.从技术上讲,它们是相同的。它们将计算相同的损失。虽然性能上会有细微差别。在第一种情况下,仅计算子集的梯度​​,而在第二种情况下,将计算整个训练集的梯度,但仅使用子集的梯度​​来计算成本和更新。

2.不,积分对训练过程是不可见的。将为所有点计算梯度,但不会使用它们。

在您给出的简单示例中,结果应该相似。不一样,因为默认的 Keras 批量大小是 32,而在第一个公式中这意味着 32 个可用的训练示例,在第二个公式中,模型只能从您允许损失函数看到的 32 个百分比中受益。

我更喜欢显式传递训练数据子集的第一个选项,因为

  • 经过训练但不是通过反向传播(例如批量归一化)的层仍将看到并使用整组训练数据
  • 您将可以更好地控制批量大小等内容,因为在每个训练步骤中传递了多少训练示例会更清楚
  • 如果您明确说明正在使用哪些训练数据,您的代码将更易于阅读