文作者 Mikio Braun 是 Zalando 的推荐和搜索系统的交付带头人,Mikio拥有机器学习的博士学位。本文概述了一个能把数据科学引入生产系统的架构的典型模式。
在过去的几年间,数据科学这个概念已经被非常多的行业所接受。数据科学最早是来自于一些试图去理解人类的智能并创造人工智能的科学家,但现在它已经被证明是完全可以带来真正的商业价值。
例如,我所在的公司:Zalando(欧洲最大的时尚品零售店)。在这里,数据科学和其他工具一起被用来提供数据驱动的推荐。推荐本身作为后端服务,被提供给很多地方,包括产品页面、分类目录页面、通讯电邮以及重新定位目标客户等。
图1:图片来自Mikio Braun的演讲页
数据驱动产生推荐
实际上,有非常多的方法可以由数据驱动产生推荐。例如,在所谓的“协同过滤”里,所有用户的行为(比如浏览商品、对想买商品列表的操作、以及购买行为)都可以被收集起来作为推荐的基础,然后分析发现哪些商品有相似的用户行为模式。这种方法的优美之处在于计算机根本不用知道这些商品是什么。而它的缺点则是商品必须要有足够多的用户行为信息数据才能保证这个方法起作用。
另外一类产生推荐的方法是只看商品的属性。例如,推荐具有相同品牌的或者相同颜色的商品。当然,对这些方法还有非常多的扩展或者组合。
图2:图片由Antonio Freno友情提供并授权使用。引用自发表在KDD 2015会议的《One-Pass Ranking Models for Low-Latency Product Recommendations》论文
更简单一些的方法就是只通过计数来做推荐。但这种方法在实践里会有非常多的复杂的变形。例如,对个性化推荐,我们曾使用过“学习排序”的方法,即对商品集做个性化的排序。上图里所显示的就是这个方法需要最小化的损失函数。
不过,这里画出这个图的主要目的,还是来展示数据科学可能会引入的复杂度。这个函数自身使用了成对的加权指标,并带有正则化条件。这个函数的数学展现是很简化的,当然也就很抽象。这个方法不仅对于电商的推荐场景有用,还对当物品有足够特征的时候的所有类型的排序问题也有用。
将数据科学方法引入工业界
为了把类似上图的非常复杂的数学算法引入到生产系统中,我们需要做什么?数据科学和软件工程之间的界面应该是什么样?什么样的组织架构和队伍结构才最适合使用这些数据科学的方法?这些都是非常相关和合理的问题。
在下文里,我会根据我作为一个机器学习的研究人员以及在Zalando带领一个数据科学家和工程师团队的经验,来对这些问题做一些探讨。
理解数据科学(系统)与生产系统的关系
让我首先从了解数据科学系统与后端生产系统的关系开始,看看如果将两者进行集成。
图3:图片来自Mikio Braun的演讲页
典型的数据科学工作流程(管道)如上图里所示:第一步总是从发现问题和收集一些数据(来自于数据库或者生产系统的日志)开始。取决于机构的数据准备好的程度,这一步有可能就是很困难的。首先,你有可能需要搞清楚谁能让你接触到所需的数据,并搞清楚谁能给你权限去使用这个数据。当数据可用后,它们就可能需要被再次处理,以便提取特征值。你希望这些特征可以为解决问题提供有用的信息。接着,这些特征值被导入学习的算法,并用测试数据对产生的结果模型做评估,以决定这个模型是否能较好地对新数据做预测。
上述的这个分析管道通常都是短期一次性的工作。一般是由数据科学家手工完成所有的步骤。数据科学家可能会用到如Python这样的编程语言,并包括很多的数据分析和可视化的库。取决于数据数量,有时候数据科学家也使用类似Spark和Hadoop这样的计算框架。但一般他们在一开始都只会使用整个数据集的一小部分来做分析。
为什么开始只用一小部分数据
开始只用一小部分数据的主要原因是:整个分析管道过程并不是一锤子买卖,而是非常多次反复迭代的过程。数据科学项目从本质上讲是探索性的,甚至在某种程度上是开放式的命题。虽然项目目标很清楚,但什么数据可用,或可用的数据是否适合分析,这些在项目一开始都不是很清楚。
这些特点都意味着上述的分析管道是迭代的,并需要有多次改进,尝试不同的特征、不同的预处理模式、不同的学习方法,甚至是重回起点并寻找和实验更多的数据来源。
这整个过程本质上就是反复的,而且经常是高度探索性的。当做出的模型的整体的表现不错后,数据科学家就会对真实的数据运用开发的分析管道。到这时,我们就会面临与生成系统的集成问题。
图4:图片来自Mikio Braun的演讲页
区分生产系统和数据科学系统
生产系统和一个数据科学系统的最主要区别就是生产系统是一个实时地、在持续运行的系统。数据一定要被处理而模型必须是经常更新的。产生的事件也通常会被用来计算关键业务性能指标,比如点击率等。而模型则通常会每隔几个小时就被用新数据再进行训练,然后再导入生产系统中去服务于新来的(例如通过REST接口送入的)数据。
这些生产系统一般都是用如Java这样的编程语言写的,可以支持高性能和高可靠性。