小批量随机梯度下降算法(小批量SGD)
每次从从训练样本集上随机抽取一个小样本集,求其预测值和真实值误差的平均值,作为目标函数,将参数沿着梯度的方向移动,从而使当前的目标函数减少得最多。
小样本集的个数为batch_size,通常为2的幂次方,有利GPU加速
代价函数的总和为
1
m
∑
i
=
1
m
L
(
x
(
i
)
,
y
(
i
)
,
θ
)
\dfrac{1}{m}\sum_{i=1}^mL(x^{(i)},y^{(i)},θ)
m1i=1∑mL(x(i),y(i),θ)
真SGD
每次随机选取一个样本,batch_size=1
遇上噪声容易陷入局部最优
批量SGD
每次迭代都选取所有样本,batch_size=n
每次更新更准确,每次更新要计算所有样本的平均误差,计算代价大
优化器·
SGD还有多种变体,其区别在于计算下一次权重更新时还要考虑上一次权重更新,而不仅仅考虑当前的梯度值,比如带动量SGD,Adagrad,RMSProp等这一灵感来源于物理学,将优化过程想象成小球从损失函数上滚下来,当小球的速度够大时,小球不会困在上谷,避免了局部最优化,也就是不仅要考虑小球当前的斜率,还要考虑小球当前的速度(来源于之前的加速度)。
实现代码
import tensorflow as tf
past_velocity=0.
momentum=0.1 #不变的动量因子
while loss>0.01:#优化循环
w,loss,gradient=get_current_parameters()
velocity=past_velocity*momentum-learning_rate*gradient#上一次的参数
w=w+momentum*velocity-learning_rate*gradient
past_velocity=velocity
updata_parameter(w)
链式求导:从损失函数开始,从顶层反向作用至最底层,求出损失值对每个参数的导数。