deeplearning.ai 总结 - Gradient checking(如何检查梯度的正确性)
flyfish
最小化以 θ ,目标函数 J(θ)
使用梯度公式该实现梯度下降算法
θ:=θ−αddθJ(θ)
θ
:=
θ
−
α
d
d
θ
J
(
θ
)
使用sigmoid函数
f(z)=11+exp(−z)
f
(
z
)
=
1
1
+
exp
(
−
z
)
它的导数是
f′(z)=g(z)=f(z)(1−f(z))
f
′
(
z
)
=
g
(
z
)
=
f
(
z
)
(
1
−
f
(
z
)
)
推导方法
导数定义
f换成了J
ddθJ=limϵ→0J(θ+ϵ)−J(θ−ϵ)2ϵ d d θ J = lim ϵ → 0 J ( θ + ϵ ) − J ( θ − ϵ ) 2 ϵ
如何检查g(z)梯度的正确性
g(θ)≈J(θ+ϵ)−J(θ−ϵ)2ϵ g ( θ ) ≈ J ( θ + ϵ ) − J ( θ − ϵ ) 2 ϵ
将 ϵ 设为一个很小的常量,比如 10−4
deeplearning.ai 给的公式是
dθapprox[i]=J(θ1,θ2,⋯,θi+ε,⋯)−J(θ1,θ2,⋯,θi−ε,⋯)2ε
d
θ
a
p
p
r
o
x
[
i
]
=
J
(
θ
1
,
θ
2
,
⋯
,
θ
i
+
ε
,
⋯
)
−
J
(
θ
1
,
θ
2
,
⋯
,
θ
i
−
ε
,
⋯
)
2
ε
最后用欧式距离比较相似度
整体代码如下 已编译通过
import numpy as np
def sigmoid(z):
return 1./(1+np.exp(-z))
def sigmoid_derivative(z):
return sigmoid(z)*(1-sigmoid(z))
def check_gradient(f, x0, epsilon):
return (f(x0+epsilon) - f(x0-epsilon))/(2*epsilon)
if __name__ == '__main__':#当模块是被导入时,代码块不被运行。
x = np.array([1,2,3,4,5])
epsilon = 1e-4
a=sigmoid_derivative(x)
b=check_gradient(sigmoid, x, epsilon)
print(a)
print(b)
numerator = np.linalg.norm(a - b)
denominator = np.linalg.norm(a) + np.linalg.norm(b)
difference = numerator / denominator
if difference < 1e-7:
print("The gradient is correct!")
else:
print("The gradient is wrong!")