编程作业放到了github上:coursera_machine_learning
0. 是否还需要更大的数据集
一开始接触机器学习的时候,特别天真的以为,只要数据量够大,训练时间够长,一定能够训练出特别好的模型的。
但是事实并不是这样的。
在以下情况下,增大数据集是有用的,因为还没有到达饱和状态:
但是在以下情况下,增大数据集是徒劳的,因为已经达到了饱和状态:
1. 三种梯度下降法比较
1.1 Batch Gradient Descent
更新一次参数,需要求和所有数据的偏导:
这样的梯度下降,只要 α 取得不过大,最终就一定能够落入“全局最优解”内:
但是当数据量特别大的时候,迭代将变得特别慢。
1.2 Stochastic Gradient Descent
用当前数据的偏导去更新参数,需要注意,要打乱数据集,这样收敛更快,不然的话,保持这某一种次序,可能导致梯度总向着相反方向,虽然最终可能会被拉回来,但是速度就慢了:
与Batch Gradient Descent相比,迭代的速度就快多了。
但这个方法,所需要的迭代次数可能会更多,因为每次跌代,并不一定都是向着正确的方向的,从而导致相同迭代次数下,该模型的表现比不过Batch Gradient Descent:
1.3 Mini-Batch Gradient Descent
为了综合速度和performance,提出Mini-Batch Gradient Descent。
更新一次参数,求和一部分数据的偏导,Mini-Batch的取值2~100:
2. Online Learning
在线学习的意思就是说,来一个数据,更新一次模型,相当于数据集不确定的stochastic gradient descent:
3. Map Reduce
在海量数据下,“并行计算”是解决计算速度慢的一个方法。map reduce是并行计算的一种算法,相当于在多个平行时空在对不同的数据进行同一种算法,最后再把这几个计算结果求和。
比如说对于Batch gradient descent,一次更新的计算量非常大,为了提升速度,就可以采用map reduce算法:将数据分配到各分机上,然后分别同时求和,最后,再把这4台分机上的结果求和,得到最终的结果。