人工智能之梯度下降法(3)
前言:人工智能机器学习有关算法内容,请参见公众号“科技优化生活”之前相关文章。人工智能之机器学习主要有三大类:1)分类;2)回归;3)聚类。今天我们重点探讨一下随机梯度下降法SGD^_^。
通过前面介绍,我们知道机器学习优化算法中,使用较多的是基于梯度下降GD的优化算法,但是一般梯度下降法会存在:靠近极小值时收敛速度减慢,“之字形”地下降等缺点。
针对一般梯度下降法的缺点,出现了不同的梯度下降法的变形或变种,即:批量梯度下降法BGD、小批量梯度下降法MBGD、随机梯度下降法SGD。其主要区别是不同的变形在训练数据的选择上。
上一篇介绍了批量梯度下降法BGD,它在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢。于是提出了随机梯度下降法SGD。
今天我们主要介绍一下随机梯度下降法SGD。
随机梯度下降法概念:
随机梯度下降法SGD(Stochastic Gradient Descent)是为了解决批量梯度下降法由于样本数目众多而带来训练过程异常缓慢问题而提出的。
随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。随机也就是说用样本中的一个例子来近似所有的样本,来调整θ,其不会计算斜率最大的方向,而是每次只选择一个维度踏出一步;下降一次迭代只更新某个θ,报着并不严谨的走走看的态度前进。
随机梯度下降法基本思想:
随机梯度下降法SGD基本思想是通过随机选取少量训练输入样本来计算局部梯度,进估算整个梯度。通过计算少量样本的平均值可以快速得到整体梯度,对实际梯度有很好的估算,这有助于加速梯度下降,进而加速学习过程。
其数学形式如下:
利用每个样本的损失函数对θ求偏导得到对应的梯度,来更新θ:
具体的伪代码形式为:
1. Randomly shuffle dataset;
2.repeat{
for i=1, ... ,m{
(for j=0, ... ,n)
}
}
随机梯度下降SGD是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将θ迭代到最优解了,对比批量梯度下降BGD,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
迭代过程:
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:
上图是每次迭代后的等高线图,每个不同颜色的线表示代价函数不同的值。随机梯度下降SGD的每次迭代,有可能变大或变小,但总体趋势接近全局最优解,通常参数值会十分接近最小值。
算法Python代码实现:
下面的Python代码实现了随机梯度下降法:
import numpy as np
import random
#This is a sample to simulate a function y =theta1*x1 + theta2*x2
input_x = [[1,4], [2,5], [5,1], [4,2]]
y = [19,26,19,20]
theta = [1,1]
loss = 10
step_size = 0.001
eps =0.0001
max_iters = 10000
error =0
iter_count = 0
while( loss > eps and iter_count
loss = 0
#每一次选取随机的一个点进行权重的更新
i =random.randint(0,3)
pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]
theta[0] = theta[0] - step_size * (pred_y - y[i]) * input_x[i][0]
theta[1] = theta[1] - step_size * (pred_y - y[i]) * input_x[i][1]
fori in range (3):
pred_y = theta[0]*input_x[i][0]+theta[1]*input_x[i][1]
error = 0.5*(pred_y - y[i])**2
loss = loss + error
iter_count += 1
print 'iters_count', iter_count
print 'theta: ',theta
print 'final loss: ', loss
print 'iters: ', iter_count
随机梯度下降法优点:
1)训练速度快;
2)可以用作在线学习。
随机梯度下降法缺点:
1)准确度下降;
2)不一定是全局最优;
3)不易于并行实现。
SGD与BGD比较:
随机梯度下降法SGD其实和批量梯度下降法BGD原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对于训练速度来说,随机梯度下降法SGD由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法BGD在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法SGD用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法SGD一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。
结语:
随机梯度下降法SGD是梯度下降法的一个变形或变种算法。常用于机器学习和人工智能算法求解中。随机梯度下降—最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向,整体趋势是向着全局最优解。随机梯度下降法 SGD训练速度很快,但准确度不够,很有可能不是收敛到全局最优解。
后记:
由于随机梯度下降法SGD一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。那么,有没有一个折中的办法能够结合两种方法的优点呢?答案是有的,具体究竟是什么方法,请听下回分解。
(未完待续)
------以往文章推荐-----
领取专属 10元无门槛券
私享最新 技术干货