斯坦福机器学习(10-11)
前情回顾
我们在上一章里介绍了非监督学习算法。分别是聚类算法,降维,异常检测。还有一部分推荐系统的协同过滤算法我并没有涉及。这块我会结合《深度学习推荐系统》的读后感来重点书写。这是这门课的最后2周,而且没有编程作业的两周。
大型数据集的学习
因为梯度下降算法,每一次过所有数据样本,这是往下坡下了一步。如果数据样本过大,那么会花费非常多的时间。这便引入了随机梯度下降。这里就是在梯度下降的时候,是在最开始把数据随机打散,然后选1个数据直接做梯度下降。这么做会加快迭代速度,但是会破坏每一步都朝着正确方向迈出的假设。因此算法虽然会逐渐走向全局最小值,但是可能无法站到最小值那个点,而是在附近徘徊。
一种折中的手段,批量数据的梯度下降。也就是既不用全量数据也不是用单个数据那样。
另外在选取a的时候,a = const1 / (迭代次数 + const2)
另一种模式是在线学习。也就是我们基于固定的一波数据在哪里训练。我们有一个网上应用,数据会像水流一样源源不断的流过来,我们基于这类流式的数据在学习。这样做的优点是如果你有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,就像你的用户的品味在缓慢变化,这个在线学习算法,可以慢慢地调试你所学习到的假设,将其调节更新到最新的用户行为。另外一点是它的空间是O(1)的,不需要额外的存储,数据用完就可以丢掉。
另外一种手段就是通过map reduce的方式,我们可以把一大波数据,拆开来,交给多台机器去求和,最后会有一个master把各个机器求得的结果,再求和,然后去更新theta。
image.png
很多高级的线性代数函数库已经能够利用多核CPU的多个核心来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故(比调用循环快)。
图片文字识别
这门课的最后讲了一个实际的例子,介绍了一个由多个机器学习模块pipeline组装成的应用应该如何调试。
比如下图的图像中识别文字的系统。
image.png
为了完成这样的工作,需要采取如下步骤:
- 文字侦测(Text detection)——将图片上的文字与其他环境对象分离开来
- 字符切分(Character segmentation)——将文字分割成一个个单一的字符
- 字符分类(Character classification)——确定每一个字符是什么
在一张图片中我们需要找到所有的行人。
我们需要一个模型去判断一个图片是否是人。然后我们会有一个滑动窗口,多种窗口大小,依次去在整副图片里滑过去,每滑一步调用模型进行一次判断,最后我们就能得到一些含有行人的框。
image.png
滑动窗口技术也被用于文字识别,首先训练模型能够区分字符与非字符,然后,运用滑动窗口技术识别字符,一旦完成了字符的识别,我们将识别得出的区域进行一些扩展,然后将重叠的区域进行合并。接着我们以宽高比作为过滤条件,过滤掉高度比宽度更大的区域(认为单词的长度通常比高度要大)。下图中绿色的区域是经过这些步骤后被认为是文字的区域,而红色的区域是被忽略的。
image.png下一步是训练一个模型来完成将文字分割成一个个字符的任务,需要的训练集由单个字符的图片和两个相连字符之间的图片来训练模型。
image.png
模型训练完后,我们仍然是使用滑动窗口技术来进行字符分割。
最后一个阶段是字符分类阶段,利用神经网络、支持向量机或者逻辑回归算法训练一个分类器即可。
获取数据
在训练模型如果需要更多数据,一般有2种手段。
- 利用已有的数据,然后对其进行修改,例如将已有的字符图片进行一些扭曲、旋转、模糊处理。
- 人工手动收集,标记数据。(要扩大10倍的数据规模,这往往比想象的代价小)
上限分析
在机器学习的应用中,我们通常需要通过几个步骤才能进行最终的预测,我们如何能够知道哪一部分最值得我们花时间和精力去改善呢?这个问题可以通过上限分析来回答。
上限分析中,我们选取一部分,手工提供100%正确的输出结果,然后看应用的整体效果提升了多少
如果我们令文字侦测部分输出的结果100%正确,发现系统的总体效果从72%提高到了89%。这意味着我们很可能会希望投入时间精力来提高我们的文字侦测部分。
接着我们手动选择数据,让字符切分输出的结果100%正确,发现系统的总体效果只提升了1%,这意味着,我们的字符切分部分可能已经足够好了。
最后我们手工选择数据,让字符分类输出的结果100%正确,系统的总体效果又提升了10%,这意味着我们可能也会应该投入更多的时间和精力来提高应用的总体表现。
image.png
总结
- 随机迭代和map reduce 解决大规模数据的模型训练
- 随机迭代的问题是可能无法到最优,会在最优附近震荡。同时要注意随着迭代次数递减学习率
- 在多组件的机器学习系统中,我们需要数据2种的获取方式,通过变形已有数据集,或者人工获取标记。
- 上限分析是从前到后,一次把该组件的输入的正确率变为100%,看对整个系统提升了多少