一、solver算是caffe的核心的核心,它协调着整个模型的运作。
caffe程序运行必带的一个参数就是solver配置文件。运行代码一般为
#caffe train --solver=*_slover.prototxt
在Deep Learning中,往往loss function是非凸的,没有解析解,我们需要通过优化方法来求解。solver的主要作用就是交替调用前向(forward)算法和后向(backward)算法来更新参数,从而最小化loss,实际上就是一种迭代的优化算法。
到目前的版本,caffe提供了六种优化算法来求解最优参数,在solver配置文件中,通过设置type类型来选择。
Stochastic Gradient Descent (type: "SGD"),
AdaDelta (type: "AdaDelta"),
Adaptive Gradient (type: "AdaGrad"),
Adam (type: "Adam"),
Nesterov’s Accelerated Gradient (type: "Nesterov") and
RMSprop (type: "RMSProp")
具体的每种方法的介绍,请看本系列的下一篇文章, 本文着重介绍solver配置文件的编写。
二、Solver的流程:
1. 设计好需要优化的对象,以及用于学习的训练网络和用于评估的测试网络。(通过调用另外一个配置文件prototxt来进行)
2. 通过forward和backward迭代的进行优化来跟新参数。
3. 定期的评价测试网络。 (可设定多少次训练后,进行一次测试)
4. 在优化过程中显示模型和solver的状态
在每一次的迭代过程中,solver做了这几步工作:
1、调用forward算法来计算最终的输出值,以及对应的loss
2、调用backward算法来计算每层的梯度
3、根据选用的slover方法,利用梯度进行参数更新
4、记录并保存每次迭代的学习率、快照(snapshot),以及对应的状态。
三、solver参数:
------------与学习率有关的参数:
base_lr
这个参数代表的是此网络最开始的学习速率(BeginningLearning rate),一般是个浮点数,根据机器学习中的知识,lr过大会导致不收敛,过小会导致收敛过慢,所以这个参数设置也很重要。
lr_policy
这个参数代表的是learningrate应该遵守什么样的变化规则,这个参数对应的是字符串,选项及说明如下:
“step”-需要设置一个stepsize参数,返回base_lr* gamma ^ ( floor ( iter / stepsize ) ),iter为当前迭代次数
“multistep”-和step相近,但是需要stepvalue参数,step是均匀等间隔变化,而multistep是根据stepvalue的值进行变化
“fixed”-保持base_lr不变
“exp”-返回base_lr* gamma ^ iter, iter为当前迭代次数
“poly”-学习率进行多项式误差衰减,返回base_lr( 1 - iter / max_iter ) ^ ( power )
“sigmoid”-学习率进行sigmod函数衰减,返回base_lr( 1/ 1+exp( -gamma * ( iter - stepsize ) ) )
“inv”逐渐下降inv:returnbase_lr*(1+gamma*iter)^(-power)
gamma
这个参数就是和learningrate相关的,lr_policy中包含此参数的话,需要进行设置,一般是一个实数。
stepsize
这个参数表示多久(在一些迭代中)我们应该转移到下一步的训练。 这个值是一个正整数.
stepvalue
Thisparameter indicates one of potentially many iteration counts that weshould move onto the next “step” of training. This value is apositive integer. There are often more than one of these parameterspresent, each one indicated the next step iteration.
-------------与迭代相关的参数:
max_iter
最大迭代次数,这个数值告诉网络何时停止训练,太小会达不到收敛,太大会导致震荡,为正整数。
momentum
上一次梯度更新的权重,realfraction
weight_decay
权重衰减项,用于防止过拟合。
solver_mode
选择CPU训练或者GPU训练。
iter_size
这个参数乘上train.prototxt中的batchsize是你实际使用的batchsize。 相当于读取batchsize* itersize个图像才做一下gradientdecent。 这个参数可以规避由于gpu内存不足而导致的batchsize的限制因为你可以用多个iteration做到很大的batch即使单次batch有限。
------------与快照相关的参数:
snapshot
训练快照,确定多久保存一次model和solverstate,positiveinteger。
snapshot_prefix
snapshot的前缀,就是model和solverstate的命名前缀,也代表路径。
#选取训练、测试所用的网络
net(需要是基于根路径的 train_net: "models/VGG16/train.prototxt")
path to prototxt (train and val)
---------------与测试相关的参数:
test_iter
每次test_interval的test的迭代次数,假设测试样本总数为10000张图片,一次性执行全部的话效率很低,所以将测试数据分为几个批次进行测试,每个批次的数量就是batch_size。如果batch_size=100,那么需要迭代100次才能将10000个数据全部执行完,所以test_iter设置为100。
test_interval
测试间隔,每训练多少次进行一次测试。
display
间隔多久对结果进行输出
average_loss
取多次foward的loss作平均,进行显示输出。
四、solver相关函数
void Solver::Step(int iters)
【Introduction】简单的说,这个函数就是核心的优化方法,不断通过前向和反向传播来更新参数的过程。