在深度学习知识面试中,最常见的问题之一是“为什么我们不能使用二次成本函数来训练神经网络? ”。在本文中,我们将讨论这个问题的答案。其中会涉及很多数学知识,但没有什么特别的!我会尽量保持简单和精确。
让我们首先思考一下神经网络的总体架构
对于二元分类问题,我们有一系列输入构成“输入层”,一系列神经元构成“隐藏层”,一个神经元构成“输出层”。对于这个问题,我们假设我们正在处理二元分类器,因此我们只有一个来自网络的输出值。
现在,请看下图,我们用绿色突出显示输入层,用红色突出显示输出神经元,用橙色突出显示隐藏层的一个神经元。从所有绿色到橙色,我们看到所有输入都连接到橙色神经元。换句话说,橙色神经元的“激活”是通过“聚合”输入层中的所有绿色神经元来实现的。这个过程在所有层的所有神经元上重复,直到我们到达最终的红色输出神经元。
如果我们用红色神经元替换橙色神经元,即删除隐藏层并将红色神经元与绿色神经元直接连接,会怎么样?
我们将获得以下内容:
对于这个问题,我们将假设前面提到的“简单架构”,并且结果也可以推广到完整的架构。
现在让我们逐步介绍一些数学。
上面我们看到的是神经网络的基本“权重更新”方程。我删除了额外的超参数,例如学习因子和子采样(最小批次)等。w_k 是权重向量,权重是我们的神经网络模型的“参数”。w_k 包括聚集在列向量中的各个权重。这些权重与模型的输入(即我们架构中的绿色神经元)相关联。我们有一个成本函数 C_i,其中 i = 1 到 n 是样本中的数据实例数。成本函数 C 是实际输出 y 与神经网络输出(红色神经元)之间的“误差”。每个数据实例都会产生一个预测输出,而不是实际输出,因此,每个数据实例都会有一个成本或误差。该模型的目标是在整个数据集上最小化这个成本函数的平均值。众所周知,最小化步骤涉及对模型参数(权重)求导。我们使用向量 w_k 的偏导数来做到这一点。所有这些意味着成本 C 将是权重 w_1 到 w_q 的表达式/聚合,我们将对每个权重 w 进行区分并将其收集到一个向量中。这被称为负“梯度向量”。它用于从第 k 次迭代到第 (k+1) 次迭代更新权重向量。该方法是随机梯度下降,但在本文中我们将不讨论它。
简而言之,神经网络通过对所有样本取平均值并针对 w_k 计算的负梯度向量来更新权重,从而进行学习。这有助于我们最小化成本函数,并帮助网络学习和提高其准确性。很明显,如果没有对权重进行更新,因为负梯度正在向零移动,学习就停止了。这并不一定意味着我们已经达到了最小值!因为我们的成本函数非常复杂,我们需要在多维空间中找到最小值。因此,可能存在许多局部最小值,其中梯度为零,网络停止学习。无论如何,对于这个问题,我们不必担心这一点。
我们来看看下面的表达式:
此表达式将 z_i 定义为输入 x_ji 的加权和。请注意,这些输入是我们架构中的绿色神经元。由于我们没有隐藏层,我们将输入 x_ji 和权重 w_j 结合起来,并添加一个偏差项来获得 z_i,这就是我们架构中从绿色神经元到红色神经元的连接箭头所表示的内容。由于我们有 q 个输入,因此我们有 x_j 和 w_j,其中 j = 1 到 q
但是,我们不会将 z_i 传递给红色神经元。我们对其应用“激活函数”。对于不同的神经网络,此激活函数可能不同。为了解决这个问题,我们假设激活函数是“Sigmoid”或“logistic”。我在此假设读者知道此功能并继续阅读。
接下来是我们的主要问题陈述——我们如何定义成本函数(C)?众所周知,对于二元分类,成本函数是“交叉熵”,但这里的问题是为什么它不能是“二次的”。
让我们定义两个成本函数的表达式:
二次成本函数 –交叉熵成本函数-
虽然二次成本函数很简单(想想实际输出 y_i 和预测输出 a_i 之间的最小二乘最小化),但我们可以对交叉熵成本函数提供一些解释。这类似于我们回归模型中的负对数似然。请注意,括号外有一个负号,用于保持成本为正(因为 a_i 介于 0 和 1 之间 - sigmoid 的输出,因此括号内的项将始终为负)。还要注意,当 a_i 非常接近 y_i 时,成本非常接近零。这是因为,当 y_i = 1 且 a_i ~ 1 时,ln(a_i) 将约为 0。同样,当 y_i= 0 且 a_i ~ 0 时,ln(1-a_i) 将约为 0。因此,当模型预测良好时,该函数使成本保持正值且最小。但是,二次成本函数也是如此。但我们不使用它。为什么?下面是解释
我们回到之前看到的基本权重更新方程,并将二次成本函数输入其中。我们得到以下结果
现在为了简单起见,我们只考虑一个数据点,即 i=1 和 n=1。我们对每个权重 w_j 进行部分区分。我们得到以下结果:
回想一下,由于 i = 1,我们有
代入 z 值,我们得到
这意味着当我们使用二次成本函数时,负责更新网络权重的梯度向量将具有 S 型函数的导数。
现在让我们看一下 S 型函数导数的行为:
从上图可以清楚地看出,当输入 z 变大时,表示 S 型函数斜率的导数会趋近于 0!这是什么意思?这意味着当激活输入 z 很大时,梯度向量将为零。因此,网络将停止学习,因为权重不会更新。回想一下,这并不意味着我们已经达到了最小值。这意味着我们被困在一个不理想的点上,并且处于可能远离最小值的函数空间中。这被称为“学习减速”。然而,这不会发生在交叉熵成本函数中。
我们使用交叉熵成本函数执行相同的替换,得到以下结果:
值得注意的是这个术语:
二次成本的梯度也会出现这种情况。不过,我们将使用一个技巧来简化它。S 型函数的梯度可以表示如下
我们将其代入原始表达式并得到以下结果:
也就是说,当我们使用交叉熵成本函数时,负责更新网络权重的梯度向量没有S 型函数的导数。因此,使用此成本函数不会减慢学习速度。
为了更好地观察,我们再次并列渐变:
这回答了我们最初的问题——我们不使用二次成本函数,因为它会导致学习速度减慢。
请注意,上述分析仅在输出层(一个神经元)上进行,但它也可以推广到一般神经网络!