社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

不要只关心怎么优化模型,这不是机器学习的全部

极市平台 • 4 年前 • 177 次点击  

加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流点击文末“阅读原文”立刻申请入群~


作者 | 杨晓凡

来源 | AI科技评论


编者按:机器学习领域的学生、研究员、企业开发者都习惯了在模型的优化上花大量功夫,仿佛取得更高的准确率/AUC/mAP 等等就是机器学习研究和应用的全部。但是很少有人去问:测试表现优秀的模型就真的能很好解决真实世界的问题吗?


可解释的机器学习方向的研究员、《可解释的机器学习》书作者 Christoph Molnar 近日就发表了一篇博客,提醒领域内的各位警醒这种风气,开始注意机器学习的应用中那些不应该被忽视的问题。本文编译如下。


先讲一个小故事。


德国某处,一个安静的夜里。大多数人都已经沉沉睡去,但我没有。我得把机器学习模型训练完。我在和全世界和我一样对模型着迷的人比拼,我们要看看到底谁的模型能得到最好的预测结果。我电脑的风扇在嗡嗡地响,键盘也被我敲得咯咯吱吱。我目前的模型没拿到什么好名次,在公开排行榜上排在中间而已。真让人来气。模型的准确率其实还过得去,但在这个比赛里,「还过得去」是远远不够的。比所有其他人的模型都好,才是我最终的目标。我还需要更好的特征工程、更好的学习算法。我已经有了一个建立新的特征的好点子,而且我还可以把随机森林换成增强树。训练这个模型应该只需要半个小时时间,然后我就必须去睡觉了。


好几个小时过去了,现在的时间是凌晨三点半。我终于得到了新模型的预测结果,可以冲击排行榜上的新位置了。我满怀希望地点了提交按钮。我已经很累了,「你的结果正在被评估」的提示看起来都那么模糊。我能到多少位呢,能到前 10% 吗?我开始甜蜜地遐想。但真正的结果很快打碎了我的幻象,这一刻我感觉到前所未有地疲惫。别说得到更好的名次了,这个新模型的表现还不如上一个模型。代码里有 bug?过拟合了?还是我上传错文件了?我脑中有一个又一个的问题冒出来,但是理智告诉我自己必须要躺下了。我在床上翻来覆去,然后梦见了一个不停增长、大到我永远没法理解的决策树。

「我得继续改进我的机器学习模型!」


掀开眼罩看一看

我自己也曾有过类似这样反复折腾机器学习比赛用的模型直到深夜的经历,现在我已经不会再这么做了,原因有两个,1,正常的睡眠现在对我来说重要得多,2,我对机器学习的认识也有了很大变化。


当我一开始接触机器学习的时候,我认为最重要的机器学习技能就是知道如何训练出表现最好的模型。为了达到这个目标,我把全部的精力都用来学习更多的算法、更多的特征工程技巧、更多的算法评估方法,一切都是为了让模型的误差立刻降下去。我如此地沉迷,以至于我当年甚至为随机森林写了一首诗。


今天我的观点有了很大变化。我觉得「机器学习」这四个字的含义远不仅仅是把损失函数最小化。某种程度上,模型的拟合可以说是最简单的部分了,因为有大批的文献、教材、练习以及实用工具来帮你改善现状。而且你也总能立刻得到反馈(只需要在模型没有见过的数据上进行测试就行),总的来说很让人满意。我觉得,以机器学习整个领域来讲,在模型拟合这方面已经发展得相当成熟了。但是除了拟合模型之外,我们还需要解决很多别的很困难的问题。比如:


  • 如何把现实问题转化为预测任务?

  • 我们如何在预测模型中建立信任机制?

  • 训练数据是否含有偏倚?训练数据和实际部署以后的输入数据相似程度有多高?

  • 如果系统的运行不太正常,如何为机器学习模型 debug?

  • 模型给出的预测(尤其是错误的预测)会对用户和产品本身造成什么样的影响?

  • 在当前的预测和未来会增添的训练数据之间是否存在有害的反馈关系?

  • 一个固定不变的模型在不断变化的环境中会有怎么样的表现?


狗展门口。- 「我的狗训练得很好啊」-「不行!」


—— 这就是数据科学家们把最新的模型整合到真实世界的时候的样子


我自己的观点是,机器学习领域内的人们大多数都还只关心怎么优化模型,对我列举的这种模型实际应用中会遇到的问题知之甚少。但好消息是总的来说大家越来越意识到这些问题的存在,也投入更多精力考虑这些问题了。系统性思维、可解释性、公平性、社会影响、数据的角色等等问题都在得到越来越多的关注。


模型的诱惑

我刚开始做机器学习的那几年有一则趣事。我那时候刚加入一家创业公司,负责机器学习相关的几个应用。那时候我的编程水平不如团队里其它的成员,不过我问了很多问题,比如问他们训练用的数据和之后在应用里使用的数据是否类似。我的导师表扬我提了一些好问题,但我自己没明白他为什么要表扬我,显然我那时候心里更在乎的是「我怎么还没学会用 Scala 语言编程」;而且我还觉得,知道怎么构建更厉害的预测模型要比提出这些问题更重要。直到现在我才能完全理解我的导师为什么要表扬我。


经过了五年时间我才终于明白了,「拟合出最佳的机器学习模型」这件事的影响有多小。可明白这个为什么要花五年呢?简单来说,所有的机器学习教学和科研都太过于关注「最好的模型」,因此也就忽视了数据、忽视了人的因素,也忽视了预测模型与所在环境的复杂相互作用。


展开来说的话,让我们通过一个假想的机器学习新人感受一下吧。她的名字叫 Anna,她现在在读电子工程的硕士,有扎实的数学基础,也能够用 C 和 Python 语言写代码。她的机器学习入门第一课是吴恩达的机器学习在线课程,同时她还在看《统计学习基础(Elements of Statistical Learning)》这本书。和其它所有的教学材料一样,在线课程和书里都是一个接一个地列出各种模型,并且详细介绍模型背后的数学原理。它们几乎不会提到如何认识数据、如何考虑社会和道德影响、如何解释模型、模型的应用场景等等问题。她当然会看到一些应用案例,但这些案例都只不过是经过精心设计的简单理想问题而已。


过了一段时间以后,她开始参加 Kaggle 上的各种比赛。再一次地,她在 Kaggle 上也看到各种经过精心设计的预测问题,简直是喂到嘴边了:在我们看到的比赛背后,Kaggle 已经把最难最累的活都做完了,先寻找企业、数据、问题,把问题转化成预测任务,然后考虑要用哪些数据,可能还需要做一些数据清理和合并,再选一个模型评价标准,这些都由 Kaggle 包办了。那对于参加 Kaggle 比赛的人来说,给他们剩下的事情除了特征工程以外,当然就只有「拟合出最好的模型」这一件事了!赢走了比赛奖金的都是谁呢?不是模型表现优良、有可解释性的团队,不是当别人要花几天训练的时候他们只需要几秒钟的团队,不是模型真的有机会部署在生产环境中的团队,因为这些模型的预测准确率注定不会是最高的。所以 Anna 也就跟着相信,机器学习就只不过是找到预测表现最佳的模型,而且这个信念越来越牢固。这不是开玩笑,大家都看得到,得到了奖金和荣誉的就是那些能做出预测表现最佳的模型的人,


所以 Anna 对机器学习的热情也跟着被点燃了,她想要在下一个比赛中拿到更好的名次!幸运的是,机器学习社区很棒、很开放,有很多讨论如何调试模型表现的技术博客可以供她学习,也有很多最新的机器学习库可以让她从 GitHub 上克隆使用。她终于明白:机器学习就是拟合出最好的模型。


Anna 也开始意识到机器学习这个领域有多么年轻、学术界和工业界的联系又有多么紧密。为了了解最前沿的技术,她开始阅读机器学习的学术论文。从哪里开始呢,嗯,当然是读引用数最高的论文了!那么哪些论文引用数高呢?当然是研究常见科研任务模型的论文和各种机器学习框架的论文了……


数据科学家们的毕生梦想:一个模型,解决一切(就像魔戒的「一枚戒指,统治一切」)


可以说,在 Anna 的这一路上,她都时时刻刻在感受到这条最简单的信息:想要做好机器学习,你就需要深入研究建模算法(以及一些特征工程的技巧)。而除此之外的方面,几乎见不到人提起。


拟合模型不是唯一重要的环节

说了这么半天我想已经说明白了,只会赢 Kaggle 比赛是不足以称得上机器学习专家的。那欠缺的知识都是什么呢?以我的浅见,下面这些课题的重要性被完全忽视了,整个机器学习领域都需要开始注意这些问题。


  • 问题的格式化:把一个实际问题转化为一个预测或者模式识别问题。

  • 数据生成过程:理解数据,明白数据在解决问题中的限制和适用性。

  • 模型解释:用交叉验证的性能估计方法之外的方式分析模型

  • 应用场景:思考模型会如何和真实世界相互影响

  • 模型部署:把模型集成到产品或者计算过程中


这里只是简单列了几项,大家可以继续补充。


你完全有可能在拟合出了最好的模型之后在这几个方面犯错,然后你的模型就会变得没用,甚至变得有害。当你的训练数据和应用中的实际数据不匹配的时候,你的模型可能根本给不出正确的预测结果。当你的高管担心模型是个黑盒子所以拒绝使用它的时候,你得拿出白板想方设法给他们解释。假如你发现你的模型对不同肤色的人有偏倚,那你最好别使用这个模型。


只要你把问题的格式化、数据、解释、场景和部署做好,你的项目就可以非常成功了,你的模型预测准确率很一般都没关系。其他方面如果做不好,那么即便是调试很久的、在测试数据上完美无缺的集成模型也只能被扔进垃圾桶。


做错容易,做对很难

机器学习模型完全可以有好的预测表现,但是带来的影响和人们预期的相反,我给大家讲个故事来说明一这点。我有个朋友在一家电信公司工作,这家公司的业务之一是销售移动通信套餐(通话+短信+流量)。他在公司的数据科学团队工作,然后公司想要预测哪些客户最有可能不继续使用套餐,他也是这个项目的成员;做这个预测的目标是给可能不再继续使用的客户提供性价比更高的套餐。那么,这个项目团队就着手构建了一个机器学习模型,这个模型分辨用户的能力也相当不错。然后他们把高概率的用户列出来,给到另一个团队,这个团队会和这些用户逐一联系,给他们提供更优惠的套餐。


那么结果呢?取消这家公司套餐的人更多了,而不是更少了!


事后他们才意识到,他们逐一联系那些有可能不再使用他们的服务的用户,这提醒了对方不能继续使用这家公司的套餐。联系用户的举动反倒成了使得他们最终解约并转向别的运营商的导火索。


为什么不对劲了?从一开始他们尝试把实际问题变成预测问题的时候就出错了。他们的模型预测了「客户 X 解约的可能性如何」,但他们实际上需要预测的是「当我们联系客户 X 的时候他解约的可能性如何」。这也可以看做是和应用场景相关的问题,他们没有仔细考虑联系已经有了解约心思的人之后的后果到底是什么。这个例子里,模型构建可以得 10 分,但问题的格式化和应用场景考虑只能得 1 分。


别以为你的队友们就靠得住

那么是不是只有初学者才会在用机器学习解决真实世界问题的时候犯错?当然不是。想要学习拟合模型之外的机器学习技能,最好的方法就是参与解决真实世界的问题。不过这还不算完,你必须真的希望自己在拟合模型之外的方面也变得更厉害。


只有经验是不够的。谷歌、亚马逊之类对机器学习有大规模长期投入的企业,是不是就掌握了模型优化之外的方方面面了呢?其实也没有。即便他们有那么多博士、有那么多资金、有那么多经验、有那么多数据、那么多技术特长,他们也还没能完全弄清楚。实际上他们也还在犯一些很蠢的错误,因为在真实世界任务中应用机器学习就是很难。


我举几个大公司用了机器学习然后搞砸了的例子:


  • 谷歌照片(Google Photos)会把黑人分类为黑猩猩。然后他们的解决方案是不再让模型预测黑猩猩这个类别。这就好像你家的墙漏水了,你贴了张墙纸遮住了事,而不是找你楼上的邻居谈谈。

     

  • 谷歌流感预测(Google Flu Trends)会高估流感的发生几率。他们已经下线了这个产品。它的工作方式是关注那些和流感发生有很高相关性的词语,然后似乎把「高中篮球」之类的完全没有因果关系的词也学进去了。


  • 亚马逊建立的招聘工具有性别偏倚。亚马逊拿自己的招聘数据训练了模型,然后模型就简单直接地反映出了亚马逊在招聘时的性别偏倚(也就是说,更倾向于招男性)。所以他们一直都没有使用这个工具。但同时他们的潜台词是:我们不用这个工具就没事,当前确实存在的性别偏倚也就当作不知道了。和上面一样,贴墙纸遮住了事。


为什么不用数据简化你的生活呢?为什么不?

如果工作里没有什么反馈告诉你做的对不对、做的好不好,你可能会觉得很疲惫。尤其是做学术研究,或者你没有直接上级的时候,不确定自己现在做的事情有多大意义是挺常见的一件事。如果有个老板或者上级告诉你应该做什么,感觉上会轻松一点,但是我偷偷跟你讲个实话,没人能真的弄明白。不管你做了十几年还是几十年,不管你有多少社会阅历,你都不可能从某一天开始就对这个世界上的一切都一清二楚。


有一种解决办法是用数据度量你的进展,这会给你提供一些反馈。可以算是通向成功的指标吧。


  • 「今天我读了 5 篇论文。」

  • 「这周我做完了一个 10 页的报告。」

  • 「我的网站这个月有 10k 访问量。」

  • 「今年我拿到了 20k 的奖金。」


某种程度上,用数字度量成功是一种很棒的方法,能帮你简化工作、帮你更高效地工作。不过这些数据也过于简化了「成功」这件事,怎么可能把所有条件用简单的几个数字就表示出来呢。


  • 比如你收入很高,但你不喜欢你的工作内容。那你还成功吗?

  • 比如你的论文经常被引用,但你对真实世界还没造成什么实际的影响。那你还成功吗?

  • 比如你有上千个关注者,但是没有人在看完你的动态之后点赞留言。那你还成功吗?

  • 比如你在机器学习竞赛中取得了很靠前的名次,但是你偷偷利用了数据里的漏洞,就和其它排在前面的参赛者一样。那你还成功吗?


其实很难说什么时候要为了达成某个数字而努力,什么时候又不要。在我看来,如果要在「达成数字」和「难以测量的工作」(比如研究新的产品,而不是卖更多旧产品)做一个取舍的话,整个社会的口味都严重偏向于达成数字的那一边。机器学习领域也是一样。


当我觉得某人仿佛在「为达成某个数字而努力」的时候,我脑海里会浮现出赛马的景象。有一匹很漂亮、很强壮的马, 经过人们的训练它可以跑得很快。然后如果它在比赛里获得了好的名次,人们就会给它奖励胡萝卜吃(我不太确定马是不是特别爱吃胡萝卜,不过为了方便我讲故事,我们暂且认为马最爱吃的就是胡萝卜吧)。为了让马的注意力完全集中在目标上,人们给马眼睛上戴了眼罩,它会遮住马对左右两侧的视野,让它们只看得到前面。现在我们就是这些赛马,我们每个人都带着眼罩,让我们只能「盲目」地为了评价指标而努力。但是很多时候,如果我们左右看看的话,也许赛道边上就是一片无人照看的胡萝卜地。



作为机器学习这个领域内的成员,我们已经在错误的机器学习比赛里面比拼了太久了。我们得摘掉头上的眼罩。所以我写了这篇博客,希望能启发更多人摘掉自己的眼罩,以及希望这个领域的关注点能够不再局限于模型表现,而开始更多地关注数据、解释性、应用场景以及社会影响。


via :

https://bentoml.com/posts/2019-04-19-one-model/




*延伸阅读


点击左下角阅读原文”,即可申请加入极市目标跟踪、目标检测、工业检测、人脸方向、视觉竞赛等技术交流群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~


觉得有用麻烦给个在看啦~  

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/32167
 
177 次点击