CNN 上的快速损失收敛表示什么?
What fast loss convergence indicates on a CNN?
我正在两个不同的 DL 库(Caffe 和 Tensorflow)中训练两个 CNN(AlexNet 和 GoogLeNet)。这些网络由每个图书馆的开发团队实施 (here and here)
我将原始 Imagenet 数据集减少到 1024 个类别的图像 -- 但设置了 1000 个类别在网络上进行分类。
所以我训练了 CNN,改变了处理单元 (CPU/GPU) 和批次大小,我观察到损失快速收敛到接近零(大部分时间在 1 个 epoch 完成之前),就像这样图(Tensorflow 上的 Alexnet):
在葡萄牙语中,'Épocas' 是时代,'Perda' 是损失。键中的数字表示批量大小。
权重衰减和初始学习率与我下载的模型使用的相同,我只更改了数据集和批量大小。
为什么我的网络以这种方式收敛,而不是像 this way?
损失函数的噪声比平常小,并且由于某些原因不会振荡。
主要是因为你只有 1 个类别,所以(为了简化一点)网络在每一步都很容易改进,只需提高你所有输入的那个类别的分数。
看看下面的(漂亮!)图片:如果你有几个 classes,一个样本的好步骤对另一个样本来说通常是坏的(因为它们有不同的类别),这就是为什么有时局部损失会增加的原因。对类别 1 的样本进行的网络更新对于类别 2 的所有样本来说都是一个错误的步骤,相反,但是两种类型更新的总和朝着正确的方向发展(它们补偿了它们的坏部分,只有有用的部分步骤保持不变)。如果您有 1 个 class,您将直接快速地“始终预测类别 1”,而对于 2 个或更多类别,您将曲折缓慢地收敛到“始终预测正确”。
还有其他一些影响,例如您的数据集相对较小(因此更容易学习),您不经常测试,也许您进行了一些平滑处理(您的损失是根据整个数据集还是一个批次?通常是一个批次,它参与了通常的损失函数图)。
曲线之间的差异也是正常的,但仍然是数据集中实际只存在 1 class 这一事实的特征。首先注意 CPU 和 GPU 具有相同的行为,因为它们做完全相同的事情,只是速度不同。当您的批量大小 >1 时,网络中完成的更新是您单独使用样本完成的所有更新的平均值(再次简化一点)。所以通常你会得到更智能的更新(更有可能朝着“始终正确预测”的方向发展),所以你需要更少的更新来达到良好的性能。在这种更快的收敛和更大的批次每次更新使用更多数据这一事实之间存在权衡,因此很难事先说哪条曲线应该收敛得更快。人们普遍认为您应该使用大小 > 1 的小批量(但也不要太大)。现在当你只有 1 class 实际出现在数据集中时,所有更新大致在同一个方向“总是预测 1”,所以 minibatch 平均值基本相同,但消耗更多数据以获得大致相同的更新.由于您仍然需要相同数量的这些更新,您将在相同数量的步骤后收敛,因此您将消耗更多数据以获得相同的结果。
我正在两个不同的 DL 库(Caffe 和 Tensorflow)中训练两个 CNN(AlexNet 和 GoogLeNet)。这些网络由每个图书馆的开发团队实施 (here and here)
我将原始 Imagenet 数据集减少到 1024 个类别的图像 -- 但设置了 1000 个类别在网络上进行分类。
所以我训练了 CNN,改变了处理单元 (CPU/GPU) 和批次大小,我观察到损失快速收敛到接近零(大部分时间在 1 个 epoch 完成之前),就像这样图(Tensorflow 上的 Alexnet):
在葡萄牙语中,'Épocas' 是时代,'Perda' 是损失。键中的数字表示批量大小。
权重衰减和初始学习率与我下载的模型使用的相同,我只更改了数据集和批量大小。
为什么我的网络以这种方式收敛,而不是像 this way?
损失函数的噪声比平常小,并且由于某些原因不会振荡。
主要是因为你只有 1 个类别,所以(为了简化一点)网络在每一步都很容易改进,只需提高你所有输入的那个类别的分数。
看看下面的(漂亮!)图片:如果你有几个 classes,一个样本的好步骤对另一个样本来说通常是坏的(因为它们有不同的类别),这就是为什么有时局部损失会增加的原因。对类别 1 的样本进行的网络更新对于类别 2 的所有样本来说都是一个错误的步骤,相反,但是两种类型更新的总和朝着正确的方向发展(它们补偿了它们的坏部分,只有有用的部分步骤保持不变)。如果您有 1 个 class,您将直接快速地“始终预测类别 1”,而对于 2 个或更多类别,您将曲折缓慢地收敛到“始终预测正确”。
还有其他一些影响,例如您的数据集相对较小(因此更容易学习),您不经常测试,也许您进行了一些平滑处理(您的损失是根据整个数据集还是一个批次?通常是一个批次,它参与了通常的损失函数图)。
曲线之间的差异也是正常的,但仍然是数据集中实际只存在 1 class 这一事实的特征。首先注意 CPU 和 GPU 具有相同的行为,因为它们做完全相同的事情,只是速度不同。当您的批量大小 >1 时,网络中完成的更新是您单独使用样本完成的所有更新的平均值(再次简化一点)。所以通常你会得到更智能的更新(更有可能朝着“始终正确预测”的方向发展),所以你需要更少的更新来达到良好的性能。在这种更快的收敛和更大的批次每次更新使用更多数据这一事实之间存在权衡,因此很难事先说哪条曲线应该收敛得更快。人们普遍认为您应该使用大小 > 1 的小批量(但也不要太大)。现在当你只有 1 class 实际出现在数据集中时,所有更新大致在同一个方向“总是预测 1”,所以 minibatch 平均值基本相同,但消耗更多数据以获得大致相同的更新.由于您仍然需要相同数量的这些更新,您将在相同数量的步骤后收敛,因此您将消耗更多数据以获得相同的结果。