您的位置:首页 > 其它

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

2016-08-16 22:35 316 查看

神经网络的表示

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

y′=f(W,X,b)=fnl(Wnl,fnl−1(Wnl−1,fnl−2(...f1(W1,X,b1)...,bnl−2),bnl−1),bnl)

即前一层的输出是下一层的输入, 也就是任意一层可以看作是关于前一层输出的函数。

训练深度神经网络,也就是使 y 与 y′ 之间的误差最小,即关于 y 和 y
18deb
′ 的函数 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) 。



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

伪代码

初始化:随机初始化一个点

计算当前损失函数的梯度: V=∇f(X)=<dfdx1,dfdx2,…,dfdxn>

更新:Xi+1=Xi−ϵV

重复步骤2-3,知道满足迭代条件

牛顿法

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

泰勒公式

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

f(x)=f(a)+f′(a)(x−a)+f′′(a)2!(x−a)2+⋯+fn(a)n!(x−a)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=xi−f′′(xi)−1f′(xi)

当 f:Rn→R 时,f′′(x)→H(f)(x) , 其中 H(f) 为 Hessian 矩阵

牛顿法的优缺点

为什么理论上牛顿法会比梯度下降法要更高效?由梯度下降法和牛顿法的更新方式我们可以知道,他们的区别在于,梯度下降法的更新是固定步长(如果我们忽略一阶导数的话),然后按照附体读的方向一步一步的走;而很明显牛顿法的更新是观念时直接求梯度等于0的点,目的是为了一步跨到最优点,只不过是因为求解时近似的,导致这一步走的不太准,还需要迭代。



上图中的红线表示牛顿法的优化过程,而绿线表示梯度下降法的优化过程。

但是实际上,牛顿法效率可能更差,因为计算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)TA∇f(x0))ϵ+∇f(x0)T(Ax0+b)=0,即 ϵ=−∇f(xi)T(Axi+b)∇f(xi)TA∇f(xi)。

从而x1=x0−ϵ∇f(x0)

伪代码

初始化:令 i=0 和 xi=x0,计算 di=d0=−∇f(x0)

找到最好的学习率 ϵ: ϵ=−diT(Axi+b)diTAdi

更新权值: xi+1=xi+ϵdi

更新方向: di+1=−∇f(xi+1)+βidi, 其中

βi=∇f(xi+1)TAdidiTAdi

重复步骤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).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息