近日,全球最顶级大数据会议 Strata Data Conference 在京召开。Strata 大会被《福布斯》杂志誉为「大数据运动的里程碑」,吸引了大数据、人工智能领域最具影响力的数据科学家与架构师参会。第四范式联合创始人、首席研究科学家陈雨强受邀出席,并以「人工智能工业应用痛点及解决思路」为题,发表主题演讲。
陈雨强是世界级深度学习、迁移学习专家,曾在 NIPS、AAAI、ACL、SIGKDD 等顶会发表论文,并获 APWeb2010 Best Paper Award,KDD Cup 2011 名列第三,其学术工作被全球著名科技杂志 MIT Technology Review 报道。同时,陈雨强也是 AI 工业应用领军人物,在百度凤巢任职期间主持了世界首个商用的深度学习系统、在今日头条期间主持了全新的信息流推荐与广告系统的设计实现,目前担任第四范式首席研究科学家,带领团队研究、转化最领先的机器学习技术,着力打造人工智能平台级产品「先知」。
以下内容根据陈雨强主题演讲编写,略有删减。
大家好,我是来自于第四范式的陈雨强,目前主要负责人工智能算法研发及应用的相关工作。非常高兴与大家分享人工智能在工业界应用的一些痛点、以及相应的解决思路。
工业大数据需要高 VC 维
人工智能是一个非常炙手可热的名词,且已经成功应用在语音、图像等诸多领域。但是,现在人工智能有没有达到可以简单落地的状态呢?工业界的人工智能需要什么技术呢?带着这些问题开始我们的思考。
首先,我们先探讨一下工业界人工智能需要一个什么样的系统?人工智能的兴起是由于数据量变大、性能提升以及并行计算技术发展共同产生的结果。所以,工业界的问题都是非常复杂的。因此,我们需要一个可扩展系统,不仅在吞吐与计算能力上可扩展,还需要随着数据量与用户的增多在智能水平上可扩展。怎么实现一个可扩展系统呢?其实很重要的一点是工业界需要高 VC 维的模型,去解决智能可扩展性的问题。怎么获得一个高 VC 维的模型呢?大家都知道,机器学习=数据+特征+模型。如果数据在给定的情况下,我们就需要在特征和模型两个方面进行优化。
特征共分两种,一种叫宏观特征,比方说年龄、收入,或是买过多少本书,看过多少部电影。另外一种是微观特征,指的是比拟细粒度的特征,你具体看过哪几本书,或者具体看过哪几部电影。每一部电影,每一本书,每一个人,都是不同的特征。书有几百万本,电影有几百万部,所以这样的特征量非常大。
模型可分为两类,一个是简单模型,比如说线性模型。还有一种是复杂模型,比如非线性模型。
这样就把人工智能分为了四个象限。如上图,左下角是第一象限,使用宏观特征简单模型解决问题。这种模型在工业界应用非常少,因为它特征数少,模型又简单,VC 维就是低的,不能解决非常复杂的问题。右下角的第二象限是简单模型加上微观特征,最有名的就是大家熟知的谷歌 Adwords,用线性模型加上千亿特征做出了世界顶尖的广告点击率预估系统。左上角的第三象限是复杂模型加宏观特征,也有诸多知名公司做出了非常好的效果,例如 Bing 广告和 Yahoo,经典的 COEC+复杂模型在这个象限内是一个惯用手段。最后是第四象限,利用复杂模型加上微观特征,由于模型空间太大,如何计算以及解决过拟合都是研究的热点。
刚才说沿着模型和特征两条路走,那如何沿着模型做更高维度的机器学习呢?研究模型主要是在学术界,大部分的工作是来自于 ICML、NIPS、ICLR 这样的会议,非线性有三把宝剑分别是 Kernel、Boosting、Neural Network。Kernel 在十年前非常火,给当时风靡世界的算法 SVM 提供了非线性能力。Boosting 中应用最广泛的当属 GBDT,很多问题都能被很好地解决。Neural Network 在很多领域也有非常成功的应用。工业界优化模型的方法总结起来有以下几点。首先,基于过去的数据进行思考得到一个假设,然后将假设的数学建模抽象成参数加入,用数据去拟合新加入的参数,最后用另一部分数据验证模型的准确性。这里举一个开普勒沿模型这条路发现开普勒三定律的例子。在中世纪的时候,第谷把自己的头绑在望远镜上坚持观察了 30 年夜空,将各个行星的运动轨迹都记录下来。基于这些数据,开普勒不断的进行假设,最后假设行星的运动轨道是椭圆的,用椭圆的方程去拟合他的数据,发现拟合的非常好,便得到了一个新的模型:开普勒第一定律。这就是一个典型的沿着模型走的思路,通过观测数据,科学家获得一个假设,这个假设就是一个模型,然后用数据拟合这个模型的参数,最终在新的数据上验证模型是否正确,这是沿着模型走的一条路。
沿着特征走主要是由工业界来主导,比如说谷歌的 Adwords 里面有上千亿的特征,想要描述为什么会产生一次广告点击,这就需要解决高效并行的问题。这些技术大部分进展来自于 KDD 或是 WWW。沿着特征优化机器学习,就是把问题通过特征的方式分的足够细,做非常准确的模型。
到底是深度模型好还是宽度模型好呢?这里有一个没有免费的午餐定理:不存在万能的模型。简单来说,世界上不存在一个优化算法对任何问题上都有效,也就是说我们总能找到一个问题,让这个优化算法表现的并不比随机的更好。更进一步的说,所有的机器学习都是一个偏执,代表了对这个世界的认知。如果数据较少,这个偏执就需要比较强。比如说科学家观测物理现象,数据并不是特别多。这种情况下,你需要大量的理论和猜想,有少量数据做拟合验证就可以了。但如果假设错的话,就可能出现错误的结论。比如用地心论研究天体物理的话,就发现结论都是错的。但是如果数据很多,我们就不需要很强的偏置,将更多的不确定性加入模型,自动的通过数据进行拟合。综合起来,工业界的机器学习里面并没有免费的午餐,不存在哪一个模型是万能的模型。所以说你一定要根据你的业务做出合适的选择,才是最好的一个方式。
人工智能落地的关键:提高 AI 的易用性
人工智能目前还远没有达到可以遍地开花的程度,即使解决了刚才讲的宽与深的问题,我们依然还有很多事情要做。如何训练出好的模型、如何去选择好的参数、如何进行特征组合,都不是一件容易的事情。
比如,数据需要归集、整理、导入、清洗、拼接、特征工程等之后才能模型训练。之后模型上线还要保证系统的稳定性、时效性和吞吐等等指标。同时为了提供线上服务,需要重做一套线上的架构,这个架构需要保证数据流实时性、线上线下一致性,以及模型作用的机制。只有完成这些,这样才真正拥有了一个落地的人工智能系统,否则只能称之为在笔记本上做一个 AI 的玩具而已。
刚才说到的还只是一个公司的问题与系统,如果用在各行各业的不同问题上,会发现问题非常多,所以企业一定需要一个集成上述所有能力的人工智能平台。开源社区内好的工具平台和算法能够起到很大作用,这些工具也会日趋成熟,但并不足够。虽然看起来人工智能已经在非常多的领域应用或者开始了突破性的尝试,但是如果对比 Hadoop 这样的分布式存储计算系统来说,还远远未普及。
关于这个问题我们先分析 Hadoop。之所有这么多人用 Hadoop 是因为它虽然是个分布式系统,但对使用它的程序员并不需要掌握很高的分布式系统知识,研发人员并不需要为了使用 Hadoop 针对性的对自己的数据、业务做出改变,也不需要因为 Map-Reduce 框架重新设计自己的线上服务系统。但人工智能不一样,为了使用 AI,所有的上下游组件都会和模型相关:不同的模型不仅意味着不同的训练系统,还意味着不同的实时、非实时的数据流,不同的拼表要求与框架选择、不同的特征抽取、不同的线上服务架构、不同的灾备架构、回滚架构相关。这样你就会发现,为 AI 系统做数据流与线上系统的架构师,必须要懂机器学习才能做好工作。
所以现在能够做 AI 应用的人,主要还是那些研究及应用的机器学习科学家,需要那种既懂机器学习,又了解业务,还精通系统架构的工程师。这就造成了 AI 的高门槛。就如同三四十年前,真正编程的人并不是现在我们这样的人,而是一群科学家们,他们通过纸带来控制程序的运行,自己不仅要编程,还得非常懂计算机体系架构。导致的结果是,根本不是每个人都能接触到这项技术,不是每个企业都能受惠于这个技术。但是现在,甚至在 Excel 中都可以编程,这些程序员可能完全不知道计算机的体系结构、操作系统、编译原理、数据库的概念,将全部心思花在理解与解决业务问题上,达到事半功倍的效果。
所以,如果想让 AI 在工业界中产生更大的影响,真正的落地,我们需要的是一个完整的人工智能应用平台,让人以更低的成本用上人工智能。从这个角度上看,阻碍 AI 普及的并不是现在的算法效果不够好,而是现在算法的门槛太高,研发新的平台以及算法降低门槛的重要性大于优化算法效果的重要性,我们期望用低的门槛获得好的效果。
如何解决特征工程
如何降低这些门槛呢?这里分享一下第四范式的成果。首先特征工程是工业界应用 AI 的巨大的难关。特征工程的目标是针对于某个模型找出与要解决问题相关的关键属性,现在也有一些开源的项目尝试解决特征工程,下图就列出了 Spark 2.2 官方文档中包含的特征工程算法。那么,针对不同的业务、不同的模型,这些算子就足够我们低门槛建模了吗?
如果想要做好特征工程,需要对将要使用的机器学习算法有深入了解才行,随便地将所有的特征全部扔进去,现有的算法并不能很好地处理。有时候,不同的算法为了达到同一个目标,使用特征工程与做法会完全不一样。以新闻推荐为例,我们要做两种特征,来提高推荐新闻的点击率。一种是一阶特征,描述的是那些用户直接喜欢的内容。另一种是二阶特征,描述的的是个性兴趣的扩展。比如说喜欢大数据的人,很有可能对机器学习也感兴趣。
在下面的示意中,小人代表一个用户(User),小人下面表示通过统计得到的用户画像,也就是用户的历史兴趣点(User_Topic)。右边是 3 篇新闻,每个新闻有一个话题(News_Topic)。
那么,如何在之前提到的「简单模型(线性模型)+微观特征」这条路添加一阶特征呢?如图左上角所示,我们只需要简单的将用户与新闻话题做组合特征(User-New_Topic 笛卡尔积)就可以了。在这条路上,我们并不需要任何的用户画像统计,因为最后每篇新闻点击或者不点击就已经可以训练出「User-News_Topc」组合特征的权重与偏好了。这种方式下,在线上服务的时候,所有的信息都是推荐时能获取的,但是为了用户兴趣更新及时,我们需要把模型的时效性做到非常高。
回头看,如何在之前提到的「复杂模型(非线性模型)+宏观特征」这条路添加一阶特征呢?如图左下角所示,由于是宏观特征,我们需要将不同的话题变成单个特征,一种做法是通过一阶逻辑的判断「本篇新闻的话题是否属于用户历史的兴趣」加入。这种方式下,在线上服务的时候,我们除了需要推荐实时信息之外,还需要实时维护用户历史的兴趣点,但是模型本生的更新频率就不用那么快了。毕竟,为了达到推荐时效性目标,要么特征静态、模型特别实时,要么特征实时、模型静态不变。
那么,如果我们要学习二阶特征呢?对于线性模型(如右上角所示),我们也需要用到用户的历史兴趣点,将用户的历史喜好与文章的话题进行组合(User_Topic-New_Topic),这样模型就可以学到历史上喜欢什么样话题的人还会喜欢什么样的新闻话题,达到二阶迁移的目标。对于非线性模型(如右下角所示),我们要做的将原先的一阶逻辑判断(可以认为是个 Identity 矩阵)变成一个二阶状态转移矩阵,通过历史统计得知不同话题间喜欢转换的情况,推算出一个不在用户现有兴趣点中的文章话题是不是用户喜欢的。
更进一步的,我们总结对比一下,对于前文提到的机器学习四象限中的第 2,3,4 象限的模型,我们做特征工程的方式差距非常大。对于一阶特征,如果是线性模型加精细特征,直接做组合,不用统计;如果做非线性模型是需要统计的,同时用包含关系来做;如果用非线性模型不需要用包含关系,模型本身会进行特征组合。如果做二阶特征,每种方法都需要使用统计特征,但适用方式也各不相同,比方说非线性模型宏观特征,你需要三个相关的信息和很多统计才可以做到。
这个例子说明了一个道理,如果要做好的特征工程,需要非常多的针对模型的定制化的优化,仅用现在的工具还完全不够,完全需要靠人的经验与判断。因此,研发自动特征工程的算法就变得尤为重要。自动特征工程是一个比较难的问题,在学术界与工业界都在积极地研究这个问题,这里跟大家分享自动工程的三个方向,隐式特征组合(如 NN,FM),半显式特征组合(如 GBDT)与显式特征组合(显式特征叉乘)。
隐式特征组合
隐式特征组合主要特点是对连续值特征非常友好,最成功的应用场景是语音和图像。在这些原始信号是像素或是声波的问题里面,深度学习通过神经元网络产生底层的 Filter 以及层次化的特征组合,获得了远超人类手工特征工程的效果。但是深度神经网络并不是万能的,在深度学习中,高维离散特征的变量处理非常复杂,同时缺乏可解释性,过于黑盒化也是神经网络大家关注的焦点。这样会导致深度学习出来的特征组合相对难用到其他算法之上,也很难给人明确的信息反馈。
针对 NN 难以处理离散特征的问题,我们需要 Large Scale Embedding 的技术进行解决。Embedding 最早在 NN 上的应用是在 NLP 的问题上,当时研究者们使用 Embedding 的技术将每个单词映射到一个低维空间,通过 concat,sum,poolling,convolution 等方式形成等长的最底层输入,然后使用标准的深度神经网络进行训练。随后在越来越多的领域用上了 Embedding 技术,推荐是一个典型的场景,限制波尔兹曼机(RBM)在提出之初就曾使用 Embedding 尝试解决协同过滤问题。最近,谷歌发表描述如何使用大规模 Embedding 技术在 Youtube 上向数以十亿计的用户推荐数以亿计的视频,在他们的工作中,他们同时对每个用户与视频进行 Embedding,之后把用户观看历史、搜索历史等视频的向量通过求和变成特征,继而进行深度学习,获得了比较大的成功。
Large Scale Embedding 在现在依然是一个比较热门的研究领域,其中的成果包括 Discrete Factorization Machine, FNN, PNN, DeepFM 等,上图显示了这些算法的异同,简单来讲这些模型既能找到特征之间的推理关系,同时也能去记忆比较细的特征。在这个领域,第四范式提出了 DSN(Deep Sparse Network)的算法,它是一个非常宽且深的模型,里面同样会做大规模 Embedding,用神经网络做自动学习组合,目标解决高维模型(上万万亿 VC 维度)的正则化以及并行计算问题。
半显式特征组合
第二个是半显式的组合,主要基于的是树模型。为什么说是 「半显式」 呢?因为大家可能认为树模可解释或者做特征组合是很自然的事情,但其实并不是:叶子节点的每一个分支并不是一种显式、直接的特征组合,而是这些特征在特定取值区间的组合。所以从结果上来说我们做到了特征组合,有一定可解释性,但是同样也没有办法直接看特征相关性或者特征之间组合关系。作为非线性模型,树模型主要的特点是容易理解,效果也是非常好的。但是类似的,它对离散的精细特征非常难处理,传统上训练一棵 m 个特征 n 个训练数据 k 层深 t 棵树的模型需要 O(mntk) 的时间,即使对系数特征进行优化,也很难降低特征分裂中分桶上的空间与传输消耗。在这个方面,第四范式提出了一系列算法,包括 HE-TreeNet 和 GBM 系列算法,通过 Embedding,Ensemble、Stacking,General Boosting 等方式让树模型可以在大规模特征的情况下可以进行特征组合。
显式特征组合
第三个介绍一下显式的组合,算法的输出会明确指定哪些特征组合起来(笛卡尔积)作为基础特征。整体思路沿着搜索与搜索优化这条路,也有一些地方使用正则化加贪心。由于显式特征组合的问题求解空间大,寻找最优特征组合是个非常难的问题。我们对比 AlphaGo 下围棋,19 乘 19 的棋盘上每个点上有黑子 / 白子 / 无子三种状态,它的状态空间最大是。考虑显式特征组合要做的事情,我们要有个特征,限制高阶组合阶数不超过,从中选取个特征,那么 2 到K特征的总量是,最终再从其中选取个特征,其空间是 ,即使将不大的中带入,量级会远远大于,从解空间大小的角度看显示特征组合比下围棋还要更难。
显式特征组合还有一个问题是如何做连续值的组合,比如说一个人的年龄是 30,收入是 10000,应该怎么做组合特征呢?是乘、是加还是平方和?在 NN 中,是通过线性组合加上非线性变化,在 GBDT 中使用过特征值分裂,但是对限时特征组合,实际上没有一个好的现有方法去直接组合。
虽然有着重重困难,显式特征组合的优势在于可解释性,会提供一个非常深入的洞察,可以知道哪些特征是潜在有关系的,应该组合起来;同时这样的方法享受比较好的可叠加性:所有机器学习算法都基于特征,显式特征组合的产出是特征集,这个特征集可以增强所有其他机器学习的算法,成为训练的基础。
目前,显式特征组合主要有几种算法,一些方法基于 Boosting,训练单 Feature 弱分类器,通过 Boosting 的过程寻找组合的启发;或者基于 Regularization 进行权重截断,形成组合候选。这些算法一般不是为了特征组合而设计,组合也多为训练过程的副产物,很难真正的获得高阶的组合特征。
新一代的显式特征组合:FeatureGO
下面介绍第四范式最新发布的算法—FeatureGO。它是基于 MCTS,对特征与特征组合状态进行建模,训练组合下的收益函数。在搜索的过程中,我们做了非常多的调优技术,使用我们内部线性分型算法 LFC 解决连续值特征组合的问题。最终,我们发现这个特征组合最多能达到十阶以上,且发现即使达到十阶也能提供明显的的效果提升,这个是过去靠人所做不到的事情。即使是在最好的广告或者推荐系统中,人工的特征组合一般也只能到达 5-6 阶。
我们在 4 个数据及上实验了 FeatureGO 算法,包括两个公开的数据集(higgs、criteoDeepFM)与两个我们私有的数据集(l_data,m_data),数据集统计信息如下:
在这四个数据集上,我们使用 FeatureGO 产生的特征集合加上 LR 模型进行训练,使用 AUC 作为评估标准。实验效果如下。可以看到,使用了 FeatureGO 进行特征工程,在 4 个数据集上的效果都有非常明显的提升,大部分提升在 AUC 2 个百分点左右。
我们也实验了效果随着时间与新组合特征的加入而发生的变化,如下图所示。可以看到随着时间的变长,特征组合数越多,特征组合效果会越来越好。
基线对比算法除了 LR 之外,我们也比较了一些最新的非线性算法成果,在 cretio 广告数据上进行实验,结果如下。在这个实验里,我们也可以看到,即使是基于最新 NN 或者 FM 的特征组合,也并不能找全所有可以利用的信息,这个对比中显式特征组合依然有非常好的表现。同时要注意到的是,FeatureGO 产出的新组合特征还可以进一步提高上述所有模型的效果。
在 FeatureGO 这样的算法背后,其实还有好多隐藏的架构上的黑科技,让基于搜索的算法可以实际变成可行。比方说我们提出了 CPS(Cross Parameter-server Sharing),Dynamic Graph 等技术,将计算过程中公共的数据读取处理、特征请求存储更新等进行共享,达到同时训练 10 个模型的时候使用远小于 10 倍单模型时间的效果。
关于计算能力与架构,我们认为这是人工智能至关重要的一部分。过去将 APP 开机速度由 20ms 优化到 2ms 其实意义并不是特别大,但是在机器学习中,10 倍的速度意味着同时间训练 10 倍多的数据,或者同时能训练 10 个模型,也就意味着更好的效果,这也就代表着以往模型优化、效果优化这种只有科学家做的事情,现在优秀架构师也能做到。在这方面,谷歌是非常好的榜样。在过去,从没有人想过 LR 这么简单的模型也能获得良好的效果,但是通过极致的工程架构与实现优化,谷歌证明了使用上千亿特征,即使简单的 LR 模型也不比任何非线性模型差。第四范式也是一个架构工程优化和算法并重的公司。我们不仅做人工智能的通用平台,也会投入非常多的精力去优化速度与架构,希望能获得更强、更全面的人工智能水平和能力。
说到计算与架构这一点,也要提到谷歌 Deepmind 团队最近做的另外一件工作 NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING,通过强化学习框架自动进行神经元网络结构的学习,有人提到这个工作为了自动获得一个网络结构,使用了 800 块 GPU 同时进行训练,非常不实用。但我们认为,谈到将来的趋势,不会是通过专家来节省机器,降低机器的使用,而是通过机器节省专家降低专家的参与,因为随着摩尔定律,机器的计算成本会指数级的降低,但是专家的数量并不会指数增加。要让更多的领域用上人工智能,更少人力的 AutoML 是将来的必经之路。
目前,第四范式的算法与产品 「先知平台」 在更广泛意义上的 AutoML 与减低门槛两方面,都在持续的投入和研究。这些新的研究方向包括自动拼表数据导入、模型可解释、自动线上优化等。我们要做的事情,是如何把人工智能变的更加自动化,使 AI 变得跟 Windows 一样普及。现在,「先知平台」试用版已经正式对外开放,欢迎登陆 prophet.4paradigm.com 注册使用。