深度学习二

接着前几天的内容,今天我想主要说一下梯度下降和反向传播算法。首先,对于梯度下降,其实梯度下降就是一种回归的方法,那为什么这么讲呢?因为我们都学过回归,最基本的一元线性回归,如下式所示:

y=ax+b

这里就要用统计的知识去估计参数a和b,从而找到变量之间的相关关系。那现在想想我们这里说的梯度下降也一样,就是去找到一个在误差许可范围内的parameter set,从而将这一层一层的参数堆叠起来,形成从低维到高维的特征表示。当然,在这里,回归学习也有很多不同的种类,解决回归的方法也有很多,像最小二乘法、高斯牛顿法,有理插值法等等,但毫无疑问,梯度下降是求解回归模型的参数方法之一。他们的目的都是要找到或者说解决这些未知的参数,那怎么找呢?我希望它能够沿着梯度向量的反方向(即为梯度下降)不断更新parameter,使目标函数达到局部最优或者是全局最优。在梯度下降中,我们经常会听到批处理梯度下降和随机梯度下降。本身处理的都是同一个问题,随机梯度下降可以看做是批处理下降的优化,批处理每一次更新必须是在遍历了所有的训练样本之后,而随机梯度下降则是一种one by one 的更新,而且是again and again。

 再来看看反向传播算法。现在的问题是,我们知道了应该怎么去调参数后,接下来的问题是怎么去计算这些个梯度呢?反向传播算法(BP算法),通过链式法则来求解误差对参数的偏导数,其实这里面也有用到迭代。BP算法基于梯度下降算法,首先从一个初始值出发,沿着目标函数值的负梯度方向去寻找比当前函数值更小的目标函数值,接着以新目标函数值所对应的位置出发,重复上述train的过程,直到找到上面所说的局部最优或者全局最优,此时又称训练过程收敛。下图中给出的是梯度下降的全局最优和局部最优。在这个过程中,我们必须指出学习率的选取对整个训练过程有很大影响。如果学习速率太小,则找到函数最小值的速度就很慢,反之,则可能会出现震荡、不收敛。改进学习速率是反向传播算法研究最多的内容,提高训练收敛速度,缩短训练时间。可以通过采取可变学习速率策略使得训练过程更快、更稳定的收敛。可能是开始选用较大的学习速率,随着训练过程的进行不断减小学习速率。

好,接下来我们看看Caffe,具体的Caffe安装介绍就不用说了,网上有很多。下面针对今天的内容看看Caffe相关的地方都是怎么定义的。进入到Caffe的根目录下,进入\src\caffe\solvers文件夹,打开sgd_solver.cpp,同时配合include文件夹下的sgd_solvers.hpp,里面清楚地定义了随机梯度下降的处理思路。跟着学习率一块看,例如在手写识别的lenet_solver.prototxt中有清楚的介绍学习速率的问题:

# The base learning rate, momentum and the weight decay of thenetwork.

base_lr: 0.01                   #定义开始学习速率为:α = 0.01

momentum: 0.9                #动量 momentum 为:μ = 0.9

weight_decay: 0.0005      #权重衰减系数

# The learning rate policy  

lr_policy: "inv"                 # 学习策略: inv

gamma: 0.0001               #学习速率变化因子

power: 0.75     #inv策略的一个指数lr=base_lr *(1 - iter./max_iter) .^ (power)

关于前向、反向传播,在src\caffe\proto中caffe.proto中对layers都有明确的定义,通过Net::Forward()和Net::Backward()来定义,对于需要计算反向传播的层,结合相应的梯度下降策略来进行。

猜你喜欢

转载自blog.csdn.net/zhuiyunzhugang/article/details/88592020