Beyond the Void
BYVoid
高维世界与一维价值
本文简化字版由OpenCC转换

我前几天去德国莱比锡参加了ISC学生集群大赛。这个比赛的内容是在限定功率(3000W)的条件下,优化集群的计算性能。每个队伍的集群分别由赞助商提供,清华大学队是浪潮公司赞助的。由于硬件实在没法和别的学校比,我们只好从软件上来优化,比赛的程序包括了LINPACKHPCCHPCGQuantum ESPRESSOGadget。最终清华队获得了全球第三名,也算是尽力了——毕竟我们的集群连GPU都没,而许多队伍配置极尽奢华,像爱丁堡大学连液冷系统都上了。

世界上「最快」的超级计算机

在ISC会议期间,我们得知了中国的「天河2号」以LINPACK峰值54902.4 TFlop/S的速度保持了超级计算机TOP500榜首,全球媒体争相报道。但是在各个媒体的报道中,我们看到的是「天河2号」成为「全球最快的超级计算机」,如Forbes的报道,而纷纷忽略了一个重要细节,即TOP500是以LINPACK的速度来排名的。LINPACK基准测试求解的问题是一个稠密的线性方程组,它完全是计算密集型的应用,其内存访问、并行通信、磁盘读写都不成为瓶颈。因此有人批评LINPACK提供的数值是「基本上无法到达的,却有一小撮程序员在无聊地优化它的代码,为了使得他们的机器获得更好的数值」。实际上衡量一个计算机性能的好坏,仅仅通过浮点计算密集型的应用来估计绝对是以偏概全,真实的系统性能还取决于整数计算性能、内存访问性能、网络通信性能和磁盘读写性能等等各个方面。哪怕是仅仅在科学计算领域,许多应用也不仅仅是在求解稠密线性方程组。许多时候可以认为LINPACK数值完全不具备参考意义,因为大多数科学计算应用的性能瓶颈根本不在这上面。

作为「国家安全战略投资」的天河2号,想必许多时候在求解的问题是破解密码。然而一个可怕的事实是,大量密码学算法,包括散列、非对称加密(如MD5、RSA),都只进行整数计算,完全没有任何浮点计算操作。如此看来,追求高LINPACK数值来提高密码破解的性能,差不多是缘木求鱼。

高维世界的序关系

说到CPU的性能,几年前,大家在装电脑的时候选购CPU只看主频,频率越高越好。于是英特尔为了迎合市场,推出了奔腾四3.0GHz甚至3.6GHz主频的CPU。后来进入多核时代,大家就看核心数,双核的肯定比单核的好,四核的肯定比双核的好。殊不知CPU的性能好坏有太多的参数,盲目追求高的主频或者核心的数量没有意义。不单单是CPU,想想看大家买数码相机看什么呢?许多人第一反应当然是像素啊。买单反镜头?光圈大小!买汽车?排量!买房?面积!

事实上这个道理浅显易懂,但人们却对它无能为力。作为没有相关知识的普通消费者,面对这个世界纷繁复杂的参数真的是无能为力,于是只好选择一个「公认」的参数作为基准了。

这一切的根源在于,向量和向量是无法比较大小的,只有标量才能比较。向量只能通过一些函数变换到标量才能比较,如模长,或者在某个空间上的投影。世界上的任何一件东西都可以用一个高维向量来表示,但为了获得序关系,我们通常只能把它映射到一个一维空间。在这个过程中,大量的信息都丢失了。对于同一组向量使用不同的函数,获得序关系可以是完全不一样的。

这是一个浅显易懂的道理,而人们却无能为力。因为人们天生倾向于用一个一维的数值来比较一切同类的事物(甚至不同类的事物),但事物天生是高维的。

价值观是一个从高维空间到一维空间的映射

人们经常谈论价值观,譬如价值观不同的人不要在一起,现代社会通过价值观把人分为不同的群体。价值观实际上是一个从高维空间到一维空间的映射,也就是一个高维向量的函数。人们面对纷繁复杂的事物,一个与生俱来的冲动就是对它进行评价,然后与其他事物相互比较。在这个过程中,不同价值观的人使用了不同的函数,因此得出的结果是大相径庭的。

商品的价格与价值

作为一个通用的价值衡量工具,商品的价格成为一个被广泛使用的尺度。价格短期看来反应的是供求的关系,但本质上反映了一个长期的、多人的价值。用数学的语言方式表示,价格是一个高维的泛函(Functional),其中每一维的变量都是一个个体的价值观函数,或者用以下代码(OCaml)表示:

(* 价值观是一个从任意向量到整数的函数 *)
type value = (anything -> int)

(* 价格是一个从多个价值观函数到一个价值观函数的函数(泛函) *)
val price : (values_of_all : value list) -> value

(* 一个简单实现:价格即为所有人价值观的平均值 *)
let price values_of_all =
  fun thing ->
    let sum = List.fold_left (
      fun sum value_function -> sum + (value_function thing)
    ) 0 values_of_all in
    let number_of_people = (List.length values_of_all) in
    sum / number_of_people

换人话说,价格反映了全体生产者和消费者的价值观,尽管可能各不相同,但却用一个工具把它们统一了起来,变成了一个单一的可以衡量不同事物的价值的函数。对于一个个体来说,商品的价格可能偏离个人对商品的价值衡量,因此会有感觉便宜或者感觉贵。根据个人是否有钱,个人对价值的衡量也会不同,个人资产可以作为价值观函数的一个其他参数。

用价格衡量价值的方法看似简单粗暴,有诸多弊端,却也有着其他方法无可比拟的优点。其最大的优点就是简单性,因为人类对复杂事物的理解力实在有限。这也是为什么计划经济无法执行的一个原因,因为没有一个把万物映射到一维的函数,或者这个函数取样过于有限,只能反应少数统治者的意愿。

价值多元化

一元价值尽管有着便于比较排序的优点,但却会导致优化目标的单一化。譬如超级计算机只优化LINPACK或其他某个性能,学生为了应付高考成为做题机器,全社会「向钱看」道德沦丧等等。尽管着本身没有什么问题,却会让导致潜在的评估偏差风险。对此,价值多元化的主张被提了出来。价值多元化是把一维的价值标量变为多维向量,也可以理解为是多个价值函数的组合。价值多元化以后,价值本身重新变得不可比较,只能按照维度比较(或者价值向量的函数)。

在我看来,价值多元化没有解决太多的问题,反而丧失了序关系,事实上是一种掩耳盗铃的方法。价值多元化就等于没有价值,只是把一个高维向量映射到了另一个向量,不仅丢失了信息,还无法比较。价值多元化可以当作进一步价值比较的「中间结果」,方便进一步计算而已,最终还是要归结于一维。用金钱衡量一切的一元价值尽管不能解决许多问题,却是人类目前能想到并实践的最有效的方法。但愿会有更好的方式被发明出来。


上次修改时间 2017-03-16

相关日志