Machine learning学习记录(二)

267 阅读6分钟

经过二十天不到的业余时间学习,终于完成了ng的machine learning课程。 所以这一篇记录是ml课程的结束,后面我会继续参加深度学习课程的学习。

第六周的课程是机器学习实用建议和系统设计,
实用建议:划分训练集、验证集和测试集,务必要注意不要在测试集上验证。这样测试集测试出来的指标才有参考意义,否则相当于作弊。另外需要通过这样的划分验证,可以尝试不同的参数和技术选择,帮助我们做决定。
系统设计:ng介绍了设计一个系统的一般性方法,主要内容有:先从一个最简单的系统开始-> 通过learning curve的绘制来分析系统需要从哪个方面来改进->引入了precision和recall以及F measure来评定性能(对于skewed class,accuracy不能作为指标,只需要简单的全部预测一个大部分的场景即可获得很高的accuracy)。这几点虽然说是比较基础但对一个ml系统的设计来说有很重要的指导意义。

第七周介绍了一个重要的算法svm(支持向量机).也称为large margin算法,核心思想是让不同的class之间的margin最大化,其计算是通过向量的距离来做。svm可以应用不同的kernel(核函数),常见的是高斯函数和线性(可以认为没有)。高斯核函数计算代价较高,适合比如几千个样本,小于1000个feature的情况,会有比较好的性能。svm算法在数据量不是特别大的情况下就可以取得不错的效果,且训练较快。神经网络虽然好,但计算代价一般都比较大。

第八周介绍了非监督学习。主要是K-means聚类算法和pca(主成分分析法)。其中k-means的算法描述起来非常简单和优雅,实现也比较容易。但它的主要问题在于比较随机,不一定可以收敛到一个比较好的效果。比如实用k-means压缩图片,我提供了一个几种颜色的图,聚类出来的效果比较差。 pca的实用性在于它可以用来减少feature的个数且保留大多数的信息量,主要用在降维(可以到2维或者3维从而实现可视化)和数据压缩。pca的实现是通过矩阵svd函数的计算(特征值和特征向量),都是调用现成的库来做,编码比较简单。

第九周介绍了一个比较special的case,异常检测。这是一种介于监督学习和非监督学习之间的一种比较特殊的task,其用来训练的数据集可以认为是unlabeled,但评价用的验证集和测试集需要有labeled data。其思想是通过假设所有的feature都符合高斯分布(或者多维高斯分布,这样可以利用维度的关联信息),通过训练集的数据获取到对一个数据概率的评价。从而最终实现了对新数据的评估(是否是异常的)。这种场景是我们只能获取到有限的positive样例的情况,我们无法从有限的例子中学到所有可能的异常的特征,但我们可以通过分布的概率来推断新的样例可能大概率是有问题的。它和监督学习的区分在于我们的正例样本是否足够,新出现的例子是否有可能从历史中习得。

第十周介绍了工业的大数据场景下,我们的方法如何改进。比如梯度下降法,在实际操作中如果一下子批量几百万的数据,那么内存都扛不住。我们改进的算法是随机梯度下降和小批量梯度下降。这很容易理解,批量梯度的n=1然后不停的迭代就是随机梯度下降;n=m就是我们原始的算法。我们总可以先把数据随机化,然后再进行梯度下降的操作,我认为是一个比较好的实践方法。此外,ng还介绍了map reduce.利用map reduce可以进行分布式的任务,对于任何大数据场景来说这都是一个非常普遍和重要的需求。另外有一种流式的场景,比如taobao这样的公司,每天都会产生大量的数据。我们需要不停的用新数据去喂养我们的模型,一次训练以后就丢弃数据。模型慢慢的被改变,并且从新数据中学习到新的特征,因此理论上你的model也变的流行,你利用了大量的新数据。

第十一周是最后一周,ng介绍了一个ocr的例子。从这个例子中,我们学到的是把任务分解成一系列有顺序的子任务,组成了pipeline。 ng介绍了一个天花板分析方法,非常的有用和有启发性。在我们构建一个简单的pipeline之后我们需要决定如何分配接下来的工作重心。这样,ceiling analyze方法可以帮助我们。具体是这样的:我们从pipeline的前面到后面分别用100/100成功率的输入去对实际结果进行替代,这样我们就可以得到每一步的误差。通过分析误差所占的比重,我们可以做出很明智的决策,而不是只靠拍脑袋了。此外,ng还介绍了人工造数据(在现有数据上加工)、众包数据、自己计算时间然后标记数据的方法。如果能把数据量大10倍,很多时候结果会有大的提升。图片的ocr例子中,文字的识别是通过一种叫做 sliding windows的技术来实现。就是一个小窗在大图片中不停的移动,对每一次识别都进行评估。从这个方法我认识到图片相关的任务是非常expensive的,哪怕仅仅是识别,因为可能一张大图同样的操作会迭代几千次。我们当然可以利用gpu,但代价同样不菲。