开发大型机器学习系统的经验教训(来自googlesearch blog) 不周

导读近期在googlesearch blog上发布了一篇题为《Lessons learned developing a practical large scale machine learning sys

近期在googlesearch blog上发布了一篇题为《Lessons learned developing a practical large scale machine learning system》的博客,作者应该是google机器学习团队的成员,列举了他们在开发一个可伸缩的大型机器学习系统Seti时所积累的一些经验教训。虽然所列出的三点教训看起来都很简单,似乎显而易见,但在现实操作中我们往往会受到种种的“诱惑”而走向另一个极端。特别典型的情景是,这些道理对于工作在一线的有过一定的项目经验积累的工程师来说,是有一定的直观感受的,但由于没有很好地概括描述或通过一个有权威性的嘴巴说出来,而可能被一些只存在于设计纸上的美妙构想而引向错误的方向,导致劳民伤财,积重难返。最简单的道理,却最容易被人们一遍又一遍地触犯着,所以想把它们写下来,一方面提醒自己以后少受这样的诱惑而犯错,另一方面也希望给类似应用场景与想法的朋友有一个权威性的归纳与佐证。

以下大都属于充分尊重原博客基础上的意译,穿插部分自己的看法。

这里说的机器学习系统其实是指一个分类系统(或者说模式识别系统),大部分情况下,这两者可以等同而视之,但在回复里也有人指出机器学习的范畴应该比较模式识别更大,这里不再执着于谁大谁小的问题,只需要知道,下面提到的机器学习系统或Seti主要是一个分类器,它具有如下的一些特点:

对于一个预测或分类问题,如果你没有足够的数据量,你得关注于如何在少量的数据样本下充分利用统计知识构建一个精巧的分类器,反之,如果你的数据量爆棚,你就得关注你的系统如何才能适应如此庞大的样本量,并从中挖掘中有用的信息来。Seti所解决的问题规模大体上是像下表所描述的那样的:

Training set size Unique features

Mean 100 Billion 1 Billion

Median 1 Billion 10 Million

通常来说,一个好的机器学习系统需要更多地强调精度,但面对一个大型的系统时作这样的片面强调容易犯下很多错误,以下是我们在开发Seti过程中积累的几个经验教训,当然有一些是事后我们才总结出来的,当时我们并没有意识到。(注:作者应该是想说,有些因素跟精度一样不能忽视,甚至更重要)

1、保持系统的简单,即使这意味着会损失一定的精度。(Keep it simple, even at the expense of a little accuracy)

诱惑:让你的分类器在不同领域的应用中都具有高精度是非常重要的,所以我们应该专注于算法的精度上。

但是,实际中的算法有其它几个方面具有同等重要的地位:

  • 容易使用:如果这个系统还有其它人或其它团队在使用,他们必定希望这个系统在配置与使用上都是简单的,他们可能不是机器学习的专家,所以他们也不希望把时间浪费在系统的启动与运作上。
  • 系统的可靠性:大家更注重在实际环境中部署一个可靠的机器学习系统,它必需是稳定的并且不需要总是去关注它是否崩溃的。早期的Seti虽然在精度上更好,但它的复杂性、对网络与GFS文件系统的压力、需要持续关注等缺点导致了很多人都不愿意去部署它。
  • (很多情况下,我们都可以认为以上两点是等价的,即:系统的简单易用约等于稳定可靠)

    Seti通常应用于对原有系统有极大提升效果的场景(参看教训3),因此大家都不太会关注Seti所使用的不同算法所造成的在精度上的细微差别。另一方面,这些精度上的小差别经常可以通过其它的手段来抹平,比如更好的数据过滤、添加其它更合适的特征、调整参数等等,如果这个系统是稳定的、可扩展的、简单易用的,以上的这些额外的步骤也更容易实现,而这些系统特点往往决定了它会被团队接受或抛弃。

    对于学术界来说,设计一个精度稍差但更稳定与简单易用的算法并不是一个有吸引力的事情,但依据我们的经验,这个在实际当中具有非凡的价值。

    2、从当前的一些具体的应用开始。(Start with a few specific applications in mind)

    诱惑:构建一个不限定于任何特定应用的系统,不单能囊括当前的各类应用,还能适用于未来的各种分类任务。

    但是,我们决定聚焦于一小撮的初始的应用上,这个决定基于如下几个原因:

    3、知道什么时候说“不”。(Know when to say “no”)

    诱惑:我们有了锤子,所以我们眼中什么都是钉子,任何的问题都可以用机器学习系统来解决。

    很早以前我们就发现,虽然机器学习系统带来了明显的收益,但它同时也给整个系统带来了复杂性、不透明性与不可预测性。有些情况下,简单的技术已经足以解决手头的问题,从长远来看,与其把努力花在整合、维护与诊断在线机器学习系统上,还不如花在其它的一些提升系统性能的方法上。

    Seti适用的前提是对现在的系统上有明显的预测效果上的提升,我们也常常建议大家避免把它应用于效果提升不明显的场景。

    补充1:看到Seti所应用的数据规模时,我的第一反应是怎么可能得到这么大量的标记数据,因为训练分类器是需要标记好的数据集的,同样文中屡次提到分类器的精度,而计算分类器的精度同样不能缺少标记数据。我的理解是:一种情况下,这些标记数据是来自于google用户无意识的点击贡献,另一种情况是,他们使用的是半监督学习的方法,从一个小型的人工标记的数据集开始训练,然后覆盖到数据的全集。

    补充2:文中的一个主要的观点是:商用的系统与学术界追求的系统其目标是不一样的。学术界会倾向于探寻即使是数据量不足的情况下,怎么得到有统计意义的结果,而精度永远都是最重要的。商业界在不缺乏数据的情况下需要关注于如何从带噪声的数据中过滤出有价值的信息,同时系统必须具有可扩展性,此时,精度并不是一个唯一重要的因素。

    关于作者

    阿稳, 豆瓣, 算法工程师

    免责声明:本文章由会员“高俊东”发布如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系