反向传播中的梯度检查

bdf*_*sdg 6 backpropagation neural-network

我正在尝试为具有 2 个单元输入层、2 个单元隐藏层和 1 个单元输出层的简单前馈神经网络实现梯度检查。我做的是以下内容:

  1. 取所有层之间的网络权重的每个权重 w 并使用 w + EPSILON 然后 w - EPSILON 执行前向传播。
  2. 使用两个前馈传播的结果计算数值梯度。

我不明白的是如何准确地执行反向传播。通常,我将网络的输出与目标数据进行比较(在分类的情况下),然后在整个网络中反向传播误差导数。但是,我认为在这种情况下必须反向传播一些其他值,因为在数值梯度计算的结果中,不依赖于目标数据(而仅依赖于输入),而误差反向传播取决于目标数据。那么,梯度检查的反向传播部分应该使用什么值呢?

pho*_*xis 5

在分析计算梯度后执行反向传播,然后在训练时使用这些公式。神经网络本质上是一个多元函数,需要找到或训练函数的系数或参数。

关于特定变量的梯度的定义是函数值的变化率。因此,正如您提到的,根据一阶导数的定义,我们可以近似函数的梯度,包括神经网络。

要检查神经网络的分析梯度是否正确,最好使用数值方法进行检查。

For each weight layer w_l from all layers W = [w_0, w_1, ..., w_l, ..., w_k]
    For i in 0 to number of rows in w_l
        For j in 0 to number of columns in w_l
            w_l_minus = w_l; # Copy all the weights
            w_l_minus[i,j] = w_l_minus[i,j] - eps; # Change only this parameter

            w_l_plus = w_l; # Copy all the weights
            w_l_plus[i,j] = w_l_plus[i,j] + eps; # Change only this parameter

            cost_minus = cost of neural net by replacing w_l by w_l_minus
            cost_plus = cost of neural net by replacing w_l by w_l_plus

            w_l_grad[i,j] = (cost_plus - cost_minus)/(2*eps)
Run Code Online (Sandbox Code Playgroud)

这个过程一次只改变一个参数并计算数值梯度。在这种情况下,我使用了(f(x+h) - f(x-h))/2h,这似乎更适合我。

请注意,您提到:“由于数值梯度计算的结果不依赖于目标数据”,这是不正确的。当您找到cost_minuscost_plus以上时,成本是根据

  1. 权重
  2. 目标类

因此,反向传播的过程应该独立于梯度检查。在反向传播更新之前计算数值梯度。在一个 epoch 中使用反向传播计算梯度(使用类似于上面的方法)。然后比较向量/矩阵的每个梯度分量并检查它们是否足够接近。