0
本文作者: 思佳 | 2017-05-25 18:08 |
雷锋网新智驾按:“机器学习其实没有多么高大上”,在腾讯位置日前召开的人工智能(AI)助力LBS应用主题沙龙上,腾讯地图导航技术总监江红英如是说。就在两天前,AI还借AlphaGo的围棋大战冲击着人们的眼球,但事实上,在更寻常的城市日常运转中,人工智能技术已经为效率的提升做出了相当大的贡献,这些应用包括且不限于物流运输、导航、路况预测等等。
江红英是腾讯地图导航技术的研发负责人,过去几年里,他们的团队逐渐使用AI进行算法优化,并不断转变思维,让AI技术为日常出行和物流服务。此次演讲中,江红英分享了AI如何助力ETA(预计达到时间)计算更加智能化,雷锋网新智驾将内容做了不改变原意的删减整理,以飨读者。
我负责腾讯位置服务的导航研发工作,自2015年起,我们的团队逐渐将AI技术引入到导航服务中解决问题,例如实时路况预测、道路通行时间计算,再如从A点到B点,我们会计算很多条路线,并进行优先级排序,这其实是一个很大的话题。此次我以ETA计算为例,分享过去两年来我们将AI技术引入导航服务中的一些经验。
ETA指“预计到达时间”。坐过飞机的人都知道,机场有很多电子信息牌,牌子上会显示航班的动态信息,包括航班出港时间ETD,以及航班到达时间ETA。在交通运输行业,ETA其实是一个很常用的概念。使用地图时,导航规划线路后会给出一个预计多长时间到达的数据,这便是ETA。既然是时间的预估,就会涉及到预估准确与否的问题,对于这个准确度,我们有一个衡量指标,叫MAPE,即平均绝对百分误差,它表征的是ETA和用户实际到达时间之间的偏差。
对于个人用户而言,ETA可以帮助人们更好地安排出行时间。对于网约车、物流等涉及车辆、人力调度的问题,ETA都可以帮助进行辅助决策。
我们目前理解的人工智能通常是指大数据+机器学习。在我看来,这其实是一种水到渠成的状态,而不是为了用而用的。
2000年的时候,我们开始做图像识别方面的工作,当时使用的就是机器学习算法,当时并没有觉得有什么高大上的,因为那个领域机器学习算法是非常普通和自然的事情。如今,经过多年的发展,机器学习在图像、语音和自然语言处理方面都有了更成熟的发展和应用,但在很多传统领域还处于比较初步的阶段,交通领域就是其中之一。个中原因有以下两点:
一方面,作为十分传统的行业,交通领域拥有传统的计算模型和几年甚至十几年的积累,AI模型对于传统模型而言是一种颠覆、一种舍弃,它不是继承式的发展,这种改革是需要很大勇气的。
另一方面,传统领域在大数据积累的意识上相对薄弱,而在数据相对不足的情况下,AI模型初始的效果未必能超过传统模型。
但是,即便如此,我们还是要积极地拥抱AI技术。以ETA为例,平均误差当然是越低越好。举个例子,我们当时使用传统模型计算ETA,平均误差(MAPE)差不多做到19.5%,并已经到了瓶颈,很难再突破。而当我们引入AI模型后,第一版上线后,平均误差就有一个断崖式的下降,直接到17%,到目前,我们的平均误差基本可以控制在15.3%以内。
AI模型为什么能取得更好的效果?
这个问题可以从多个维度解读,例如AI有很严谨的数据模型,有大量历史数据等等。但作为一个“码农”,我觉得我应该从代码的角度来解读一下。
如上图所示,上面的方框中是传统计算模型中计算“轨迹转向”的代码,这部分代码占整个代码量的5%;下面的方框中是机器学习模型中访问一颗决策树的代码,这部分代码占整个代码量的50%。
同样是ETA计算,从代码量上,机器学习模型是传统模型代码量的1/10,这个代码量差距的背后有怎样的逻辑呢?机器学习会通过大数据的训练,把一些程序逻辑转化成配置逻辑。码农定律之一,就是“配置由于编码”,如果我能够通过配置去改变整个程序的逻辑,我就不会用编码的方式去实现。
第二,机器学习会把线上的一些逻辑转化成线下的训练,如果我在线下能够实现一种逻辑,我就不会在线上去完成,这也是作为码农良好的操守。AI通过这两个转化,遵守了码农定律,所以得到一个更好的结果。
刚才说数据和特征决定了机器学习的上限,所以特征的提取、特征的使用,对于机器学习来说是非常重要的。
一般来说,这个过程会分三个步骤来操作:
第一步,对整个业务进行属性的划分,可以划分为物理属性、实时属性、挖掘属性和监控属性。我们以用户画像为例,在用户画像里,诸如用户的年龄、性别、住址等,都属于物理属性,它是简单的、直接的、稳定的;而诸如一个用户过去一小时内浏览的网页内容,就是实时属性;用户这些行为的日积月累,会生成历史数据,对历史数据的统计结果就是挖掘属性;而对一个服务进行监控,包括用户量、访问量等等,这就属于监控属性。
第二步,把所有属性进行量化。还以用户画像为例,假设用户画像中有一个属性叫“用户的颜值”,我往这里一站,交给机器,我的颜值属性设为高,机器会很蒙圈,因为它不知道“颜值高”是什么意思。但是如果换一个说法,比如我的颜值等于90,机器这时候会一脸鄙视,因为这个颜值的上限可能是500分。但是,不管是90分还是500分,数字化的东西使得机器能够理解、能够分析、能够观察。所以,这个前提非常重要,我们要把所有的属性都量化成数字,量化之后的结果称之为指标。
第三步,要对指标进行分析,分析与业务目标之间的关系。对于这部分操作有专门的一门课程,叫《数据分析》,我们把相关性高的指标转化成特征,用在我们的训练和服务中,对那些相关性比较弱的,会继续进行观察。
举一个ETA将监控指标转化成特征的例子。比如,ETA的计算很依赖于实时速度,但是实时速度是从路况中提取出来的,路况计算依赖于实时的数据源。所以,我们一开始对实时数据源是有一个监控。
最初的监控目标不是为了ETA,是因为我们要监控数据源,如果它发生了问题,比如数据不稳定,我们会通知数据提供商他这个数据有问题,让他们赶紧解决,仅此而已。但是有一天,我们突然发现ETA的bad case跟我们的数据源监控指标有一定的关系,两者之间的波动情况有点相近,所以,我们就把这个指标拿过来进行相关性分析,加入到我们的特征里,上线后发现bad case率果然有所下降。也就是说,所有的属性都要量化,量化以后不要轻易舍弃,因为我们不知道什么时候某一个指标就有用了,就会被我们采纳。
一般情况下,AI的流程是这样的:它会在一个大数据集上进行训练,得到学习模型F,将提取的m个特征施加在F上,得到一个预测的结果y,y就是我们要持续优化的目标。
初始的时候,我们一般会定义一个可观察、可解释的简单目标,随着模型应用的深入,我们再根据大量的bad case去分析和优化这个目标,最后,要得到一个合适的训练目标。
这个训练目标的要求是什么?
要尽量的简单,这个比较好理解;还有一个很难做到,就是要兼顾多目标,因为在实践过程中,我们发现我们对模型的要求并不是单一的,我们经常既要准确率(Precision)高,也要召回率(Recall)高,这就是多个目标。比如在ETA中,我们希望它的平均误差很小,同时也希望bad case很少,但是这些目标之间有时候会有冲突,但有冲突不代表不可解,还是能够通过优化目标来找到一些解决的办法。
看一下ETA在目标优化方面的工作。ETA是预计到达时间,而ATA是用户实际到达所用的时间。很好理解,我就拿ATA作为我的训练目标,让ETA尽可能跟它逼近。这个目标非常简单、直接。
后来,我们发现了ETA的核心特征。因为你要算的是时间,跟距离、跟速度必然有关系,而其核心特征跟它之间是一种乘积的关系。我们的模型是GBDT,它的结果是多棵树的加和关系,加和还有可能出现一个负数,对ETA来说,你花费的时间为负数肯定是不可接受。所以,我们做了一个对数计算,将乘积关系变成加和关系,同时,因为有指数计算,也保证了不会出现负数。
之后,我们又发现在长距离、长时间这一块出现bad case的比例相对较高,而长距离和长时间的轨迹在我们的训练样本中比较长尾,所以这是长尾引起的bad case。在ETA计算中,长时间和长距离一般是同时出现的,即距离越长,花费的时间越长,反过来说,这就保证了速度是相对稳定的。所以我们改成以速度为训练目标,长尾现象就会减少很多。
在其他条件不变的情况下,通过对目标的不断优化,我们既降低了平均误差,也降低了bad case率,同时兼顾了多个目标。
在我们的训练数据里,大量的数据肯定会存在噪音。一般来说,机器学习的第一步会做一个数据的预处理,对数据进行清洗,把噪音数据过滤出来,直接抛弃,这个时候我们会发现训练数据和我们的测试数据之间的分布不太一样,容易产生过拟合的现象。对此,更好的一种办法,是把这些噪音数据进行修正,变废为宝,重新利用起来,跟我们的测试数据尽量保持分布上的一致,也可以得到更好的效果。
举一个ETA数据改造的例子。一个司机原本按正常轨迹行驶,到了终点位置的时候,他来回绕了很多圈,这其实是因为他在找停车位。像这种case是日常中特别常见的,因为你到了一个目的地附近,就会来回寻找停车位,尤其在北京这种寻找停车位困难的情况下。
一开始,我们定义了一些噪音数据,遇到类似数据直接扔掉,在后续的训练过程中,我们发现跟实际的数据之间还是有一些差异。这种情况是比较常见的,这个数据被扔掉后,会导致整个训练数据的偏差比较大。所以,后来我们把这样的噪音数据先挑出来,进行一个截断,绕圈的部分抛弃,剩下部分提取真值,把轨迹加入到训练样本中。
机器学习神奇的地方在于,你将一堆数据给它、一堆特征给它,它可以炒出一盘好菜。而困难的是,做了一些优化以后,很难证明我在这方面做的事情有效,也很难说清楚到底哪个特征的优化起到了更好的作用。所以,验证方面是挺费劲的事情。
很多时候,我们会同时优化多个特征,如果上线以后效果变得更差了,都不知道是哪个特征引起的,我们之前被这种情况坑过,因为发现上线以后结果变差了,但是线下每个训练的结果都很好,上线变差了以后没有办法解释,只能先回滚,这对开发人员来说还是很受打击的。后来,我们就采用双模型的方式,我们同时运行着两个模型——新模型和老模型,两个模型同时计算,遇到结果和预期不一致的时候,可以做diff(一种比较命令),很快能定位到问题。
当然,并非所有特征的上线都需要走这样一个流程,因为开销比较大,同时要运行两套数据和两套模型。目前,我们只是对一些比较重要的特征,或者是特别难以验证的特征进行双模型操作,如ETA的实时速度,本身它的真值就很难采集到,优化的效果也特别难验证。对于这样的一些特征,我们会采用双模型的方式,同时两套跑着,同时比较,有问题就比较好定位。
总结:
第一,我们要在态度上积极拥抱AI技术。AI模型对于传统模型来说,大部分领域里都有一种碾压式的效果,提升特别明显,需要我们有勇气去拥抱它。
第二,要有量化一切的意识。所有的数据都要量化,说不定哪一天可能就用上了。
第三,要不断优化我们的目标。因为你的目标偏了,最后的结果肯定也会有偏,所以需要不断优化和迭代训练目标。
第四,数据如此重要,我们不能随意抛弃。有些噪音数据也是有价值的。
第五,对于一些验证上的问题,即训练效果的分析,可以采用双模型的方式来解决。
会后,江红英告诉雷锋网新智驾,对于自动驾驶技术的研发,目前腾讯内部有一个专门的“无人驾驶实验室”在进行,而她带领的团队目前所做出的努力,也随时准备为后续自动驾驶模型的一些技术和应用服务。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。