大数据集的机器学习
问题引出
在Week6(下)中我们曾说过Banko and Brill设计的一个分类器,最后得出了一个结论“It’s not who has the best algorithm that wins .It’s who has the most data”
但是在Week6(上)中我们说对高variance增加数据是有用的,而对于高vias帮助不大。所以什么时候数据多比较好,要用学习曲线来判断。
在Hsuan-Tien Lin的第十一讲说到随机梯度下降,可以去看看。我们先比较下几个梯度下降
Mini-batch gradient descent
区别:
Batch gradient descent 迭代的时候要使用所有m笔数据
Stochastic gradient descent迭代时随机使用1笔数据
Mini-batch gradient descent 迭代的时候使用b笔数据(通常b在2-100之间)
可以向量化形式提高计算速度
随机梯度下降收敛性
(1)批量梯度下降时,把Jtrain随着迭代次数变化的曲线画出来,判断是否收敛。但是如果数据规模很大,代价就太大了。
(2)随机梯度下降时,每次更新θ,都用代入下式:
每迭代i次,就求这i次代价的平均值,再绘制平均值与i迭代次数的曲线。(比如,第一次迭代就是一次平均,两次迭代就是两次的平均值……)
每迭代k次,横坐标是迭代次数;纵坐标是代价平均:第1次的代价,第1次和第2的代价的平均……k次代价的平均。看收敛情况时,重点看最后一个k次迭代的曲线。所以可以只绘制最后k次迭代的曲线
绘制最后k次迭代的曲线
|
可以看出,我们选了个小的α后,学习曲线下降趋势明显多了 |
|
对于不平滑的状况,我们可以选用更大的N。左图可以看出,N更大时更平滑。 |
|
左图蓝色线,抖动明显且不下降,增加迭代次数k看它下降(红色线);如果它没下降,变成绿色的线,就有可能模型有问题 |
|
选一个小的α |
从上面分析,最后k次迭代时,要想代价函数变小,可以增加N,增大迭代次数,减小α。
在Hsuan-Tien Lin第十讲说到,梯度下降时,学习率η(这里的α)越靠近最优解越小。
随机梯度要想θ收敛,也要使α越来越小。因此,可以令α随着迭代次数的增加而下降
在线学习
在线学习的特点就是数据是一笔一笔进来的,而不是一下子就收集完整的训练数据。
比如你经营一个在线物流网站,一个用户进来时,会提供寄送物件的发送地和目的地。你要提供一个报价,用户考虑要不要使用你的物流服务。(选择y=1,不选择y=0)
所以,机器学习需要构建一个模型,来预测用户接受的概率,以便调整价格。
x用来捕获用户属性,如发送地,目的地和价格。
算法
在线学习一次只算一个用户,算完之后,这个数据并不保存。好处就在于模型是不停的调整着的,不像前面说的方式,模型针对训练数据,训练完成模型就固定了。在线学习的模型更有针对性。每次交易也可不止一笔数据,你可以提供几种方案,让用户选择,看他是否接受其中一种。
再举一个例子
产品查询系统
如用户查询“Android phone 1080p camera”
现在有100部Android phone,结果是要返回用户最可能点击查看的10部。
特征x={features of phone,how many words in user query match name of phone,how many words in query match description of phone,etc}
用户点击y=1,否则y=0。
模型
其他在线学习例子:Choosing special offers to show user;customized selection of news articles;product recommendation;……
Map-reduce and data parallelism
在Hsuan-Tien Lin的第十一讲说到梯度下降,求梯度:
是看遍所有数据求梯度平均。所以,对于大规模数据而言,让一台机器求梯度平均,计算代价十分高。
如果能够有很多台机器,每台分担一部分计算量,最后再把所有梯度相加求平均,这样可以变得高效些。
不过,这里需要注意的是,让多台机器分工,最后的结果是线性求和。如果不同机器使用的数据有前后关联性,就不能用这种方式。
举例:
这样的方式就叫做map-reduce,形象图为:
有很多算法都要用到求和,所以这样的算法都可以考虑用map-reduce,但是还是强调数据之间是否有前后关联性(比如机器A入出的数据是否是机器B的输出)。map-reduce也不一定都是多台机器,如果一台机器多核,也可以只用一台机器: