首页 文章

在反向传播中的梯度检查

提问于
浏览
2

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

  • 在所有层之间获取网络权重的每个权重w,并使用w EPSILON然后使用w-EPSILON执行前向传播 .

  • 使用两个前馈传播的结果计算数值梯度 .

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

2 回答

  • -1

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

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

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

    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_minus - cost_plus)/(2*eps)
    

    此过程一次只更改一个参数并计算数值梯度 . 在这种情况下,我使用了 (f(x-h) - f(x+h))/2h ,这对我来说似乎更好 .

    请注意,你提到:"since in the results of the numerical gradient computation are not dependent of the target data",这不是真的 . 当您在上面找到 cost_minuscost_plus 时,成本将在此基础上计算

    • 重量

    • The target classes

    因此,反向传播的过程应该与梯度检查无关 . 在反向传播更新之前计算数值梯度 . 在一个时期使用反向传播计算梯度(使用类似于上面的东西) . 然后比较矢量/矩阵的每个梯度分量,并检查它们是否足够接近 .

  • 1

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

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

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

相关问题