一.问题>数据>算法
最近几年人工智能行业如火如荼,最近今年也能看到越来越多的落地应用:人脸识别、AI拍照、自动驾驶、智能音箱等等等等。所有的这些应用常常都是一个复杂的工程,其中可能会包含数个甚至数十上百个算法模型,我们可以抽丝剥茧,从最基本的算法功能单元总结出一些算法解决问题的范式,这对我们寻找新的算法应用场景有很大的价值。
一般做算法的人会专心进行算法本身的创新和研发,你能看到的绝大多数paper都着墨在这个方面,但根据我这几年,在业务的真实场景上使用算法的经验看来,算法本身并不是最重要的,最重要的是对问题的定义,如果不能准确有效地定义问题,那么后面的工作也无从谈起。
举个可能不恰当的例子,今日头条成功的原因是因为他们的推荐算法吗?我认为不是,今日头条成功的首要条件是对于产品的定义,也就是他们最早的slogon:「你关心的,才是头条」,所以推荐算法要解决的问题是找到用户关心的东西,算法需要依赖数据把这个问题解决得更好,所以在我看来实际应用中,问题>数据>算法。在问题清晰、数据完备的情况下,即使是用简单的统计,也能把推荐的体验做到及格线,复杂深刻的算法很大程度上是在锦上添花,这并不是说新的算法技术不重要,而是提醒我们,在实际应用里,不要忽视前面两个模块。
本文我们着眼于「问题」的分析,其他两个模块以后再展开总结。
二.问题的分类
业务的问题无穷无尽,从什么角度对这些问题进行抽象和总结呢?太高层次的问题比如「自动驾驶」无法让我们看清细节;太明确的问题比如「文本情感检测」又失去了普遍性和范式。
这里我们借用scikit-learn(python最常用的基础机器学习库)这张图的分类,来对机器学习算法能解决什么问题进行一些梳理和总结,甭管五花八门的应用,NLP/CV/ASR,都逃不出这张图的五指山。
2.1 分类 Classification
什么是分类?最简单的解释是:算法最终的输出是一个离散的标签。
比如每个学机器学习的人都会做的MNIST手写数字识别任务,它要解决的问题就是将一张图片,分到0-9这十个类别里,这就是最明显的分类,在实际中这样直白的分类任务应该是超过50%的,比如风控系统要判别一个用户是否有风险,这是一个二分类;智能音响要判断用户说话的意图,这是一个多分类;无人车要判断前面这个物体是什么东西,人、横行道还是路牌,这是一个多分类问题。
除了最直白的分类任务,一些时候因为数据格式,会有一些变形,但其本质上都是在做分类这件事。
比如在NLP领域,给我们一个文本,因为文本是一个离散的输入,如果我们的问题需要在每个词上都输出一个标签,那么这就是NLP里面经典的序列标注(Sequence Tagging)问题,实际的目标可能是标注每个词的词性(pos tag)、识别句子里的实体(Name Entity Recognition),比如要识别公司名,可以设计B-Company(公司名开始标识),I-Company,E-Company 这样可以打在每个词上的标签来实现。
NLP领域另一种常见的问题模式叫做Sequence to Sequence,比如将文本从英文翻译到中文,在生成翻译目标文本的时候,是输出单词这样一个离散有限的标签,所以它也是分类任务。但这个任务比较特殊的是会借助循环神经网络,连续生成一串文本。
图像领域也有类似的变形任务,比如我们想要用算法自动生成一个mask,把图片里的特定物品抠出来,我们设计的任务就可以是对每一个像素做二分类,0就是需要删掉的,1就是需要保留的:
无论形式如何变化,这些问题的本质上都是在做分类,分类可以说占了机器学习问题的半壁江山,我们拿到具体问题的时候,如果判断是一个分类问题,那么就可以从已有的这些模式里面,寻找和我们任务最契合的模式加以应用,第三章我们再详细讨论这个问题。
2.2 回归 Regression
回归算法输出的目标是一个数值,拿最简单的线性回归来说,我们是期望算法能拟合出一个函数,对未知的目标值做很好地预测。
一个最经典的推荐算法任务,在MovieLens数据集上预测用户对于一个电影的评分,就是一个很直接的回归问题,学习目标是一个1-5的评分。股票交易里也会有人用算法来预测未来一段时间的股票价格,这也是回归问题。
预测离散的值,这是分类;预测连续的值,这是回归。在面对真实场景时,如果对问题建模决定了你猜用什么目标,因为对于绝大多数算法来说,这两者的区别只是在最后输出的形式有所不同。比如决策树天然是可以区分到离散的值,但使用分到某个叶节点的训练数据目标均值作为得分输出,就可以处理回归的问题了。神经网络更不用说,最后如果用softmax做分类就是分类算法,如果直接输出一个数值那就是回归。
回归和分类本质上是要看你对于问题的定义,比如同样是MovieLens的任务,我完全可以使用分类算法,直接输出一个五分类的得分,甚至我可以把得分切成50类,从0.1到5.0,得到更细化的结果。但分类问题失去的是目标空间的连续性,比如在这个评分任务上,你可能会得到一个1星概率为0.5,5星概率为0.5这样不太合理的结果,而回归的目标空间因为是连续的就不会有这个问题。
2.3 聚类 Clustring
对于算法的分类,还有另外的一个维度,就是从「有监督」和「无监督」来看,上面提到的的分类和回归,基本上都是有监督的算法,也就是我们在准备数据的时候会准备好一个ground truth,模型会试着学习一个函数来输出接近ground truth的结果。
最近几年随着算法的创新、算力的增加和大量标注数据的出现,有监督算法得到了长足的进步,但是无监督信号的算法变化不是很大,聚类就是其中一种典型的无监督算法。
我们拿到一批没有任何目标标签的数据,聚类的目标就是要从中区分出哪些数据是比较类似的,在实际应用中,比如我们可以把相似的用户聚类出来,进行针对性地推荐或者引导。实际应用里比如我们可以在地图上通过聚类算法,聚类出很多的用户群落,产生一些有意义的输出。聚类一般在数据挖掘领域会比较常用一点。
三.问题的抽象和判断
实际应用中,问题千千万,我们如何以使用算法解决问题为目标来把问题抽象成算法可以应用的问题呢?这边简单总结了一点心得,供大家参考。
3.1 理解应用目标和数据
理解应用的目标,判断这个目标可能是什么任务,分类还是回归?这样我们可以在一些经典的问题里,找到可以套用的模式,来达成我们的目标。下面我们可以举个例子来说明这个理解和套用的过程。
如果我们要判断一个用户的风险系数,看起来好像是个回归问题,但实际场景里我们很难拿到这样一个连续值作为输出目标,一般都是一个0/1的标签(数据),所以这实际上是一个分类问题,风险系数最终可以使用预测的概率。
作为分类问题,而且是一个典型的二分类问题,事实上已经有很多的方法,我们可以考虑使用决策树、GBDT或者神经网络来解决,各种教程都会有这样的示例,我们就可以套用类似的模式。
如果每个用户的特征并不是简单的向量,而是他转账、查询等等行为的记录(数据),这个时候常见的二分类模式似乎不够用了。但稍作思考我们就会发现,这样一个序列的行为,而且每个行为都是离散的标签。这和NLP数据的定义非常类似,那么我们完全可以套用NLP的算法模式来完成我们的任务,一个可以直接对应的任务就是「文本情绪检测」,我们可以统计出现行为(单词)的次数作为特征,也可以套用循环神经网络等算法,这些方法模式都是现成的。
所以对于目标和数据本身的理解,抽象和定义出具体的问题,并依次找到合适的算法,达成最终应用或者业务的目标。
3.2 什么问题使用算法有价值
算法可以做很多事情,但做这些事情也需要投入很多成本,包括且不限于人力成本、计算成本和机会成本。那么哪些问题值得使 用基础算法,或者投入更大精力改良算法呢?我认为主要是有两点。
规模效应:规模效应有两种解释:
- 一种是单一业务的规模非常大,如果用算法或者更好的算法可以提升业务的效果,就可以创造出很大的价值,那么这样的问题值得我们去用心解决,比如电商平台的推荐系统、搜索引擎广告投放的点击预测系统。
- 另一种是问题是普遍存在于很多场景的,如果能够很好地解决这一类问题,可以较低成本地推广到很多的应用场景。比如对于一些指标或者系统的自动异常检测、比如淘宝的鲁班系统可以批量设计出海报,应用在很多场景。
价值导向:算法是要创造价值的,我认为算法的价值和自动化工程的价值是一样的,主要是这样几点:
- 算法可以比人做得更好,比如推荐系统,过往的历史已经证明算法比任何手工的推荐更有效。人脸检测等场景也超过了人的能力。
- 虽然没有人好,但胜在自动化和低成本,比如在视频网站上,借助图像算法我们可以快速判断一个新上传的视频是否有违规风险,这样作为一层粗筛可以把有风险的再交由人工进行判断,这样大大节省审核的人力成本。
四.总结
以上我们主要总结了算法能解决问题的一些概念,以及粗浅的抽象和判断问题的方法,虽然分类、回归、聚类这样的划分还是太粗粒度了,但是是对实际问题进行分析的导火索。程序员们总爱讨论编程是否是一个吃青春饭的职业,随着工作年限的增加能够累积什么经验,我认为对于算法工程师来说,培养对问题的理解和判断力是其中很重要的一点,同时知道哪些技术和范式可以很好地解决这些问题,需要算法创新的时候可以参考什么领域的前沿技术,可能是最重要的一部分经验。