我正在尝试为具有2个单位输入层,2个单位隐藏层和1个单位输出层的简单前馈神经网络实现梯度检查 . 我所做的是以下内容:
-
在所有层之间获取网络权重的每个权重w,并使用w EPSILON然后使用w-EPSILON执行前向传播 .
-
使用两个前馈传播的结果计算数值梯度 .
我不明白的是如何进行反向传播 . 通常,我将网络的输出与目标数据(在分类的情况下)进行比较,然后反向传播整个网络的误差导数 . 但是,我认为在这种情况下,一些其他值必须反向传播,因为数值梯度计算的结果不依赖于目标数据(但仅取决于输入),而错误反向传播取决于目标数据 . 那么,在梯度检查的反向传播部分应该使用的值是多少?
2 回答
在分析计算梯度之后执行反向传播,然后在训练时使用这些公式 . 神经网络本质上是多变量函数,其中需要找到或训练函数的系数或参数 .
关于特定变量的梯度的定义是函数值的变化率 . 因此,正如您所提到的,根据first derivative的定义,我们可以近似函数的梯度,包括神经网络 .
要检查神经网络的分析梯度是否正确,最好使用数值方法进行检查 .
此过程一次只更改一个参数并计算数值梯度 . 在这种情况下,我使用了
(f(x-h) - f(x+h))/2h
,这对我来说似乎更好 .请注意,你提到:"since in the results of the numerical gradient computation are not dependent of the target data",这不是真的 . 当您在上面找到
cost_minus
和cost_plus
时,成本将在此基础上计算重量
The target classes
因此,反向传播的过程应该与梯度检查无关 . 在反向传播更新之前计算数值梯度 . 在一个时期使用反向传播计算梯度(使用类似于上面的东西) . 然后比较矢量/矩阵的每个梯度分量,并检查它们是否足够接近 .
无论您是要进行某种分类还是让您的网络计算某个数字函数,您始终都会有一些目标数据 . 例如,假设您想训练网络来计算函数
f(a, b) = a + b
. 在这种情况下,这是您要训练网络的输入和目标数据:正如“正常”分类问题一样,输入目标对越多越好 .