笔记(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).相关文章推荐
- java 使用简单的demo实例告诉你优化算法的强大
- CUDA搭建
- 稀疏自动编码器 (Sparse Autoencoder)
- 白化(Whitening):PCA vs. ZCA
- softmax回归
- 卷积神经网络初探
- TensorFlow人工智能引擎入门教程之九 RNN/LSTM循环神经网络长短期记忆网络使用
- TensorFlow人工智能引擎入门教程之十 最强网络 RSNN深度残差网络 平均准确率96-99%
- TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)
- TensorFlow人工智能入门教程之十四 自动编码机AutoEncoder 网络
- TensorFlow人工智能引擎入门教程所有目录
- 如何用70行代码实现深度神经网络算法
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 安装caffe过程记录
- DIGITS的安装与使用记录
- 我对ltsm的学习,从rnn的问题讲起
- 图像识别和图像搜索
- 卷积神经网络
- 深度学习札记
- ubuntu14.04安装 资料