最近语义作画人工智能Stable Diffusion等火爆全网,让会点绘画的我惊掉了下巴(本文插图为新近赢得艺术大赛的AI画作),深感再不学点数学和编程,就要被淘汰了。遗憾的是,参加工作以后,数学就还给老师了;之前学习编程语言,也遭遇瓶颈无法破局。不得已,只能退而取其次,从读书和测试入手,专攻算法思维学习和技术工具应用。前段时间啃了布莱恩 · 克里斯汀、汤姆 · 格里菲思合著的《算法之美》,有不少启发,赶紧跟大家分享心得。下面略过计算内容,分享实用内容。
本文共5000字,如果你觉得看文字太累,可以用微信读书来听,方法参见《好文章来不及看?让微信读给你听!》
观察与行动
时间流逝把一切决策都变成最优停止问题:何时停止观察,开始行动。该理论假设我们有若干个选项,但一次只能面对一个对象做选择,选「是」则停止选择,选「否」则继续查看,直至做出选择或选项终结。从信息角度切入,最优停止算法有两种情况及其策略可以参考。
1. 对象特征可量化且信息充分时,用阈值准则:设置标准和参照,高于阈值马上行动。假设你为了找一个身高1米8的秘书而逐个面试对象,那么当你看到第一个身高超过1米8的候选人时,就可以做决断了。如果你想从候选人中挑出最高的人,而候选人还很多,那么标准可以严格点,如把1米9当标尺来过滤对象;如果没剩几个了,那就放低标准,如超过1米75就录用。如果是更复杂的指标,则请教专业人士,参考社会标准,建立阈值(预期),降低选择难度。
2. 对象特征不可量化或信息不足时,用观望准则:建立标准和参照,高于最优马上行动。设定一个观察期,考察目标,收集数据,无论人选多么优秀,都不要接受他。观察期结束后是行动期,一旦出现优于观察期最佳对象的人选,就立即决断,绝不犹豫。许多人都听过37%法则:假设你有100个候选对象,那就先看37个,然后用其中最好的那个作为标准,后面遇到对的每个人都跟这个人比较,比他差的就放弃,好的就选中。
当然,你用这些法则去相亲,大概率会被单着。因为上述讨论还假设了单向选择,没有成本,没有风险,且你不能吃回头草。事实上,仅增加时间成本的考虑,37%法则就可能被改写为31%法则。如果再增加爆发点和爆仓点的考虑,问题会变得更加复杂。书中有许多接近于现实世界假设的讨论,为找对象、买房、停车等问题都给出了参考意见,需要的朋友可以去读。
探索与利用
在算法逻辑里,探索(explore)是指收集信息,利用(exploit)则指利用所拥有的信息,以产生一个好的结果。探索和利用的问题,有大量论文,很多都讨论了多臂老虎机问题,并引出赢留输变算法、基廷斯指数等模型,但这些距离现实生活太远。更具象的比喻或许是:在我余下有限时光里,应该继续投入时间学习新知识,还是转化前期积累的旧知识?我该继续结交新朋友,建立更广关系网络,还是加深跟老朋友的关系,争取实实在在的产出?
理论上,剩余时间决定我们的选择,时间充裕则继续探索,时间不足就抓紧利用。现实中,除非你自己觉得时日不多,否则探索都应该是你的优先选择。首先,喜新厌旧的人类喜欢过度探索。人们对新鲜事物的青睐程度超过效果最佳的事物。即使游戏快要结束、应进入纯利用阶段,他们也不愿意选择最佳方案。心理学家和行为经济学家在实验室里广泛研究这一现象。其次,复杂多变的世界强化探索倾向。既然世界是变化的,那么正确的选择可能就是继续探索。只要事物不断变化,我们就必须不断探索。多变的世界助推求新倾向,过度探索、持续探索成为常态。再次,遗憾最小化冲动要求探索优先。遗憾是将我们的实际行为与事后认定的最佳行为进行比较后得出的产物。防范遗憾的最有效措施是乐观主义,表现为一种上限置信区间算法,即在没有相反证据时,假定行动可以取得最好结果,由此增加决策中的探索比重,满怀激情地结识新人,尝试新鲜事物,减少不行动可能带来的遗憾。在解决复杂问题时,最佳的学习策略是花90%的精力来探索(寻找并效仿做得好的人),剩下10%的精力来利用(个体试验和透彻思考)。
在选择可利用的选项时,你可以参考胜者优先算法。假设你只有2个选项A和B,那么一开始,可按照5:5比例在黑箱里放置黑白两种小球,如果抽到黑色小球就用A方案行动,抽到白色小球则用B方案。当某种方案有效时,就增加黑箱里对应颜色的小球,无效时就减少。如此反复操作,很快可以迭代出有效的利用项。生物种类演化、神经网络建构和许多生活场景,都参照该逻辑行事。用进废退,适者生存,能者多劳,强者愈强,存在均衡路径依赖(equilibrium path dependence)。
排序和检索
更好地排序是为了更快地检索。根据复杂守恒定律,前期投入更多精力排序,后期花费更少时间检索。谷歌和必应等搜索网站都是排序引擎。如同我们的大脑,前期更多编码记忆,后期更快提取记忆。我是个喜欢整理的人,有空就会把东西排序归类下,在这个过程中清理掉不必要的东西,突出常用的东西。
书中推荐了许多排序原则,尤其是最近最少使用原则:将闲置不用时间最长的内容清理掉。如果你遵循最近最少使用法,即在把某项放回列表中时,总是把它放到列表的最前面,那么你花在搜索上的时间就不会超过你在预知未来的情况下所需时间的两倍。它不仅是一种有效策略,实际上还是最优策略。
与最近最少使用原则异曲同工的是日本整理专家野口悠纪雄的左侧插入规则:每次取出一个文件,无论旧文件还是新文件,在使用后放回时都必须把它插到盒子里最左边的那个位置。寻找文件时,也总是要从最左侧开始查找。因此,最近使用过的文件很快就能找到。
同理,如果你搜索的是成堆的文件夹,那么搜索顺序自然是从上至下,而且每次你把一个文件放回去的时候,你都不会把它放回到原来的位置,而是放到最上面。macOS和windows系统好像都有这样的「最近打开」文档的设计,符合原则,便捷有效。
这些设计的背后,都是一个基本原理,即时间局部性:如果一个程序曾经调用过某个信息,那么在不久的将来它可能会再次调用这个信息。除非有充分的反对理由,否则我们可以认为未来就是历史的镜像,假定历史会在未来重演。按照时间局部性原则,图书馆应该把刚刚添加的图书整理归档(排序)到里面的书架,让需要的人去那里寻找,而把最近归还的图书放在大厅里(一种缓存机制),以方便学生自由浏览。
有两种情况你不用排序。一是你根本不在某些物品中搜索某个目标,那么对这些排序就纯粹是一种浪费。二是你排序前和排序后的搜索时间差不多,那么投入时间去排序也是一种浪费。由于存在双手排序和双眼搜索之间的速度不对称,所以普通人为了节省几秒找书的时间而把书架上所有的书按照特定索引排序是不合算的。
时间调度
时间调度讨论如何找到时间的最优安排。似乎不存在一种简单直接的算法。即便存在,效果也不会太好。《算法之美》引用研究指出,在所有问题中只有9%的问题可以被有效解决,84%已经被证明是难解的,剩余7%仍是未知,就是时间调度的未知领域。
一般而言,单机调度的第一步,是明确目标,以此建立衡量标准,来评价某种算法是否有效。如果你要降低最大延迟时间,那么最佳策略是最早到期日原则,即先从截止日期最近的任务开始,再以此类推逐渐执行。如果你要最短加工时间,那么总是从能最快完成的任务做起。最短加工时间法推荐你先做任何耗时不到两分钟的任务,类似于GTD做法。
面对不确定性,最短加工时间的加权版本是一种最通用的调度策略。可以将每个任务的权值通过其需要的完成时间进行划分,然后将单位时间重要性结果从高到低排序。在商业环境中,权值可以理解为完成每个任务所带来的利益数额。套用到我们生活中,计算每个任务的单位时间回报率,然后根据回报率排序任务。假设一个心理咨询师去讲座每小时收入1000元,咨询每小时收入300元,那么讲座任务就应该排在咨询任务前面。
有时调度会遇到特殊情况,如「优先约束」:一些低级任务是高级任务的基础或者前置条件,必须优先完成。在初级任务堵塞高级任务时,可增加初级任务的权重,予以优先解决。生活中,睡觉、饮食、运动都是「优先约束」的初级任务,你觉得它们不重要,经常忽视它们,却顶不住身体的困意、饥饿和胀痛。按照情绪建构论的逻辑,身体感受是情绪认知的优先约束,想有舒畅的情绪,先要有舒服的身体。
预测算法
将贝叶斯法则应用于正态分布、幂律分布和厄兰分布三种分类类型,可得到平均法则、相乘法则和相加法则三种预测模式。
1. 正态分布者,用平均法则预测。正态分布也叫高斯分布,钟形曲线,塔勒布所谓的平均斯坦里的一切,都是正态分布。正态分布的事物,我们可以预测其趋近于平均水平。比如说,预测一个孩子未来的身高、体重和寿命,可用平均值做预测值。如果他已经超过了平均值,那就用超出部分作为预测。比如说,中国人平均寿命是将近80岁,那么一个10岁的孩子,你可以预测他还可以再活70年;一个88岁的老人,你可以预测他还可以再活8年。
2. 幂律分布者,用相乘法则预测。极端斯坦里的事物,大多遵循幂律分布,预测策略是相乘法则,即将迄今观察到的数量乘以一些常数。对于无信息先验,该常数一般为2。二战期间,同盟国试图估计由德国制造的坦克数量,他们通过所捕获坦克的序列号预测得出德国每月生产坦克246辆,战后德国记录显示的真实数字是245。同理,塔勒布预测百老汇里已经演了100年的剧目还可以再演100年。预测事物的总寿命为目前寿命的两倍,即为哥白尼原则(也叫林迪效应)。在其他幂律的情况下,所乘的数将取决于分布情况,如电影票房是乘以1.4。
3. 厄兰分布者,用相加法则预测。厄兰分布(Erlang Distribution)是一种没有记忆性的连续型概率分布,无论过去或目前的状态是怎样的,分布结果会产生相同的预测。如丢骰子,你有六分之一的概率丢到1,不代表你丢六次后就一定会丢到一次1。事实上,不管你前面丢了多少次,下一次你的概率都是六分之一。与厄兰分布相关的是相加法则:总是预测事物会再持续一个常量。所以当你朋友在玩游戏时说,「再给我五分钟」时,你可以预期他下次还是会说「再给我五分钟」。
上述三种预测模式似乎都适合小白,是一种「少即是多」的无知福利和直觉补贴。在一片茫然的情况下,小白可以利用无信息先验,快速锚定并预测结果。相反,当你知道的东西增加以后,知识诅咒就会降临。比如说,前文所述的坦克预测,当时空军根据侦查给出的预测是1400辆,几乎是正确答案的6倍。
其它算法
还有一些有趣和有用的算法值得了解下。
1. 松弛与延迟。松弛的拉格朗日松弛算法建议我们放宽问题条件,思考「如果不做会怎样」,让绷紧弦的难题可以松开来,变得可解,这是以退为进的思路。延迟则是用战术性丢包解决超负载问题。要么现在,要么砍掉,now or never。在我看来,必须做的,尽量早做。可不做的,迟些再做。
2. 随机抽样。当我们研究复杂的公共政策问题时,有些人会提供精心挑选个人轶事和统计数据,以此支撑个人观点,掩盖客观现实。作者建议用随机抽样 深入研究的方法,兼顾大样本数据和大范围调研。
3. 递归。递归关乎思维深度(与心智意向性也有关联),打牌如此,用兵也如此,曹操想到诸葛亮可能是用疑兵,诸葛亮想到曹操能想到他可能用疑兵,大家逐层递归,要争取比对方想得更深一个层次,但也不能太多,过犹不及。
4. 占优策略。占优策略是对你对手所有可能策略的最佳反应,所以你甚至不需要麻烦自己了解他们的想法。占优策略可以无视递归,不管对方思维深度达到几阶,你都可以以不变应万变。在即时战略游戏里,靠压倒性资源和兵力优势平A,大概就是占优策略。
5. 机制设计(mechanism design)。诺贝尔奖得主罗杰·迈尔森提出机制设计理论和经济工程学,促成信息对称和激励相容,让市场更好发挥作用。该理论对我们做政策研究的人很有吸引力,但考虑到它建立在经济理性人和市场假设之上,所以我还是要注意其应用的局限性。
最近,我又读了新书《轻松主义》,该书质疑一个普遍存在的无意识假设:重要的事情往往都很困难,唯有付出巨大努力,才能取得较好结果。作者认为,重要的事情也可以是简单易行的,简单易行的方式也可以带来丰硕成果的回报。我们是要努力,但努力不是用笨办法,而是努力寻找复杂问题的简易路径。
技术进步会把过去看似很难的事情变得非常容易。如果我们不能及时获悉和掌握新技术,甚至拒绝接受和拥抱新技术,就会被时代无情地翦除。未来我们和我们的孩子,不得不面对一个算法统治的技术世界。我们要像过去对待艺术和审美那样,重视算法和技术。
算法思维源于生活,指导生活。在困难的情况下,最好的算法都是关于在最少的时间内做最合理的事情,把我们思考的劳动最小化。如果你已经遵循了最好的算法,那么你就已经尽了最大的努力,假设结果不顺心,你也不必责备自己。
最终,有算法总比没算法好。
关于解缚的普罗米修斯
我是温州人,爱好读书和写作,喜欢心理学和数字化。欢迎关注公众号,收藏以下合辑: