为什么深度学习库强制成本函数输出标量?

机器算法验证 机器学习 神经网络 反向传播 西阿诺
2022-04-09 12:12:10

假设我们有一个神经网络:

  • 5个输入神经元
  • 一些任意数量的隐藏层
  • 3个输出神经元

假设我们正在使用大小为 32 的小批量。所以,

  • 如果我们在神经网络中输入一个 5x32 矩阵,
  • 然后我们将得到一个 3x32 的输出激活矩阵。

假设我们使用一个简单的 MSE 损失函数。我们取我们的 3x32 目标矩阵和 3x32 输出矩阵的差异,并对生成的新 3x32 矩阵中的每个条目进行元素平方,我们将其称为 M。

我感到困惑的是,我在 Theano 和其他深度学习库中看到了很多代码,这些代码将这个矩阵的平均值作为其成本函数(即输出一个标量,而不是一个向量)。

例如, T.mean(T.pow(T-Y, 2))为什么是这样?在我的示例中,Theano 不应该反向传播 M,而不是标量值吗?即使我使用小批量,这些库是否只是反向支持标量?

3个回答

所有机器学习都是关于最小化某些模型的成本。当您尝试找到最小值时,最基本的事情是比较两个值的能力。您只能使用标量值来执行此操作。例如,给定两个向量 [0,2], [2,2] 你将如何比较这些元组?你必须定义一些规范函数。欧几里得,马克斯,曼哈顿,或者你自己喜欢的。无论您使用什么,它都必须输出标量值。

  • 3个输出神经元

在大多数应用中选择损失函数,以便计算这三个神经元的组合损失(例如交叉熵损失)。这定义了在更好地匹配神经元 1 的目标值之间的权衡,代价是它们各自的目标值与其他两个神经元的匹配更差。您当然可以定义一个不同的损失函数,例如一个反映匹配目标值的损失函数对于神经元 1 的重要性是其他两个输出神经元的两倍等。

例如,T.mean(T.pow(T-Y, 2))为什么是这样?

这是您(训练)样本的平均误差。通常训练样本的所有样本都被同等对待,因此将网络输出与样本 1 的目标值匹配与匹配样本 2 的目标值等同样重要。在某些情况下,训练样本的某些元素被视为更重要与其他人相比,这可以通过在损失函数中添加权重项来建模。

在我的示例中,Theano 不应该反向传播 M,而不是标量值吗?

这对应于M对单个样本进行反向传播时间,其中网络权重是调整时间,在每个反向传播操作M中可能在相反的方向上。M例如,普通的随机梯度下降就是这样工作的。

您通常想要最小化的(即原始损失函数)是整个训练样本的平均值。在计算整个训练样本的损失后,您将获得一次权重更新。

事实证明,在实践中,您可以通过使用随机梯度下降更快地接近最优值。另一方面,现代计算硬件(CPU 或 GPU)是矢量化的(即支持在多个值上运行相同的代码),因此 minibatching 允许以相似的执行速度在每次升级时考虑多个样本。

当我使用小批量时,这些库是否只是支持标量?

他们对整个小批量的平均损失(这是一个标量值)反向传播导数。

如果您有一个网络,其中三个输出神经元对单个损失函数有贡献,则每个神经元都会根据它对损失的贡献程度获得其校正份额,对小批量中的M行进行平均。

你在评论中问:

假设我们对矩阵进行反向传播。如果我们这样做,我们将为神经网络中的每个参数获得 32 次梯度更新。对于每个参数,我们不能只取 32 个梯度的平均值并将其用于梯度下降吗?

好吧,假设您有 1,000,000 个参数。您建议我们计算 32,000,000 个偏导数,然后对它们进行平均,一次 32 个,以获得 1,000,000 个偏导数,然后我们可以将其应用于参数。

另一方面,如果成本是一个标量,那么我们只需要首先计算 1,000,000 个偏导数,然后我们可以立即将它们应用于参数,而无需先进行任何平均。

所以,你问我们是否不能“仅仅”做 32 倍的工作。答案是肯定的,我们可以……但工作量是原来的 32 倍。

这样做与仅仅取输出激活的平均值并反向支持标量没有什么不同吗?

不,是一样的。假设你有几个损失函数L1,L2,L3,L4你想通过改变一些参数来优化p. 然后是导数的平均值,

14(L1p+L2p+L3p+L4p),

只是平均值的导数,

14p(L1+L2+L3+L4).

所以,先取平均值再做反向传播相当于先做反向传播再取平均值。它也快得多。