首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向传播中的梯度检验

反向传播中的梯度检验
EN

Stack Overflow用户
提问于 2014-10-04 11:59:36
回答 2查看 3.4K关注 0票数 6

我试图实现一个简单的前馈神经网络的梯度检查,它包含两个单位输入层,两个单位隐层和一个单位输出层。我要做的是:

  1. 取各层间网络权重w,利用w+ EPSILON进行前向传播,然后使用w- EPSILON进行前向传播。
  2. 利用两种前馈传播的结果计算数值梯度。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-11 10:34:15

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

相对于特定变量的梯度的定义是函数值的变化率。因此,正如您所提到的,从一阶导数的定义来看,我们可以近似一个函数的梯度,包括一个神经网络。

为了检验你的神经网络的分析梯度是否正确,最好用数值方法来检验它。

代码语言:javascript
复制
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,它似乎更适合我。

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

  1. 称重
  2. 目标类

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

票数 5
EN

Stack Overflow用户

发布于 2014-10-04 12:08:58

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

代码语言:javascript
复制
 a       b     Target

 1       1        2
 3       4        7
21       0        21
 5       2        7 

        ...

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26192592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档