164

一分钟整明白Tensorflow Extended

 6 years ago
source link: https://zhuanlan.zhihu.com/p/31041536?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一分钟整明白Tensorflow Extended

TFX: A TensorFlow-Based Production-Scale Machine Learning Platform

本文介绍了基于tf搭建一套通用机器学习平台的关键部分和大体流程,但没有给出更详细的介绍。

是KDD 2017 Applied Data Science Paper,作者是谷歌的一大票人,这么多作者,按照经验来看应该是这个平台的主要开发人员。本文介绍的平台取名Tensorflow Extended,也就是说其核心组件都是使用tensorflow来完成的,可以理解为是基于tensorflow的一次二次开发。那么这个tfx和tf有什么区别呢?我的理解,区别主要在于tf提供的是一套功能,可以用来执行模型训练相关的一系列工作,而tfx是构建在tf基础之上的一个包含了机器学习整个生命周期的完整系统,这个系统不只包含了tf所提供的模型训练等机器学习相关功能,还提供了如数据校验和验证、模型热启动、线上服务、模型发布等重要功能。

这篇文章的意义并不在于手把手教你如何搭建一套tfx,而是阐释了搭建一套tfx系统所需要包含的主要组件,以及这些组件在实现时需要考虑哪些关键点,还有作者团队在这其中积累的经验教训。换句话说,更多的是一篇“授人以渔”的文章。对于希望动手实现一套类似tfx这样通用机器学习平台的人来说,具有着重要的指导意义。下面将我认为比较有价值的部分做一摘录和解读。

整体设计原则

tfx的核心设计原则包括以下几点:

  • 构建可服务于多个学习任务的统一平台。这要求系统具有足够的通用性和可扩展性。
  • 支持持续训练和服务。这两个事情看起来简单,但是如果考虑到其中的风险控制和自动化问题发现等细节的话,也并不简单。
  • 人工干预。如何优雅地让人参与整个流程,解决机器不好解决的问题,也是一个挑战。
  • 可靠性和稳定性。这里的可靠性和稳定性不只指的是服务不崩溃这个级别,还包括在数据层面发生问题的时候服务的效果依然可以保持稳定可靠。

数据分析、转换和验证

数据是机器学习系统的核心,如何处理数据决定了整个模型的质量,这部分作者介绍了数据分析、转换和验证方面的实现要点。

数据分析指的是系统会对进入到系统的数据进行自动地统计分析,例如数据值的分布,特征在样本上的分布,每个样本上特征的分布等等。同时还支持对数据做分片统计,例如分别对正负样本的统计,对来自不同国家数据的统计,等等。这里的难点之一在于,在大数据和时效性要求下,很多数据统计的精确值是不好计算的,所以很多时候 需要使用流式近似算法来计算足够好的近似值。

所谓数据转换,指的是从原始数据到可训练特征之间的种种数据变换,例如离散化、特征映射等等。里面还提到一些对稀疏特征的处理细节。

这部分比较重要的一点是保证训练和服务时数据转换的一致性,这两者不一致往往会导致模型效果变差。tfx的做法是将数据转换也作为模型的一部分输出,从而避免这种不一致的发生。换句话说,是通过在训练阶段和服务阶段复用同样的代码逻辑来保证一致性,而不是两个地方分别实现不同代码,这是很重要的一点。从我的经验来看,做不到这一点的话,不仅可能会出现特征转换不一致的问题,还会使得开发工作量增大,并且增加正确性验证的工作量。

所谓数据验证,指的是进入系统的数据是否符合预期,是否存在异常。tfx的做法是引入一个数据schema的结构,用来指定对一份数据的约束,例如数据的类型、是否必填、最大最小值等等。这么做的目的是防止不符合预期的数据进入到模型训练阶段,影响模型的质量。有了这个schema,就可以对进入系统的数据做验证,进一步,还可以给出建议,尤其是在数据本身发生了变化,原有的约束应该发生改变的情况下,系统可以自动发现可能的变化,反馈给开发者,让开发者决定是否接纳系统提出的改进建议。下图是一个使用schema进行数据验证的例子,图中红色内容是验证后给出的建议。

上面提到的约束条件可以进行扩展,但是作者给出的建议是,过于复杂的约束常常难以给出适合的约束条件,而且如果数据发生变化会难以维护。出于是的数据验证更好地服务于系统,并且方便用户使用,下面是一些核心的设计原则:

  • 用户应该一眼就能看明白什么出了问题,以及问题的影响面。
  • 异常应该简单明了,并且用户明白如何处理。例如,你可以说某个特征值超出了某个范围,但不要说某两个特征的KL散度超过了阈值。
  • 根据数据的自然变化提示给出新的schema建议。很多数据会随着时间发生变化,所以需要考虑这一点。
  • 希望用户能够像对待bug一样对待数据异常。所以,tfx允许数据异常像bug一样被记录、追踪和解决。

用户还可以通过追踪异常的变化情况来发现特征工程方面的改进空间。

模型训练这部分没有太多值得一提的,主要就是在用tensorflow做训练。值得一提的是模型的热启动(warm start)问题。热启动解决的是模型需要长时间训练才能收敛的问题,这个时候可以用一个已经训练好的模型,从中选取一些共同的特征权重,作为模型的初始状态,这样可以使得模型更快收敛,从而加快训练速度。为了使得这部分逻辑通用化,tfx将其进行了抽象开发,并进行了开源(可能是开源在了tf里,这部分没有验证)。

模型评估和验证

机器学习系统是个多组件复杂系统,这使得 bug有很多地方可能发生,而这些bug很多时候都不会导致系统崩溃,而且人又难以发现,所以需要对模型进行评估和验证。

定义“好”模型

作者将好的模型定义为可以安全提供服务(safe to serve)并且具有预期的预测质量(desired prediction quality)。其中安全提供服务指的是模型在服务时不会因为各种原因崩溃掉,例如占用太多资源或数据格式错误。而预测质量指的就是模型预测的准确率,这与业务的效果息息相关。

验证的敏感度

模型验证面临的一个挑战在于确定验证的敏感度。如果过于敏感,数据稍有波动就报警,会导致频繁报警,最终人们会忽略报警;而如果过于不敏感,则会漏掉问题。作者的经验是,模型一旦出问题一般会导致各种指标的重大变化,所以敏感度可以设的粗一些。当然这个比较业务相关,还是要根据自己 的业务来决定。

除了对模型做整体验证,有时可能还需要对数据的某个分片做验证。例如针对男性用户的验证等等。这对于模型的针对性细致评估和优化很有意义。

文章后面部分讲了一些服务层面性能优化和在Google Play上应用的一个案例,这个就不说了。对于文章细节有兴趣的可以搜原文去看。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK