Neural network 反向传播中的梯度检测

Neural network 反向传播中的梯度检测,neural-network,backpropagation,Neural Network,Backpropagation,我正在尝试为一个简单的前馈神经网络实现梯度检查,它有2个单位输入层,2个单位隐藏层和1个单位输出层。我所做的是: 取所有层之间网络权重的每个权重w,然后使用w+ε和w-ε执行前向传播 使用两个前馈传播的结果计算数值梯度 我不明白的是如何准确地执行反向传播。通常,我将网络的输出与目标数据进行比较(在分类的情况下),然后在网络上反向传播误差导数。然而,我认为在这种情况下,其他一些值必须反向传播,因为数值梯度计算的结果不依赖于目标数据(而仅依赖于输入),而误差反向传播依赖于目标数据。那么,梯度检查的反

我正在尝试为一个简单的前馈神经网络实现梯度检查,它有2个单位输入层,2个单位隐藏层和1个单位输出层。我所做的是:

  • 取所有层之间网络权重的每个权重w,然后使用w+ε和w-ε执行前向传播
  • 使用两个前馈传播的结果计算数值梯度
    我不明白的是如何准确地执行反向传播。通常,我将网络的输出与目标数据进行比较(在分类的情况下),然后在网络上反向传播误差导数。然而,我认为在这种情况下,其他一些值必须反向传播,因为数值梯度计算的结果不依赖于目标数据(而仅依赖于输入),而误差反向传播依赖于目标数据。那么,梯度检查的反向传播部分应该使用什么值呢?

    无论你想做一些分类还是让你的网络计算某个数值函数,你总是有一些目标数据。例如,假设您想训练一个网络来计算函数
    f(a,b)=a+b
    。在这种情况下,这是您要对网络进行培训的输入和目标数据:

     a       b     Target
    
     1       1        2
     3       4        7
    21       0        21
     5       2        7 
    
            ...
    

    与“正常”分类问题一样,输入目标对越多越好。

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

    关于特定变量的梯度定义为函数值的变化率。所以,正如你们提到的,从函数的定义,我们可以近似函数的梯度,包括神经网络

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

    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)
    
    此过程一次只更改一个参数,并计算数值梯度。在本例中,我使用了
    (f(x+h)-f(x-h))/2h
    ,这似乎对我更有效

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

  • 砝码
  • 目标类别

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

    谢谢您的回答。然而,我要问的是梯度检查程序的具体情况,反向传播也是完全一样的。分类问题只是另一种数值问题。您需要为特定情况选择适当的错误函数,计算其导数,并反向传播该导数。然后让
    T
    作为目标值的向量,
    Y
    作为当前输出向量,
    msq
    作为错误函数。您需要反向传播导数
    d/dy msq(T,Y)
    ,对于
    Y
    中的每个
    Y
    。您提供的公式似乎是错误的,它计算负梯度。正确的公式应该是
    (f(x+h)-f(x-h))/2h
    w_l_grad[i,j]=(成本加成本减)/(2*eps)
    感谢您的注意。不知道我为什么那样做。但是现在修好了。