2018年5月8日

以麻辣火锅为例,解释机器学习原理(口水流了一地)

以麻辣火锅为例,解释机器学习原理(口水流了一地)

啥,火锅?!对,你没有看错,就是火锅!

文/ 欧剃 编辑/肉圆


啥,火锅?!对,你没有看错,就是火锅!

冬天到了,谁不喜欢暖烘烘、香喷喷的火锅呢?想象一下,当你坐在一家你最喜欢的火锅店里,当服务员给你端上热气腾腾的锅子,当食材在沸腾的汤汁中翻滚沉浮,那四溢的香气简直要让冰冷的寒冬都退避三舍。

img

但你有没有想过,在这锅美味的背后,到底都有哪些工序呢?我指的可不是流着口水涮羊肉的过程,而是从最初对食材的挑选到服务员把锅端上桌的整个过程!有趣的是,这和机器学习过程中所需的工序并没有什么太大的区别。

骗你是小狗!听我一项一项细细说来~

1. 挑选食材——数据生成

为了打造最丰富的口感和最诱人的芳香,对食材的挑选是我们准备火锅的最初步骤,也是一切准备的基础。所以,我们得在市场里花费许多时间,锁定需要的食材和佐料。

这就像一开始的数据生成过程,就像那些用户操作,或者那些会触发传感器的移动、热源或噪声信号等,在这一步,我们将从所有可能的特征中,选取和最后模型直接相关的那些,并据此定下需要生成、测量、统计哪些数据。

img

2. 购买食材——数据收集

当你在市场上挑选到需要的食材和佐料之后,我们得把它们买下来,这个不难理解吧?

同样,这就对应了数据收集的过程,也就是通过统计程序、浏览器、传感器等,收集到所需的各种实际数据的过程。

img

3. 运输食材——数据准备

在采购结束后,我们得把这一大堆食材运回后厨,放进仓库里备用。这一步,你可能需要对食材进行简单的分类,比如有的食材需要放进冰箱或者冷库。

这就像是把数据整理到数据库或者数据湖之类的仓库里,以便程序读取。同样,在这一步,你可能需要把数据分成用于训练和用于检测等不同的部分。

img

4. 选择厨具和锅型——确定数据预处理方式和算法

对每一种食材,你都需要一个合适的厨具来处理它。如果你需要给土豆削皮,那刮皮刀显然比剪刀好用,如果你需要剁排骨,就得放下那个漏勺,抡起大菜刀。同理,对不同风格的火锅,也有不同类型的炊具(锅子)可供选择。比如老北京火锅,你就得用带烟囱的铜炉,而重庆火锅还是九宫格的有味道。当然为了满足各种不同的客人,你可能还得准备一些比较复杂的鸳鸯锅什么的。

当然,许多情况下,最简单的往往才是最好的——你一般不会见到哪家火锅店专门拿“鸳鸯锅”做招牌吧?——反正我是没见到。

img

同样,在机器学习的过程中,厨具就是你要采用的数据预处理方法,而炊具就是算法,比如线性回归算法或者随机森林算法等等。没错,如果真的有需要,你确实得准备点鸳鸯锅,额,我的意思是深度学习算法。这些不同的选项将是影响你模型效果的超参数。对于简单的锅子算法来说.,这些超参数不多,但对于复杂的算法来说,超参数将会非常非常多。

此外,复杂的算法并不能保证一定会得到更好的结果(如果你不相信,请试试用下面这种锅来煎蛋什么的)。所以,请务必慎重选择你的算法。

img

传说中的煎蛋锅。图片来源:阿里巴巴网站

5. 选择配方——选择模型

选定食材和炊具之后,你还需要选定配方,按照配方的要求准备好锅底所需的各种调味料、食材和锅子,这些千变万化的组合,最后形成了豚骨小锅、牛油辣锅、清汤老火锅等等一系列不同风格的产品。

这就是你的模型。不,模型和算法并不是同一个东西。一个模型包含了算法所要求的预处理和后处理过程

img

既然说到了预处理,我们的下一个步骤就是……

6. 处理食材——数据预处理

我打赌,大部分配方的开头,都只写着“把xx切片”或者“把xx去皮”之类的话,而不会告诉你要把食材洗干净。这基本上算是一个默认的前提条件——毕竟没有人喜欢吃脏土豆,对吧?

对数据来说也是一样,没有人喜欢肮脏的数据。你需要进行数据清洗,也就是说,处理那些缺失值和异常值。然后你也要给它们削削皮、切切片——我是指,你要对数据进行预处理——比如将分类特征的值(比如“男/女”等)进行数字化编码(用0、1等数字来代表每种类型)。

大家都不喜欢这一步,不管是数据科学家还是厨师(大概吧)都不喜欢。

img

7. 打造特色——特征工程

有时候,你可以在食材上发挥许多创意,让它们发挥出不一样的特色风味,或是呈现出复杂精致的外观。

比如你可以用香料腌制切成薄片的牛肉,配上芳香的白芝麻;也可以把蔬菜切片摆盘成特殊的形状,再撒上一些清水;还可以用切碎的小米椒搭配香油蒜泥,加上秘制调料配成特色蘸料……

没错,这就是特征工程!这一步很重要,因为如果你干的足够巧妙,它能在很大程度上优化模型的表现。

基本上差不多每个数据科学家都喜欢这一步,我估计厨师们也一样。

img

8. 开始烹饪——训练模型

这一步是一切的重心——没有经过烹饪,锅底就只是那些食材和香料而已。显然,你需要将各种原材料放进炊具里,调整火候,等上一段时间,然后再来看看。

这就是训练模型的过程了。你把数据放进算法里,调整各种超参数,等它训练上一段时间,再来检查一下。

img

9. 品尝调味——微调参数

就算你逐字逐句依照菜谱来做,你也无法保证每一个细节都完全无误,对吧?所以,你要怎么知道有没有弄错什么?当然是尝一尝啦!如果汤底不对头,你可以尝试加一些调料进行调味,也可能要调整一下火候来挽救一下什么的——但你还是要继续煮下去!

某些不幸的时候,你的锅底可能会黏住、烧糊,或者不管你怎么去挽救,汤的味道尝起来都很恐怖。那么,你只能含着热泪把它倒掉,从失败里吸取教训,重新来过。

img

调味就像是评估和微调的过程。你需要检查你的模型,判断它是否按照你设想的那样运行。如果不是,你可能需要加入更多的特征,或者调节超参数,以期对模型产生改变。但你还需要继续训练下去!

同样,在某些运气不好的时候,你的模型完全无法收敛,或者不管你怎么调整它都无法给出满意的预测结果。那么,你也只能含泪丢掉这个模型,吸取教训,从头来过。

只要坚持不懈,在加上一点点运气,你还是很有希望训练出一个高性能的模型啦~

img

10. 端菜上桌——打包部署

到这一步,从厨师的角度来看,ta的工作已经完成了。火锅已经准备好,食材和涮料齐备,搞定。

但我们的客人还是饥肠辘辘,桌面空空如也。如果火锅店没有及时把客人点的东西送上桌,那这个店多半是要倒闭的,厨师也得下岗。

所以,当一切齐备的时候,还需要小心地将火锅端上桌,布置好各种涮菜、小碟,餐具、漏勺,客人们才能开吃。如果上菜的时候把食材洒了,甚至把锅底打翻了,那之前干的活都白做了。

这个过程就像是机器学习模型的部署过程。这时候端给客人的就不是火锅,而是预测函数。就象锅底一样,预测函数也要“装起来”,上线部署变成“数据产品”,让客户可以把“食材”数据放进去,并且得到想要的结果。如果在这过程中流水线(pipeline)出了问题,甚至对预测函数产生了破坏,这之前所有的训练和调整过程也就都“泡了汤”啦。

img

当当当!搞定啦!这就是火锅里的机器学习之道——在这个过程中,许多人共同努力,合作熬出了最后的美味!

几个小贴士:

  1. 如果食材本身不好,做出来的汤肯定不行——没有什么配方能挽救这种问题,也没有什么炊具能改变这个现实。
  2. 如果你是厨师,请别忘了,要是服务员不把锅端上去,那就没有人能享用到这些美味了。
  3. 如果你是餐馆老板,别强迫你的厨师用什么厨具/炊具——你不可能一把菜刀应万变,也不可能永远都用鸳鸯锅——另外,如果你的厨师不得不花上大量时间清洗和处理食材的话,ta一定不会很高兴的。

说了这么多,不知道你的感觉如何,反正我是按耐不住,要去吃一次X底捞了……

欢迎大家留言分享你对“火锅”的看法!

img

参考和图片来源:

了解《机器学习工程师》纳米学位