深度学习的实用层面 —— 1.13 梯度检验

假设你的网络中含有下列参数 W [ 1 ] W^{[1]} W[1] b [ 1 ] b^{[1]} b[1] W [ 2 ] W^{[2]} W[2] b [ 2 ] b^{[2]} b[2],一直到 W [ L ] W^{[L]} W[L] b [ L ] b^{[L]} b[L]。为了执行梯度检验,首先要做的就是把所有参数转换成一个巨大的向量数据,你要做的就是把矩阵 W W W转换成一个向量,把所有 W W W矩阵转换成向量之后,做连接运算,得到一个巨型向量 θ \theta θ,代价函数表示为 J ( θ ) J(\theta) J(θ),接着你得到了与 W W W b b b顺序相同的数据 d W [ 1 ] dW^{[1]} dW[1] d [ 1 ] d^{[1]} d[1] d W [ 2 ] dW^{[2]} dW[2] d b [ 2 ] db^{[2]} db[2],一直到 d W [ L ] dW^{[L]} dW[L] d b [ L ] db^{[L]} db[L],用它们来初始化大向量 d θ d\theta dθ,它与 θ \theta θ有相同维度。同样地,把 d W [ 1 ] dW^{[1]} dW[1]转换成矩阵, d b [ 1 ] db^{[1]} db[1]已经是一个向量了,直到把 d W [ L ] dW^{[L]} dW[L]转换成矩阵,这样所有的 d W dW dW都是矩阵,注意 d W dW dW W 1 W_1 W1具有相同维度。

经过相同的转换和连接运算操作之后,可以把所有导数转换成一个大向量 d θ d\theta dθ,它与 θ \theta θ有相同的维度。现在的问题是 d θ d\theta dθ与代价函数J的梯度有什么关系?

以下是实施梯度检验的过程,首先我们要清楚,函数J是超参数 θ \theta θ的一个函数,可以将J函数展开为 J ( θ 1 , θ 2 , . . . , θ n ) J(\theta_1,\theta_2,...,\theta_n) J(θ1,θ2,...,θn),不论超参数向量 θ \theta θ的维度是多少。为了实施梯度检验,你要做的就是循环执行,从而对每个 i i i也就是对每个 θ \theta θ组成元素计算 D θ a p p r o x [ i ] D\theta_{approx}[i] Dθapprox[i]的值,使用双边误差 d θ a p p r o x [ i ] = J ( θ 1 , θ 2 , . . . , θ i + ε , . . . , ) − J ( θ 1 , θ 2 , . . . , θ i − ε , . . . , ) 2 ε d\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,...,\theta_i+\varepsilon ,...,)-J(\theta_1,\theta_2,...,\theta_i-\varepsilon ,...,)}{2\varepsilon} dθapprox[i]=2εJ(θ1,θ2,...,θi+ε,...,)J(θ1,θ2,...,θiε,...,)这个值 d θ a p p r o x d\theta_{approx} dθapprox应该逼近 d θ [ i ] d\theta^{[i]} dθ[i] d θ [ i ] d\theta^{[i]} dθ[i]是代价函数的偏导数,需要对i的每个值都执行这个运算,最后得到两个向量 d θ d\theta dθ d θ a p p r o x d\theta_{approx} dθapprox,我们要做的就是验证这些向量是否彼此接近。

如何定义这两个向量是否真的接近彼此,一般做以下运算计算这两个向量的距离,即 ∣ ∣ d θ a p p r o x − d θ ∣ ∣ 2 ||d\theta_{approx}-d\theta||_2 dθapproxdθ2,注意这个公式中没有平方,它是误差平方之和,然后求平方根,得到欧式距离,然后用向量长度做归一化,结果为 ∣ ∣ d θ a p p r o x − d θ ∣ ∣ 2 ∣ ∣ d θ a p p r o x ∣ ∣ 2 + ∣ ∣ d θ ∣ ∣ 2 \frac{||d\theta_{approx}-d\theta||_2}{||d\theta_{approx}||_2+||d\theta||_2} dθapprox2+dθ2dθapproxdθ2,使用向量长度的欧几里得范数,分母只是用于预防这些向量太大或者太小,分母使得这个方程式变成比率。我们实际执行这个方程式, ε \varepsilon ε的值可能为 1 0 − 7 10^{-7} 107,使用这个取值范围内的 ε \varepsilon ε,如果你发现计算方程式得到的值为 1 0 − 7 10^{-7} 107或者更小,这就很好,这意味着导数逼近很有可能是正确的。如果它的值在 1 0 − 5 10^{-5} 105,那就要小心了,也许这个值没问题,但得再次检查这个向量的所有项,确保没有一项误差过大,如果有一项误差非常大,可能就是存在bug。如果方程式结果是 1 0 − 3 10^{-3} 103,就得检查是否是bug了,计算结果应该比 1 0 − 3 10^{-3} 103小得多,这时应该仔细检查所有 θ \theta θ项,看是否有一个具体的 i i i值,使得 d θ a p p r o x d\theta_{approx} dθapprox d θ d\theta dθ大不相同,并用它来追踪一些求导计算是否正确。

经过一些调试,最终会是非常小的值,例如 1 0 − 7 10^{-7} 107,那么可能实施是正确的。在实施神经网络时,经常需要执行foreprop和backprop,然后可能发现这个梯度检验有一个相对较大的值,然后就怀疑存在bug,然后开始调试、调试、调试。调试一段时间后,得到一个很小的梯度检验值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值