算法的本质
算法到底是什么?在算法科学家眼里,这个问题很简单,算法就是有输入、有输出的解决问题的计算步骤。可记住这句话你就懂什么是算法了吗?并没有。
所以说,我们想讨论的其实并不是“算法是什么”,而是“什么是算法”。
请注意,这两者是有区别的,前者告诉你一个知识,给你一个算法的定义。后者带你理解算法,让你识别出计算机做事与人类做事的核心差异。理解了这个核心差异,我们自然就懂了算法是什么。
1 算法对明确性有极其严苛的要求
什么是算法。要理解这个问题,我们要先追问,计算机做事与人做事的核心差异是什么。咱们来看这么一个案例。
有一位特别厉害的媒婆,王婆,牵线搭桥的成功率特别高。隔壁村的赵婆听说之后,来跟王婆取经。
王婆告诉她,“我给人介绍对象就看四要素:双方离得近不近,年龄相差大不大,爱好匹不匹配,性格合不合得来。这几条大都满足就合适。其中性格最重要,只要性格合得来,其他条件可以适当放松。”
赵婆学完,果然牵线搭桥的成功率显著提升。
王婆的孙子是程序员,他跟王婆说:“您把方法告诉我,我给您写一套算法,自动匹配,不用挨家挨户跑去看了。”王婆听了高兴坏了,这孩子太有出息了,于是把这四要素如数家珍似的讲了一遍。
结果,王婆的孙子很失望,“您这四要素不是算法,计算机实现不了,要不您再想想?”
这“四要素”明明帮赵婆也提高了业务能力,为什么不是算法呢?算法要求有输入、输出、计算过程,这“四要素”方法也有啊。这输入是男女生的住址、年龄、爱好、性格四个维度的信息,然后做匹配计算,输出就是匹配的人选呀。
问题出在,这“四要素”的方法不够明确。是输入也不明确,计算过程也不明确。
就拿离得远近来说,表面上看很明确,输入双方住址,计算距离呗。但就算你把经纬度都要来,也解决不了“近不近”的问题。
我们来分析一下,多近算近?方圆几十公里算近吗?你可能有过这样的经验,住在市中心,3公里以外都懒得去,嫌远。住在郊区呢?10公里,开车也就一脚油的事,都算近。所以,什么叫近,不明确。
其次,离谁近?是男生和女生的家?还是包含工作地点?如果有好几套房子呢?怎么算?这也不明确。当出现多个地点,多个距离,怎么处理优先级呢?也不明确。
你可能想,有这么复杂吗?的确,王婆亲自来干,或者教给赵婆,都没这么复杂。但要交给计算机来干,那对不起,这些问题必须明确,一个都不能少。
你看,这就是算法和人的核心差异,人做事可以接受一定程度的模糊,算法却对明确性有极其严苛的要求。
再拿我举个例子。做鱼香肉丝按照菜谱做菜就是执行一套算法。
听起来是这样,做菜也是有输入和输出的计算过程。鱼香肉丝要输入猪肉、泡姜、木耳,要猪肉切丝、盐少许、酱油少许。烤蛋糕要输入15克黄油,30克面粉,要放进200度烤箱,烤20分钟。
但你仔细回忆一下,鱼香肉丝的辅菜稍微有点变化,或者换个人做,味道可能就不一样了。但烤蛋糕只要严格遵照菜谱,谁来烤都一样。所以从这个角度来说,鱼香肉丝的菜谱不是算法,烤蛋糕的才是。因为烤蛋糕的菜谱可以无数次复现,谁来干都一样。
到这里总结一下,算法要求极其明确。当一个解决方案足够明确,必然可以让这个算法无数次再现,同一个算法,相同的输入必然可以得到相同的输出。不会因为执行的计算机不同、人不同,就导致不同的结果。
能不能复现也是我们衡量明确性的标准。当你有一个问题要交给算法解决,就要不断明确每个细节,保证算法执行之后能够复现。所以本质上来说,算法就是一套通过确定性保证解决问题的工具。
2 模型化是算法优势的本质
好,算法需要明确,可只靠严苛的明确性,就能叱咤人类社会吗?
你可能有这样的感觉,算法在今天已经侵入我们工作和生活的方方面面了。找对象,可以上王婆的红娘系统;想网购,下单一个保温壶,购物网站会一直推荐保温壶;想看电影,搜索一个《风声》,各种谍战片扑面而来。
算法是靠什么优势,成功“入侵”人类社会的呢?我的答案是,模型化。你可能不会想到,刚才那些看起来完全不相关的程序,背后可能是一套算法。
什么叫模型化?简单来说,模型化就是对不同的问题,用同样的方式来看待,用同一套算法来解决。
购物网站、搜索引擎,没有“红娘四要素”这个理论,甚至还需要调用不同行业的背景知识,但数学模型可能完全是一样的。
比如,在红娘算法中,人与人之间的匹配分数,可以被看成是一个“距离”问题。匹配度高,距离近;匹配度低,距离远。距离,可以定义人和人的远近,也可以定义商品和商品的相关性,可以定义搜索词和电影之间的相关度。
表面上,这是红娘牵线问题、商品推荐问题、搜索引擎问题,但在算法工程师的眼里,这全是“距离”问题。这就是模型化。模型化最大的价值,就是赋予算法超乎寻常的问题迁移能力。
我看过一个这样的研究,慕尼黑工业大学用算法预测《权力的游戏》的剧情。你看过这部美剧肯定知道,剧中人物常常意想不到就送命了。这谁活谁死,能预测吗?还真别不信,这个团队在最后一季上映之前就预测,龙妈是所有角色中最可能活下来的。
正确与否,咱先不论,就说说这个团队预测用的模型。他们用的是保险公司的寿命预测模型,是不是又出人意料,又合情合理?保险公司分析的什么?是人的寿命和性别、遗传病史、是否吸烟等等之间的统计关系。而剧情里同样包含了角色的寿命和他们所处的家族、配偶、联盟信息等关系。
脱去现实描述,里面隐藏的是就用多个变量来估计一个目标变量的统计预测模型。
你看,模型就是一个问题脱去现实描述外衣之后的逻辑内核。同样一种逻辑内核可以在不同的问题中穿梭,来描述不同的现实关系。正是这种穿梭的能力,让算法能在不同领域中快速迁移。
3 算法没有好坏之分,背后都是人的思想
你可能也听到了一些不同的声音,算法带来了歧视、排斥、不公平。怎么有的算法“好”,有的算法“坏”呢?我想给你送达的最后一个认知是,算法没有好坏,背后都是设计者的思想。
咱们还是从一个案例来讲。机器学习领域有一个很经典的算法,叫K临近算法,在解决分类问题上很好用。比如,在做肿瘤活体实验之前,用K临近算法可以通过肿瘤的特征信息,判断它是良性的,还是恶性的。
那具体K邻近算法是怎么实现的呢?我们每看到一个新肿瘤,就把它的特征和数据库里和它最相近的那几个肿瘤进行比较。比如说,有10个最相近的,里面8个是良性的,2个是恶性的。于是医生可以预判,患者有20%的可能性,得的是恶性肿瘤。
同样一套算法,也被用到对简历进行评分上。结果,申请人的性别成了影响预测结果的主要因素。同样的简历内容,把名字改成男性的名字,算法就给出高分,改成女性,得分就较低。这是赤裸裸的歧视啊。
同一套算法,怎么一会“好”,一会“坏”呢?
其实,如果你把这套算法再用回到肿瘤的预测,也可能有类似的问题。把患者的性别从女性改成男性,那么预测出是恶性肿瘤的概率也会高一些。因为男性得癌症的几率高一些,这时候,我们不会认为算法歧视吧。
在算法抽象模型的迁移当中,我们能接受肿瘤预测中的“歧视”,但容忍不了简历筛选中的“歧视”,这是算法出了错吗?不是。问题出在了,应用K临近算法的算法设计者对问题的理解上面。
K临近算法认为,要预测的数据和已有的数据在分布上是类似的。也就是说,在诊断肿瘤的时候,数据库中的男性更容易患癌症,那么预测的时候,男性患癌症的概率也更高。
但在简历预测的问题中,这个假设就不一定成立,或者说不应该成立,可能过去职场就存在歧视,又或者采集的数据中男女性别不平衡出现了问题。
不是算法错了,只是在不同场景里,我们需要的价值偏好和设计思想不同。
所以,不要对算法评判对错、评判好坏,算法的模型只是人思想的体现,如果算法出了问题,请回到人身上找问题。
算法永远不会完美,在这里,借用统计学家乔治·博克斯的一句名言:“所有的模型都是错误的,但有些是有用的。”算法也一样,没有好坏,有用就好。