笔记(1):基于梯度的优化方法

神经网络的表示

假设一个深度神经网络有 nl 层网络,输入为 (X,y) 那么深度神经网络可以一般表示为

y=f(W,X,b)=fnl(Wnl,fnl1(Wnl1,fnl2(...f1(W1,X,b1)...,bnl2),bnl1),bnl)

即前一层的输出是下一层的输入, 也就是任意一层可以看作是关于前一层输出的函数。
训练深度神经网络,也就是使 y y 之间的误差最小,即关于 y y 的函数 L(y,y) 最小。由 y 的表达式我们可得
L(y,y)=L(y,f(W,X,b))

由于 (X,y) 已知,故求解 L(y,y) 的最小值问题又可以转化成如何调整 W 的值从而使 L 最小。
需要注意的是在前馈(forward)中,即求 y y 是关于 X 的函数,而在BP中,是调整权值 W 以使损失函数 L 达到最小。

梯度下降

对于一个函数 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)
笔记(1):基于梯度的优化方法_第1张图片
理论上,当 x 达到最值点时,由于 f(x)=0 ,因此梯度不会再变化,此时的 x 即为我们所求的解。 但是在实际应用中,往往不会达到最优点,一个原因损失函数通常为非凸函数,从而导致陷入局部最优点;另一个原因是 ϵ 的值不可能选的足够小(训练效率, ϵ 太小导致训练速度慢,太大导致训练不能收敛),从而导致最后在最值点附近震荡。

伪代码

  1. 初始化:随机初始化一个点
  2. 计算当前损失函数的梯度: V=f(X)=<dfdx1,dfdx2,,dfdxn>
  3. 更新: Xi+1=XiϵV
  4. 重复步骤2-3,知道满足迭代条件

牛顿法

理论上,梯度下降能够很好的满足我们的要求,但是在实际应用中,梯度下降法训练速度太慢,因此只有在数据较小时采用梯度下降法,数据过大时,一般采用其他方法。

泰勒公式

对于正整数 n ,若函数 f(x) 在闭区间 [a,b] n 阶连续可导, 且在 (a,b) n+1 阶可导。 x[a,b] 满足一下公式:

f(x)=f(a)+f(a)(xa)+f′′(a)2!(xa)2++fn(a)n!(xa)n+Rn(x)

具体参考 百度百科 。

牛顿法的表述

则当 ϵ 足够小时,我们得 f(x0+ϵ)f(x0)+f(x0)ϵ+f′′(x0)ϵ22 , 我们知道最值点处 dfdx=0 , 即我们想求这样的一个 ϵ 使得 x0+ϵ 为最优点,从而有 dfdx=f(x0)+f′′(x0)ϵ=0 ,求得 ϵ=f(x0)f′′(x0) , 从而有

xi+1=xif′′(xi)1f(xi)

f:RnR 时, f′′(x)H(f)(x) , 其中 H(f) 为 Hessian 矩阵。

牛顿法的优缺点

为什么理论上牛顿法会比梯度下降法要更高效?由梯度下降法和牛顿法的更新方式我们可以知道,他们的区别在于,梯度下降法的更新是固定步长(如果我们忽略一阶导数的话),然后按照附体读的方向一步一步的走;而很明显牛顿法的更新是观念时直接求梯度等于0的点,目的是为了一步跨到最优点,只不过是因为求解时近似的,导致这一步走的不太准,还需要迭代。
笔记(1):基于梯度的优化方法_第2张图片
上图中的红线表示牛顿法的优化过程,而绿线表示梯度下降法的优化过程。
但是实际上,牛顿法效率可能更差,因为计算Hessian矩阵存在两个难点,一是在神经网络中计算Hessian矩阵需要额外的算法,BP算法能够计算梯度; 二是计算Hessian矩阵需要较大的内存,假如数据是 n 维的话,那么需要 O(n2) 的内存空间。

共轭梯度法

共轭梯度法是用于优化二次函数的方法,但是我们可以通过结合牛顿法来优化其他非线性函数。首先我们来了解一下共轭梯度法。梯度下降法在偏离最优点的位置优化速度比较快,但是在最优点附近优化速度会变得非常慢,这是因为学习率 ϵ 是固定的,而在最优点附近的梯度十分小,从而导致速率慢。那么如何解决这个问题呢?是否能使 ϵ 随着优化过程更更改它的值从而每次更新的速率都达到最优?

理论

对于任意二次函数,我们可以写成以下形式,

f(x)=12xTAx+bTx+c

其中 A=AT 。那么其梯度为 f(x)=Ax+b ,令 g(ϵ)=f(x0ϵf(x0)) ,则 g(ϵ)=(f(x0)TAf(x0))ϵ+f(x0)T(Ax0+b)=0 ,即 ϵ=f(xi)T(Axi+b)f(xi)TAf(xi)

从而 x1=x0ϵf(x0)

伪代码

  1. 初始化:令 i=0 xi=x0 ,计算 di=d0=f(x0)
  2. 找到最好的学习率 ϵ : ϵ=diT(Axi+b)diTAdi
  3. 更新权值: xi+1=xi+ϵdi
  4. 更新方向: di+1=f(xi+1)+βidi , 其中
    βi=f(xi+1)TAdidiTAdi
  5. 重复步骤2-4直到满足迭代条件。

Hessian-free优化

那么对于其他非二次函数,该怎么优化呢?由牛顿法我们知道 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).

你可能感兴趣的:(深度学习)