# 优化器(Optimizer)

目的是为了使网络更快收敛

# SGD

分批次进行训练,每次更新反向传播损失

wt+1=wtαg(wt)w_{t+1}=w_t-\alpha g(w_t)

其中α\alpha为学习率

  • 易受样本噪声影响:如果样本正确可以沿着梯度下降,但是如果样本错误,则可能沿着梯度反方向更新梯度
  • 可能陷入局部最优解

# SGD+Momentum

vt=ηvt1+αg(wt)v_t=\eta v_{t-1}+\alpha g(w_t)

wt+1=wtvtw_{t+1} = w_t - v_t

α\alpha为学习率,η\eta为动量系数,除了计算当前梯度,还会加上一次的梯度方向,如图所示,可以抑制样本噪声的干扰

# Adagrad优化器

st=st1+g(wt)g(wt)s_t = s_{t-1}+g(w_t)g(w_t)

wt+1=wtαst+ϵg(wt)w_{t+1} = w_t - \frac{\alpha}{\sqrt{s_t+\epsilon}}g(w_t)

α\alpha为学习率,ϵ\epsilon为防止分母为零的小数,但是学习率下降太快,可能还没收敛就停止训练了

# RMSProp优化器

st=ηst1+(1η)g(wt)g(wt)s_t = \eta s_{t-1}+(1-\eta)g(w_t)g(w_t)

wt+1=wtαst+ϵg(wt)w_{t+1} = w_t - \frac{\alpha}{\sqrt{s_t+\epsilon}}g(w_t)

在上面的基础上,添加了一个控制衰减系数去调节,防止梯度下降过快。学习率变成了学习率处以二阶动量

# Adam优化器

mt=β1mt1+(1β1)g(wt)m_t = \beta_1 m_{t-1}+(1-\beta_1)g(w_t)

vt=β2vt1+(1β2)g(wt)g(wt)v_t = \beta_2 v_{t-1}+(1-\beta_2)g(w_t)g(w_t)

mt=mt1β1tm_t^{'} = \frac{m_t}{1-\beta_1^t}

vt=vt1β2tv_t^{'} = \frac{v_t}{1-\beta_2^t}

wt+1=wtαvt+ϵmtw_{t+1} = w_t - \frac{\alpha}{\sqrt{v_t^{'}+\epsilon}}m_t^{'}

β1,β2\beta_1,\beta_2都是控制衰减的系数,添加了一阶动量和二阶动量进行控制