LLMForEverybody

Probabilistic vs. Deterministic

不确定性 vs. 确定性

量子力学-上帝掷骰子

薛定谔的猫

把一只猫、一个装有氰化氢气体的玻璃烧瓶和镭225物质放进封闭的盒子里。当盒子内的监控器侦测到衰变粒子时,就会打破烧瓶,杀死这只猫。根据量子力学的哥本哈根诠释,在实验进行一段时间后,猫会处于又活又死的叠加态。可是,假若实验者观察盒子内部,他会观察到一只活猫或一只死猫,而不是同时处于活状态与死状态的猫。

alt text

爱因斯坦觉得不对,他说:“我不相信上帝掷骰子。”

这个实验争论的焦点是,猫是在没有打开前就已经决定了死活,还是打开盒子那一瞬间才决定了死活。经典物理学派认为这只猫在没打开盒子前,早就生死已定,这是基本常识;而哥本哈根派则认为,没打开盒子,猫处于又死又活的状态,只有打开盒子才决定了猫的生死,这是微观粒子的特性。

哥本哈根派认为,这只猫实验的根本错误在于,人们用宏观世界的常识来判断微观世界的特性。

alt text

学术界的结论

在软件开发领域,尤其在大模型进入工作流后,也有确定性vs不确定性的区别。

传统软件开发-确定性 Deterministic:

注:这边的软件不考虑故意的随机性输出,比如随机数生成器。

在软件开发的数据流中,我们一般会遇到三种问题,白洞,黑洞,灰洞。解决掉这三类问题,数据流就成了。但隐含前提是确定的输入会产生确定的输出,软件要保证幂等,即不管第几次输入相同的内容,输出要是一致的。在实际开发中,没有幂等是不同次的输入事实上是不一样的,只是你以为一样而已。

对于特定的输入,软件的输出是确定的,这就是确定性。

大模型应用开发-不确定性 Probabilistic:

大模型的token生成本质上是基于概率的,当输入完全一致的时候,输出也会不一样。

Greedy

大模型没有采用这个策略!

选择概率最高的单词/token,这样的方法叫做贪心算法,但是贪心算法会导致输出的重复性,因为贪心算法只会选择概率最高的单词,而不会考虑其他单词的概率。

alt text

Sampling

大模型采用这个策略!!

使用随机策略在所有token的概率中选择一个token。在这里,“cake”被选中的概率为 20%,但实际上选中的是“banana”。

alt text

Top-k

使用随机策略后,从前k个结果中选择一个token作为输出。

alt text

Top-p

使用随机策略选择一个输出,候选集为按概率排名靠前的连续结果,且累积概率<=p

alt text

经验教训 Bitter Lessons:

不确定性是一把双刃剑

一方面,我们的生成更加的多样化,在一定程度上提高了生成的质量,比如生成的文本更加的丰富多样,更加的有趣。

另一方面,在期望json或者sql/代码等严格输出要求时,这种不确定性有时候是无法接受的。

大模型的不确定性,是由于模型的特性决定的,不是因为模型的实现问题。在LLM应用开发中,全流程的参与者都需要预判这种不确定性,以便更好的处理edge case。

FAQ:原来的机器学习/深度学习是什么类型的?

一般来讲,这些的输出都是Greedy策略:只会选择概率最高的。对于确定的输入,会给出确定的输入。如果两次输出不一样,那一定是模型层面的输入不一样。

参考

[1] GitHub: LLMForEverybody

[2] deeplearning.ai