3.326. 三生万物
3.326.1. 介绍
之前写的AI架构设计入门(以下简称《入门》)给一些同事分享后,有一位同事提了这样一个问题:
关于“可穷举”这一点,想请教一下,设计阶段,该如何判断一个视图已经考虑了所有要素的所有可能性呢?如果引入一个“影响因子”很小的要素来深入分析,会存在过设计风险;如果忽视了一个“影响因子”很大的要素的可能性,就会导致设计遗漏或不完备。有什么有效方法论来避免以上两种情况吗?还是需要凭借架构师的经验或者踩过足够多的坑才能形成职业嗅觉?
这是一个很好的问题,我觉得其实我已经在原文说了,但没有这么一个交互的问答过程,我还是强调不出这里的要点是什么。
本文就着回答这个问题,尝试强化原文表达的概念。
3.326.2. 三生万物
道德经说,一生二,二生三,三生万物。这里包括几个名?或者说几个分类?它想要表达的是一万个分类。但其实从信息论的角度说,这里只有4个分类:
1
2
3
1,2,3之外的其他一万个
或者更严谨一点,这里的万,是泛指,表示无穷,反正多到说不了,你认为除了1,2,3之外还有很多就行。
所以,《入门》里面反复强调:Token(逻辑)是数字化的,是穷举出来的。就是这个意思,我们从来没有记住“全部”,我们记住的是有限的分类,其他都是逻辑推理。
这个问题在《逻辑哲学论》里是这样表述的:
5.2 5 2 2 Accordingly I use the sign ‘[a, x, O’x]’ for the generalterm of the series of forms a, O’a, O’O’a, . . . .Thisbracketed expression is a variable: the first term ofthe bracketed expression is the beginning of the seriesof forms, the second is the form of a term x arbitrarilyselected from the series, and the third is the form of theterm that immediately follows x in the series.
简单说,就是所有的“无穷”,都可以表达为一个三元组:[a, x, O’x],初值是a,如果x是这个集合中的一个成员,那么它的下一个成员是O’x。
这个定义和前面那个几乎是一样的。
所以,我们认为9比7大,这是我们的神经网络(不可描述的隐层数据)记住的,但13968比999大,我们是推理出来的。我们是先看到13968包含“超过三位”(注意,我甚至没有归类为“5位”这个精细集合),而999是三位,我们又记住了“位数越多的正整数越大”,所以我们才推理出13968比999大。
我们是先出一些基本结论,然后组织成有限的集合,然后用“逻辑”进行推导的。逻辑,从来都是在“穷举”。所以,CPU在机器学习上逻辑上就没法比GPU快,CPU就是用来算这种因果的,前面的步骤没有完成,后面的步骤就开始不了。GPU是并行计算的,但你看它到了蹦Token的时候,它也慢了,因为前面的没出来,后面的蹦不出来。
逻辑这么慢,为什么还要用逻辑呢?因为它推理(穷举)快啊。13968的位数比999多,我直出结论:13968比999大,我不需要管13969,13970这些是不是比999大的。
但慢就是原罪,如果你推理不完,你也是要出结论的,所以,道德经说:道曰大,大曰逝,逝曰远,远曰反:你加的逻辑越多,逻辑就变成感性认识了。我们就把那东西当作一个黑盒了。一旦它成了黑盒,它里面的东西你就看不见了。
你分析一只猫,认为它会抓老鼠,这形成一个逻辑判断。但你现在面对一万只动物,熙熙攘攘站在你面前,这些动物抓不抓老鼠?这就说不清楚了,我现在给你“总结”说是动物,其实我又没有一只只点过,谁知道是不是都是动物,说不定里面还有一个洋娃娃呢?
所以,一旦我们开始用统称,什么“道”,什么“那堆”,“就那些”,“你知道的”……这些名字的时候,我们其实不在说某个特征了,我们在说另一个特征:“大”,大到“我看不见特征”,这叫“逝”。逝到一定的程度,你看到的特征就会相反,相反,再相反,不再具有稳定性了。
正因为如此,逻辑空间一旦不可穷举,我们对它的认识就会“恍惚”,我们的结论就不可信了。好比之前网上有个热梗,很多人看不出来“2.9 > 2.10”。因为他们脑子中形成的Token是这样的:2点9和2点十谁大?2是一样的,9比10小,当然是2.10大了。
这个问题,只要你穷举一下逻辑空间,马上就有正确的答案。但如果你不穷举一个逻辑空间,那么这个判断就会停留在恍惚上,很可能就判断错了。
架构设计的所有方法和技巧,都是让逻辑变得非常复杂的时候(比如做一个包含数百万行代码的软件),怎么维持你的判断还是理性的,而不会停留在恍惚上。
3.326.3. 架构设计的逻辑
当我们面对一个复杂的系统,我们就是面对一个“道”,一个“大”。我们很难判断怎么做才行。为了让我们可以穷举,我们可以进行分类。但怎么分类,你会有完全不同的结论。
这就是为什么《入门》中强调“视图”,视图就是一个分类方法。而且一种分类方法控制不住,我们就用更多的分类方法,但如果视图太多,视图本身又变成“大”了,它又没用了。
那视图怎么用呢?我们还是用例子来说,比如还是那个电话交换机作为例子。我们先这样建模:
用户先拉一条线到交换机上,我们用一块单板和它通讯,这块板,我们叫“用户板”。
用户板总结用户的要求,把要找谁发到中央CPU上,中央CPU负责找他要求的那个被叫是谁,定位到对应的另一个“用户板”上。
被叫的用户板找到另一个用户,中央CPU把这两个用户的通道在网板上连接在一起,让他们接通。
这个抽象层次,是不是就“有逻辑”了?是不是“都说通”了?是不是“穷举空间有限”了?这建立了“可以思考”和“沟通”的基础。
但别急,我们可以思考和沟通了,但我们还没有思考和沟通呢。
用户拉一条线到交换机上,用一块单板做通讯,然后我们“在沉默中传递”这个结论:这个单板就可以把用户的请求发给中央CPU了。
这个结论可信吗?
一种可能是:完全可信。为什么?因为“友商就是这么做的,这是行业通例”;因为“我们在另一个产品已经这样做了,我们有成熟经验”;因为“有一份论文,某某学校有经过验证的实验数据说明这是可行的”……
现在你可以选择是否“相信”这些条件了。也可以开始和你的伙伴“沟通”这些条件的置信度了。
第二种可能:完全不可信。为什么?因为“这种方法在另一个产品中就试过,那个产品就因为多了这个用户板导致时延增加,用户没法接受这样的时延的,你这个产品卖不出去”,因为“友商使用这个用户板是因为他们可以拿到这个用户板的供货,我们和那个供货商是竞争对手,我们也没有这种产品线,用毛去做啊?”……
你看,这些你也可以用来“思考”和“沟通”的。架构设计的目的就是把所有这些条件全部给你摆上来,每个都有一定的置信度,你要选择“相信”,还是“不信”。这些信息也许你平时也听到这样一些,那样一些,但你建模到一个视图中,你就从恍惚变成理性了。你就不再认为2.9比2.10小了。
除了条件和结论,视图的另一个判断空间就是,“可以说的都可以说清楚”的逻辑了:还是上面那个视图:你用的条件我们都信,我们相信你可以做用户板,相信你可以在交换机控制用户板的信道互通。现在你告诉我,一个交换机你打算插几块用户板?64块?好,每块10个用户,你可以支持640个用户,我们的设计目标是万门机,你告诉我:你打算怎么实现这个需求?
这就是《入门》中提到的逻辑“天网”了:你说的我全信,但做完了你还是没有实现需求。你打算怎么“躲”开这个结论?
3.326.4. 结论
现在我们可以回到最初的问题了:那位同事问如果忽略了一个影响因子怎么办?架构设计的一切目的都是为了帮助你看到这个影响因子啊:我们帮你找出你有可能掌握的每个要素,无论是你的经验,还是参与你的方案交流的每个人的经验,然后我们用逻辑方法对每个可能性空间都进行推导,看看有没有遗漏的部分,把你的所有恍惚变成理智。剩下的,看不到的东西,那就是那句话总结的:
到老方知非力取,三分人事七分天
世界是所有要素综合的结果,结果怎么可能因为你这一个要素就改变呢?
你看,这句话本身,也是一个高层判断的逻辑。