大数据量带来高计算代价,所以首先得确定,是不是大数据量有帮助?
检查Jcv 和 Jtrain 的学习曲线。
如果如左图,有高方差,则说明过拟合了,增加数据量有帮助;
如果如右图,增加数据量没有太大帮助。
普通的梯度下降,当m很大时,下面蓝色方框的计算会耗时很高。
普通的梯度下降,又称为batch gradient descent,每次都需要读取所有数据。
这里就引出了随机梯度下降法。
- 随机shuffle数据集每次考虑一条数据,向着这个数据进行一点梯度下降,来更好地fit它。
批量梯度下降每次都考虑全部数据集,相比之下,随机梯度下降少了一次求和操作(左侧红色方框),它随机地慢慢地改善。进一寸有一寸的欢喜。
梯度下降的方向,每次都没那么完美,但在曲折中前进,最终还是朝着全局最优解的方向去(虽然最终可能达不到全局最优):
通常这个过程(外部循环)重复1到10次。当m足够大时,1次就够了。
介于随机梯度下降和批量梯度下降之间。每次用小批量b的数据来做梯度下降,比如 b = 10,通常取2到100。
相比随机梯度下降,mini-batch仅在向量化计算时才有优势,相当于并行计算了b个数据。
每隔一定的数据范围,画出代价函数,观察学习曲线,可能有以下结果。
左上:有时使用较小的学习参数α,会得到微小的改善;
右上:在更大的范围内计算平均代价值,能得到更平缓的曲线;
左下:看到代价函数并不收敛,可能在更大范围内计算能看出下降,也可能看出并没下降,需要调参或重新建模
右下:代价函数在发散,需要减小α
可以通过不断减小α,来使随机梯度下降收敛到全局最优解,越到最后,步子越小:
当数据流很大且源源不断时,每次用最新的一个数据来更新θ,用完就扔掉。
在线学习能跟踪用户喜好的变化。
再比如,商品搜索的例子,需要计算CTR(click through rate)用户点击的概率。每次用户搜索时,都会给用户推荐top10的结果;接下来再根据用户的实际点击情况,把这10个结果作为训练集输入,调整模型的θ。
也有其它例子,如:岗位推荐、新闻推荐、商品推荐等。
这种情况下,往往全量数据过大,没有必要每次都用全部数据计算,在线计算是不错的选择。
map-reduce可以使用map-reduce进行分布式计算,分批计算,汇总结果:
即使只有单机,也能多进程并行计算:



