翻译自Caffe官网手册
简而言之,Solver是一个神经网络的重要组成部分,通过forward 计算的loss和backward计算的梯度等参数,对模型进行优化,更新神经网络各层参数,使得loss最小以更好的拟合数据。
1.Solver分类
- 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"
)
其中,随机梯度下降法(SGD)比较常用
2.Solver的作用
- 定义并生成一个网络用来训练和测试
- 通过反复进行 forward/backward传播和更新参数 来对网络进行优化
- 根据给定参数,定期对训练中的网络进行测试评估
- 在整个优化过程中,定期备份model和solver状态
其中,在每次迭代运算中,
- 调用forward传播计算输出和loss
- 调用backward传播计算梯度
- 根据所选的solver类型,使用梯度进行参数更新
- 根据学习率、solver类型及历史数据等,更新solver状态
3.理论解释
solver方法将最优化网络看作最小化loss的过程。对于数据集\(D\),我们最优化的目标为最小化整个数据集中所有\(|D|\)数据实例的平均loss,即
\[ L(W) = \frac{1}{|D|} \sum_i^{|D|} f_W\left(X^{(i)}\right) + \lambda r(W) \]
其中,\(f_W(X^{(i)})\)是在单个数据\(X^{(i)}\)上的loss ,\(r(W)\)是以\(λ\)为权重的一个正则项。\(|D|\)可以是一个非常大的数字,所以在实际应用中,每次solver迭代时,我们用一个远小于\(|D|\)的数字\(N\)代替,每次迭代计算在数据集中随机选\(N\)个数据近似代替。
\[ L(W) \approx \frac{1}{N} \sum_i^N f_W\left(X^{(i)}\right) + \lambda r(W) \]
- 模型在forward传播中计算输出\(f_W\);在backward传播中计算梯度\(\nabla f_W\)
- solver根据误差梯度\(\nabla f_W\)、正则化梯度\(\nabla_r(W)\)等更新网络参数\(\Delta(W)\)
4.SGD Solver
随机梯度下降算法(SGD)通过线性组合负梯度\(∇L(W)\)和前一次迭代的更新权重\(V_t\),更新网络模型权重\(W\)。
- 学习率\(\alpha\)是\(∇L(W)\)的权重,momentum \(μ\)是\(V_t\)的权重。
- 假设\(W_t\)和\(V_t\)是第 \(t\) 次迭代更新后的 网络权重和网络权重更新量,则\(t+1\)次迭代后的网络权重和网络权重更新量为:
\[ V_{t+1} = \mu V_t - \alpha \nabla L(W_t) \\ \]
\[ W_{t+1} = W_t + V_{t+1} \]
- 为了在训练中使模型更好、更快地收敛,可能需要对定义solver中的超参数(\(\alpha\)和\(μ\))进行微调。
base_lr: 0.01 # begin training at a learning rate of 0.01 = 1e-2
lr_policy: "step" # learning rate policy: drop the learning rate in "steps"
# by a factor of gamma every stepsize iterations
gamma: 0.1 # drop the learning rate by a factor of 10
# (i.e., multiply it by a factor of gamma = 0.1)
stepsize: 100000 # drop the learning rate every 100K iterations
max_iter: 350000 # train for 350K iterations total
momentum: 0.9
- 初始学习率设为0.01;每10000次迭代,学习率乘以gamma因子0.1;最大迭代数为35000;
- 动量momentum设为0.9,可以使SGD下的深度学习更加稳定和快速