假设一个深度神经网络有 nl 层网络,输入为 (X,y) 那么深度神经网络可以一般表示为
对于一个函数 y=f(w,x) , 我们知道,对于任意 ϵ>0 , 并且当 ϵ 足够小时, f(x+ϵ)≈f(x)+ϵf′(x) 。 因此导数在求损失函数的最小值时,非常有用。当 ϵ 足够小时, f(x−ϵf′(x))≈f(x)−ϵ(f′(x))2<f(x) 。
故梯度下降可以表示为 x=x−ϵf′(x) 。
理论上,当 x 达到最值点时,由于 f′(x)=0 ,因此梯度不会再变化,此时的 x 即为我们所求的解。 但是在实际应用中,往往不会达到最优点,一个原因损失函数通常为非凸函数,从而导致陷入局部最优点;另一个原因是 ϵ 的值不可能选的足够小(训练效率, ϵ 太小导致训练速度慢,太大导致训练不能收敛),从而导致最后在最值点附近震荡。
理论上,梯度下降能够很好的满足我们的要求,但是在实际应用中,梯度下降法训练速度太慢,因此只有在数据较小时采用梯度下降法,数据过大时,一般采用其他方法。
对于正整数 n ,若函数 f(x) 在闭区间 [a,b] 上 n 阶连续可导, 且在 (a,b) 上 n+1 阶可导。 ∀x∈[a,b] 满足一下公式:
则当 ϵ 足够小时,我们得 f(x0+ϵ)≈f(x0)+f′(x0)ϵ+f′′(x0)ϵ22 , 我们知道最值点处 dfdx=0 , 即我们想求这样的一个 ϵ 使得 x0+ϵ 为最优点,从而有 dfdx=f′(x0)+f′′(x0)ϵ=0 ,求得 ϵ=−f′(x0)f′′(x0) , 从而有
为什么理论上牛顿法会比梯度下降法要更高效?由梯度下降法和牛顿法的更新方式我们可以知道,他们的区别在于,梯度下降法的更新是固定步长(如果我们忽略一阶导数的话),然后按照附体读的方向一步一步的走;而很明显牛顿法的更新是观念时直接求梯度等于0的点,目的是为了一步跨到最优点,只不过是因为求解时近似的,导致这一步走的不太准,还需要迭代。
上图中的红线表示牛顿法的优化过程,而绿线表示梯度下降法的优化过程。
但是实际上,牛顿法效率可能更差,因为计算Hessian矩阵存在两个难点,一是在神经网络中计算Hessian矩阵需要额外的算法,BP算法能够计算梯度; 二是计算Hessian矩阵需要较大的内存,假如数据是 n 维的话,那么需要 O(n2) 的内存空间。
共轭梯度法是用于优化二次函数的方法,但是我们可以通过结合牛顿法来优化其他非线性函数。首先我们来了解一下共轭梯度法。梯度下降法在偏离最优点的位置优化速度比较快,但是在最优点附近优化速度会变得非常慢,这是因为学习率 ϵ 是固定的,而在最优点附近的梯度十分小,从而导致速率慢。那么如何解决这个问题呢?是否能使 ϵ 随着优化过程更更改它的值从而每次更新的速率都达到最优?
对于任意二次函数,我们可以写成以下形式,
从而 x1=x0−ϵ∇f(x0)
那么对于其他非二次函数,该怎么优化呢?由牛顿法我们知道 f(x+Δx)≈f(x)+∇f(x)TΔx+ΔxTH(f)Δx 。因此可以将其他函数转化成二次函数来优化。
1. 初始化
2. 转化成二次函数:在当前点 xi 计算 ∇f(xi) 和 H(f)(xi) ,将其转化为 f(xi+Δx)≈f(xi)+∇f(xi)TΔx+ΔxTH(f)Δx
3. 共轭梯度:利用共轭梯度法计算 xi+1 。
4. 重复步骤2-3
//todo Hessian-free优化的解释
Martens, J. (2010). Deep learning via Hessian-free optimization. Proceedings of the 27th International Conference on Machine Learning (ICML-10).