反向传播算法很难调试得到正确结果,尤其是当实现程序存在很多难于发现的bug 时。举例来说,索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练(for(i=1; i<=m; ++i)
被漏写为 for(i=1; i<m; ++i)
),再比如忘记计算偏置项。这些错误会使你得到一个看似十分合理的结果(但实际上比正确代码的结果要差)。因此,仅从计算结果上来看,我们很难发现代码中有什么东西遗漏了。本节中,我们将介绍一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确。另外,使用本节所述求导检验方法,可以帮助你提升写正确代码的信心。
数学原理
考虑我们想要最小化以 θ θ 的情况 下,通常会发现左右两端至少有四位有效数字是一致的(或者说精度至少在0.0001一级)。
编程实现
import numpy as npdef sigmoid(z): return 1./(1+np.exp(-z))def sigmoid_prime(z): return sigmoid(z)*(1-sigmoid(z))def check_gradient(f, x0, epsilon): return (f(x0+epsilon) - f(x0-epsilon))/2/epsilonif __name__ == '__main__': x0 = np.array([1, 2, 3]) epsilon = 1e-4 print(sigmoid_prime(x0)) # [ 0.19661193 0.10499359 0.04517666] print(check_gradient(sigmoid, x0, epsilon)) # [ 0.19661193 0.10499359 0.04517666]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
References
[1] 梯度检验与高级优化
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow