批梯度下降 (Batch Gradient Descent)
以线性回归为例,用梯度下降算法进行参数更新的公式为$$ heta_j= heta_j-alphafrac{1}{m}sumlimits_{i=1}^{m}(h_ heta(x^{(i)})-y^{(i)})x_j^{(i)}$$可以看到每次参数更新一次,都需要将整个训练集扫描一遍,所以称为批梯度下降,这种更新方式对于参数集很大的集合(例如m=100,000,000)运行速度十分慢,为了加快算法运行速度,提出了随机梯度下降。
随机梯度下降 (Stochastic Gradient Descent)
每次仅用一个example来更新参数$ heta$,仍以线性回归为例,随机梯度下降算法为
1. 随机重排列整个训练集(shuffle)
2. 重复下列过程多次(数据集较大时可以重复1~10次)
for i = 1, ..., m {
$ heta_j= heta_j-alpha(h_ heta(x^{(i)})-y^{(i)})x_j^{(i)}$
}
小批梯度下降 (Mini-Batch Gradient Descent)
介于批梯度下降和随机梯度下降之间,批梯度处理利用全部m个example进行参数更新;随机梯度下降只用1个example进行参数更新;而Mini梯度下降使用b(1<b<m)个example进行参数更新。仍以线性回归为例,加入我们有m=1000个example,我们可以用每b=10个example进行参数更新,例如:
Repeat {
for i = 1, 11, 21, ..., 991 {
$ heta_j= heta_j-alphafrac{1}{10}sumlimits_{k=i}^{i+9}(h_ heta(x^{(k)})-y^{(k)})x_j^{(k)}$
}
}
算法收敛性
批梯度处理能够保证算法收敛到最小值(如果选择的学习速率$alpha$合适的话),可以plot代价函数$J( heta)$随迭代次数的曲线,如果曲线是总是下降的,则能够收敛,反之需要调整学习速率。
随机梯度下降并不能保证算法收敛到最小值,最终结果可能是在最小值附近来回游走,为了观察其收敛特性,可以plot每100(1000)次迭代时100个example代价函数函数$ ext{cost}( heta,(x^{(i)}, y^{(i)}))$的平均值,如果是下降趋势,则可以收敛,否则可能需要调整增大或者减小平均的example数(将100改为1000或者10等),减小或者增大学习速率。
在线学习 (Online Learning)
之前的算法都是有一个固定的训练集来训练模型,当模型训练好后对未来的example进行分类、回归等。在线学习则不同,它对每个新来的example进行模型参数更新,因此不需要固定的训练集,参数更新的方式则是采用随机梯度下降。在线学习的优势是模型参数可以随用户的偏好自适应的进行调整,以logistic回归为例,在线学习方式如下:
Repeat forever {
1. 获取当前example (x, y)
2. 使用(x,y)进行参数更新:$ heta_j= heta_j-alpha(h_ heta(x)-y)x_j$
}
MapReduce和数据并行化
这部分内容Andrew Ng讲得不多,可以认为仅仅讲了多个机器的求和问题,比如如何求解1+2+3+...+1000?Map过程:四个机器分别计算1+2+...+250,251+252+...+500, 501+502...+750,751+752+...+1000,然后Reduce过程:将四个机器求和的结果sum1,sum2,sum3,sum4汇总到一台机器上,计算sum1+sum2+sum3+sum4。