随机梯度下降与Mini-batch梯度下降
在讲随机梯度下降(stochastic gradient descent)与Mini-batch gradient descent之前,先简要说一下批量梯度下降(batch gradient descent)。
批量梯度下降应该就是我们最初了解的那种梯度下降,特点就是每一次更新参数,都需要把数据集中全部的数据都遍历一遍。
具体看公式:
上图是一个实现逻辑回归模型参数更新的基本过程,其中
h
θ
(
x
)
h_\theta(x)
hθ(x)是假设函数,
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)是损失函数,而重复的过程,就是不断迭代,更新参数
θ
\theta
θ,可以看到,更新参数的式子中,m代表数据总量,当每迭代一步,都要计算全部数据集的求和平均,当数据集比较小这种方法还行,可以当m达到百万上亿这样的大数据集时,再用batch gradient descent就显得太慢了。
于是才有了stochastic gradient descent和mini-batch gradient descent。
对于stochastic gradient descent,其实就是先随机打断数据集,然后遍历数据集,每次得到一条数据时,就用这条数据的损失值作为损失函数,用这一条数据来更新参数,这样一步一步朝着global minimum去,但它不像batch gradient descent直接可以收敛到最小值,SGD是迂回徘徊,朝着全局最小移动,最终会在全局最小附件徘徊。
这就是SDG参数更新的公式,可以看到只依靠一条数据进行参数的更新。
而Mini-batch gradient descent则介于SGD和batch gradient descent之间,MGD每次依靠几条数据来进行参数的更新,一般选取2-10条数据作为一个mini-batch。
如上图所示,选取10作为一个mini-batch,参数
θ
\theta
θ更新时,对这十条数据进行求和平均,以此来更新参数。同时因为mini-batch是同时选取多条数据,如果计算的时候将这多条数据用向量化的方式处理,则速度会比SGD更快。
那我们该怎么判断SGD是否收敛呢?因为用SGD就是为了避免在大数据 集上计算速度太慢,不可能像BGD那样每次迭代一步就把全部数据集的损失都算出来。
其实判断SGD收敛其实是:在该条数据更新 θ \theta θ之前,先算出该条数据的损失,再进行了1000次iteration之后,计算前面1000条数据对应cost的平均值,每1000次iteration就记录一次,并将画出图像,就可以根据图像观察了。如果不像不符合预期,可能就需要调整学习率或者将1000次换成别的次数。
同时因为SGD不会像BGD那样收敛,BGD快到最小值时迭代速度变慢会呈现收敛得趋势,要想让SGD拥有这样的效果,就需要将学习率 α \alpha α设置成随迭代次数增多而减小的特性。但是一般人不会这么做,因为这样太复杂了。