梯度检验
反向传播算法很难调试得到正确结果,但却会得到一个看起来很合理的结果。
比如段位错误(Off-by-one error)。例子是for循环中循环
m
次,正确应该是
这节课介绍了一种对求导结果进行数值检验的方法,这种方法可以验证求导代码是否正确。
单个实数
假设我们想要最小化以
θ
为自变量的目标函数
J(θ)
。假设
J:R↦R
,则
θ∈R
。在一维的情况下,一次迭代的梯度下降公式是
θ:=θ−αddθJ(θ)
再假设我们已经用代码实现了计算
ddθJ(θ)
的函数
g(θ)
,接着我们使用
θ:=θ−αg(θ)
来实现梯度下降算法。
可以用以下数值检验公式计算两端是否一样来检验
g
是否正确:
实际应用中,我们常将
EPSILON
设为一个很小的常量,比如在
10−4
数量级。
向量情况
考虑 θ∈Rn 是一个向量而非一个实数,并且 J:Rn↦R 。现在将求导检验方法推广到一般化,即 θ 是一个向量的情况。
假设我们有一个用于计算
∂∂θiJ(θ)
的函数
gi(θ)
;我们想要检验
gi
是否输出正确的求导结果。
定义:
θ(i+)=θ+EPSILON×e⃗ i
θ(i−)=θ−EPSILON×e⃗ i
其中
e⃗ i=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢00⋮1⋮0⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
是第
i
个基向量(维度和
然后我们可以对每个
高级优化
目前为止,学习的都是使用梯度下降来最小化
J(θ)
。
第一种方法:使用梯度下降,并能够自动调整学习速率
α
,以得到合适的步长值,最终使
θ
能够快速收敛到一个局部最优解。
更精妙的方法:可以寻找一个Hessian矩阵的近似,得到最佳步长值,使用该步长值能够更快地收敛到局部最优(和牛顿法类似)。比如L-BFGS算法。