原文地址:http://demo.netfoucs.com/danieljianfeng/article/details/42931721
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。Caffe通过协调的进行整个网络的前向传播推倒以及后向梯度对参数进行更新,试图减小损失。
Caffe已经封装好了三种优化方法,分别是Stochastic Gradient Descent (SGD), AdaptiveGradient (ADAGRAD), and Nesterov’s Accelerated Gradient (NAG)。
Solver的流程:
1. 设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。
2. 通过forward和backward迭代的进行优化来跟新参数
3. 定期的评价测试网络
4. 在优化过程中显示模型和solver的状态
每一步迭代的过程
1. 通过forward计算网络的输出和loss
2. 通过backward计算网络的梯度
3. 根据solver方法,利用梯度来对参数进行更新
4. 根据learning rate,history和method来更新solver的状态
和Caffe模型一样,Caffe solvers也可以CPU / GPU运行。
其中, r(W)是正则项,为了减弱过拟合现象。
如果采用这种Loss 函数,迭代一次需要计算整个数据集,在数据集非常大的这情况下,这种方法的效率很低,这个也是我们熟知的梯度下降采用的方法。 有了loss函数后,就可以迭代的求解loss和梯度来优化这个问题。在神经网络中,用forward pass来求解loss,用backward pass来求解梯度。
在实际中,会采用整个数据集的一个mini-batch,其数量为N<<|D|,此时的loss 函数为:
其中,learning rate 是negative梯度的权重,momentum是上一次更行的权重。这两个参数需要通过tuning来得到最好的结果,一般是根据经验设定的。如果你不知道如何设定这些参数,可以参考下面的经验法则,如果需要了解更多的参数设置技巧可以参考论文Stochastic Gradient Descent Tricks [1]。
设置learningrate和momentum的经验法则
例子
base_lr: 0.01 # begin training at a learning rate of0.01 = 1e-2 lr_policy: "step" # learning ratepolicy: drop the learning rate in "steps" # by a factor of gamma everystepsize iterations gamma: 0.1 # drop the learning rate by a factor of10 # (i.e., multiply it by afactor of gamma = 0.1) stepsize: 100000 # drop the learning rate every 100K iterations max_iter: 350000 # train for 350K iterations total momentum: 0.9在深度学习中使用SGD,好的初始化参数的策略是把learning rate设为0.01左右,在训练的过程中,如果loss开始出现稳定水平时,对learning rate乘以一个常数因子(比如,10),这样的过程重复多次。此外,对于momentum,一般设为0.9,momentum可以让使用SGD的深度学习方法更加稳定以及快速,这次初始参数参论文ImageNet Classification with Deep Convolutional Neural Networks [2]。 上面的例子中,初始化learning rate的值为0.01,前100K迭代之后,更新learning rate的值(乘以gamma)得到0.01*0.1=0.001,用于100K-200K的迭代,一次类推,直到达到最大迭代次数350K。 Note that the momentum setting μ effectively multiplies the size of your updates by a factor of 11−μ after many iterations of training, so if you increase μ, it may be a good idea to decrease α accordingly (and vice versa). For example, with μ=0.9, we have an effective update size multiplier of 11−0.9=10. If we increased the momentum to μ=0.99, we’ve increased our update size multiplier to 100, so we should drop α (base_lr) by a factor of 10. 上面的设置只能作为一种指导,它们不能保证在任何情况下都能得到最佳的结果,有时候这种方法甚至不work。如果学习的时候出现diverge(比如,你一开始就发现非常大或者NaN或者inf的loss值或者输出),此时你需要降低base_lr的值(比如,0.001),然后重新训练,这样的过程重复几次直到你找到可以work的base_lr。
在实践中需要注意的是,权重,AdaGrad的实现(包括在Caffe中)只需要使用额外的存储来保存历史的梯度信息,而不是的存储(这个需要独立保存每一个历史梯度信息)。(自己没有理解这边的意思)
不同的是在计算梯度的时候,在NAG中求解权重加上momentum的梯度,而在SGD中只是简单的计算当前权重的梯度。