从随机开始

在忙着看似没有尽头的各种事的时候零碎想到的,所以就先给记录下来。


关于随机

随机和信息,是大家在日常生活中经常在用的两个术语。
  尤其在计算机、统计学以及信息学领域,而这三个领域现在又几乎已经渗透到了所有人生活的方方面面,不管是什么领域。
  比如社会学现在也用统计的方法,物理学也开始关注信息,计算机作为现代社会的基础也就更不说了。
  最让人关注的,便是计算机科学的基础,计算理论,这货和统计学、信息学的关系非常密切。
  而在这些领域中,随机和信息这两个被大家使用了很久的术语,其准确的定义却并没有大家所想的那么确切。

个人所理解的随机,大概可以这么来表示吧:
  从一个足够长序列中的任意位置开始提取任意足够长的子序列,其元素的分布在统计上都和原序列的元素分布相同,那么这个序列就是随机的。
  但这样的定义显然是不够好的,因为一来这里存在太多无法被精确定义的东西(比如什么叫“足够长”?),二来这样的定义很容易构造出反例来。
  后来个人所想的随机是这样的:
  一个足够长的序列,取值范围为R,则对任何的n和e,存在l,使得下面的命题成立,则该序列成为是随机的:将R做n等分,子序列落在每一个子区域的元素个数的方差小于e,对于从原序列任意位置开始的长度为l的子序列都成立。
  这样的提法规避了之前的第一个问题,就是没有可操作的定义,但依然会有第二个问题。比如这样一个锯齿波:第一个元素为1,此后递推关系为(下面的a为[0, 1]之间的常数):


  当a是无理数的时候,通过上述方法构造的序列是可以满足上面这条对随机序列的定义的,但实际上却不是随机的。
  事实上,这里就存在一个问题,那便是如果一个序列仅仅满足一个统计特征的话,那我们还是很难判定这货就是随机的。
  说到底,统计特征是去除大量细节后的整体特性,而信息或者说规律或者说非随机性往往就是藏在细节中的,可随机本身所说的就是规律性、信息量都尽可能地小,最好为零。
  而,反映规律性的一个手段,就是可以用数学公式的形式来表达,比如逐项公式。
  沿着这个思路往下走,我发现最终要达到的状态,其实是这样的:
  如果一个序列及其各连续子序列如果无法被表达为任何形式的数学公式,那么这个序列是随机的。
  这个提法就已经朝着计算理论迈进了一步。
  这个提法的好处就是,能用数学公式所表达的,基本肯定是有规律的,反过来说,不能用任何形式的数学公式表达的东西就肯定是无规律的。
  当然,这个提法本身还有问题,因为数学公式本身并不能涵盖所有可能的规律性,至少不够直观。因此,更往前走一步,这个提法就可以被升级为:
  <u>如果除了将序列原封不动地打印出来外,不存在任何别的与此不可通约的图灵机可以给出该序列,那么这个序列就是随机的。</u>
  这样,这条东西在保持了上面一个提法的特性的同时,还增加了对信息量的考量。。
  而这个东西,便是与“描述复杂度”,或者更应该称其为“Kolmogorov-Chaitin复杂度”,也可以称为“算法熵”,这么个东西非常相关。

在算法信息学(Algorithmic Information Theory,AIT)中,Kolmogorov-Chaitin复杂度是这么定义的[1]

能够输出形式化对象s的所有图灵机中代码最短的长度值为s的K-C复杂度:K(s)=min(len(T(s)))。
  这么一来,所谓“随机”就可以被这么定义:如果序列s满足len(s)<=K(s),则s为随机序列[2]

我们可以发现,我们从统计的角度来考虑随机开始,最后逐渐还是走到了计算理论与算法的领域中来了。
  通过算法复杂度来定义的随机的本质其实就是这么一句话:
  除了这个序列本身,没有任何方法可以给出这个序列。
  这其实便暗含了Kolmogorov与Martin-Lof关于随机的理念了:
  1,如果知道随机序列的前n项,无法推测出第n+1项;
  2,序列不可压缩。
  当然,如果必要的话还可以继续给出第三点要求:
  3,具有随机的统计特性。


关于算法复杂度

K氏复杂度具有一些很有趣的性质,比如对于任意自然数n,总从存在s使得K(s)>n。这点直接与“不可定义数”相关。
  而另一个有趣的性质则和“不可计算数”相关:存在一个仅和图灵机及语言的选择相关的n,使得所有K(s)>n的K(s)的具体值都是无法计算给出的,也无法证明存在这样的s。这里无法计算表明了K的不可计算性,而无法证明则给出了K的不完备性(Chaitin不完备性定理)。

第一个性质的证明很简单显然,而第二个性质的证明则颇好玩。
  我们假定对于任意n都可以证明存在某个s使得K(s)>n,那么如下的伪代码就会带来很有意思的效果:

T(n)=>for (s in AllString) if K(s)>n then return s

上述代码的“长度”可以被写为len(K)+ln(n)/ln(2)+C,其中C是语言本身所要求的上述函数的字节数。这里因为代码都是二进制的,所以K(s)>n中的n的“长度”就成了ln(n)/ln(2)。而这样的话,我们总能找到一个L使得L>len(K)+ln(n)/ln(2)+C成立,于是T(L)按照代码的逻辑给出的就是使大于L的K(s)的s,但代码T本身的长度小于L,于是按理说就不可能给出K(s)=L而最多只能给出K(s)=len(K)+ln(n)/ln(2)+C<L,从而矛盾,因此不能给出大于某个极限L的K(s)的s。如果将if的条件换成函数“check(s, n)=>可以证明K(s)>n”,那么我们非但无法计算K(s),也无法证明存在这样的s。
  这样的性质当然是很有意思的,但,有趣的是,它本质上似乎更应该说是证明了这么一件事:

如果要构造一个对所有s都有效的K,即通用K,那么这样的K非但是不可计算的,也是不完备的。

但,如果我们将问题改变一下,也许会变得更有趣。

我们假定,存在一个K1函数,它的作用是计算len(s)<=L1的所有s的算法复杂度,如果len(s)>L1则不停机,而这个函数本身的长度为C1。从而我们发现,在上面构造的函数T(n)中如果将K(s)替换为K1(s),那么T本身的长度为C1+ln(n)/ln(2)+c。因此,只要C1可以保证C1+ln(L1)/ln(2)+c>L1,甚至更强一点只要C1>L1,那么K1本身的存在不会引起任何悖论。
  接着,构造K2函数,它的作用是计算所有L2>=len(s)>L1的s的算法复杂度,其函数本身的长度C2>L2,从而这样的K2也不会引起任何的问题。
  因此,K的不可计算性实际上所证明的是:如果我们要计算长度为n的字符串s的算法复杂度,那么这个计算算法复杂度的函数本身的长度不小于n-ln(n)/ln(2)-c,其中c是一个与语言和图灵机的选择相关而与n或者字符串本身无关的常数。
  因此,当我们要计算任意字符串的时候,所要用的K本身也就必须足够大,从而不存在通用的确定的K,对任意n有效。

事实上,从很久以前就在考虑这么一个问题,那就是虽然已经证明通用的停机判定图灵机是不可能存在的,比如下面这个函数就是一个简单的反例,但是否存在对部分特定的图灵机有效的停机判定图灵机呢?

C()=>while(HaltCheck(C))

其中HaltCheck就是通用停机判定函数。显然如果存在这样的通用判定,那么如果C是可以停机的,那么就陷入了死循环无法停机;而如果C是不会停机的,那么就立刻停机了。
  很显然,如果是通用停机判定,那么HaltCheck必然会导致这样的自指悖论。但如果我们换一个思路,假定存在SpecialHaltCheck函数,只对部分特定的图灵机有效,那么上述自指陷阱对这样的SHC函数就是无效的,因为SHC可以不包含这样的自指陷阱,从而避免被自指搞坏。
  当然,这里就带来了很多很有趣的问题,比如是否所有不包含自指的图灵机都可以被归到某一类SHC中?是否存在自指的图灵机可以被某台SHC判定?什么样的自指图灵机可以被SHC判定?
  然后,假定一台SHC1可以判定的图灵机集为A,另一台SHC2可以判定的图灵机集为B,如果A是B的真子集,那么就说SHC1是SHC2的特例。那么是否存在两台SHC,它们彼此不是对方的特例,也不存在一台SHC可以使它们俩是其特例?
  发现这样的问题想想还特别有助于睡眠。。。


从随机到理论

让我们回到关于随机的问题上来。

随机如果是要求满足上述三点的字符串的话,那么是否可能存在某个图灵机可以用来生成随机字符串呢?

首先可以证明,不存在一个不需要输入参数的可以生成随机字符串的函数,因为这样显然违反第一条:如果知道随机序列的前n项,无法推测出第n+1项。
  但,是否可能存在一系列Rn(init)函数,每一个都可以通过一组初始条件init作为输入,来获得一系列的随机字符串呢?
  这样,比如所有上述Rn(init)函数构成的集合中,有一个子集,其中每个图灵机生成的字符串序列的前n项都是相同的,那么我们自然就无法通过前n项来判断到底是其中的Ri生成的,还是Rj生成的了,从而第一点要求被保持。
  这一现象与量子力学中量子混合态在塌缩到本征态前我们虽然知道有哪些本征态却无法得知到底塌缩到哪个本征态这么一个现象非常类似。
  在进一步,如果Rn(init)真的可以生成一串足够随机的字符串,那么就等于说len(Rn)必须比其生成的结果的长度len(Rn(init))要长,否则就违反了第二条。
  因而,这就是说,生成随机字符串的函数的长度,不管选择何种通用图灵机,不管选择何种语言,都必须比其能生成的随机字符串的长度要长。

PS,我们可以构造图灵机T的复杂度计算函数,也记为K,定义就是所有与T等价的图灵机中长度最短的T'的代码长度,就是K(T),以取代上面的len(Rn)。当然,结论不会改变。

从这里开始,问题就变得有趣了起来,因为让我们考虑下面这段伪代码:

R()=>if 双本征态混合量子态塌缩到本征态A then 1 else 0

这个函数使用了一个物理过程,通过双本征态等比例混合的量子态(这个实验上很容易构造出来)在塌缩后是否塌缩到本征态A来作为输出1还是0的条件。
  通过量子力学我们知道,这是一个真随机过程,而且可以无限次地重复实验,从而可以生成一个可数无限长的真随机序列。
  而,通过前面的分析我们知道,这个随机函数的长度不得比生成的随机序列的长度短,这就导致了一个很有趣的现象——
  如果量子塌缩这个物理过程是可以被形式化表述的,那么量子塌缩的形式化表达的长度为无限长。

现在,让我们更进一步,假定物理世界不是传统的主流量子力学所告诉我们的那样,在量子塌缩过程中是真随机的——比如说,是隐变量的,那么情况会怎么样?
  PS:当然,除了真随机的流派和隐变量的流派,还有别的流派,比如退相干大概既不是真随机也不是隐变量吧?不过到底是否真的是真随机也难说。。。
  隐变量理论不承认量子过程中的随机性,而将那种貌似随机的现象视为对隐变量的不可知而导致的纯粹视现象,而非本质。
  因此,对于他们来说,双本征态混合量子态的塌缩不是一个随机过程,而是一个隐变量参与其中的确定过程,从而就消除了真随机过程所要求的无限长代码长度。

好了,接下来,让我们考虑一个物理理论。
  理论主要用来实现两点:
  1,检验一组状态是否可能存在,即Check(state);
  2,根据已知条件来推测下一时刻的系统状态,即Deducate(state)。
  如果理论可以形式化,那么我们可以选择一个真理系统Axiomatic System和恰当的语言L,使得上述两个函数都可以在某台通用图灵机上用L中的语句表达为函数的形式。
  当然,将这两个函数合并为一个函数Theory也是可以的,只不过这里要更加精妙地定义state即可。
  因而,一个含有真随机的理论,如果我们看K(Theory),就会发现这个值为无穷大。而一个隐变量的理论,其K(Theory)为有限值,至少不包含真随机所要求的无穷大。
  因此,如果我们站在集智俱乐部planeheart的文章《利用Martin-lof随机性改造证伪主义》的观点,利用算法复杂度取代可证伪性,选择算法复杂度更小的理论作为更科学的理论,这么一个思路的话,似乎隐变量是一个比以哥本哈根流派为代表的连带着各种衍生诠释流派的理论更科学的理论。
  当然,这里不得不说的是,现在物理实验对隐变量为代表的理论的约束是:实在性和定域性必须放弃一个。所以如果我们不放弃隐变量的话,现在的事实就是很多人都在考虑放弃定域性。这点其实就算是在广义相对论体系内,在考虑引力场或者说时空的能量的定义的时候我们也发现,似乎定域性是需要被抛弃的东西——比如引力场的ADM能量定义就部分地放弃了定域性。

当然,我们还有另外一个选择,那就是选择“随机”是一个图灵机无能为力的对象,即图灵机不能给出真正的随机。
  如果这样的话,那么包含真随机的量子理论就无论如何都不能被形式化到可以用图灵机表达的程度,这样的话planeheart的文章《利用Martin-lof随机性改造证伪主义》中想法的可行性就从根本上被瓦解了。
  就个人来看,虽然我认为真实的自然是不能被图灵机描绘的,但自然的规律应该还是可以的吧,所以真随机理应被包含在图灵机中。

那么,一个含有“上帝”这个因素的理论到底是否比含有真随机的理论更科学呢?
  至少,上帝是不怎么随机的吧?不过也有人说上帝是喜怒无常的小女孩,就这点来说,大概上帝也是很随机的吧,所以K(TheoryWithGod)应该也是一个无穷大的东西吧。。。
  或者,我们也可以说,至少包含真随机的哥本哈根流派的理论并不比上帝理论更科学,如果我们真的认为算法复杂度可以取代可证伪性而成为理论是否科学的一个评判标准的话。

PS:个人是不赞同可证伪性来作为理论是否科学的评判标准的,这个以前已经写过文章来论述了,不重复。当然我个人也不支持用算法复杂度来作为评判标准,原因现在看来显而易见。


随机、图灵机与生命

当然,K这个东西不单在关于理论的理论也就是算法信息论的层面上有很有趣的应用,在别的方面也有有趣的体现,比如生命。

在Chaitin的《证明达尔文》中,他试图通过将算法与生命基因的等同,来利用证明算法的自然演化的可能性来证明生命是可以通过自然演化而来的而不需要神创。
  这点的相关论述可以看我写的《图灵,蔡汀,达尔文:计算中的上帝》
  这里其实就有了一个很有趣的东西。
  我们可以利用代码复杂度来作为算法演化的选择压力,即如果两根基因可以完成相同的任务,比如都给出T()>n,那么K(T)就是这两根基因在环境下的选择压力,K(T)越大就越容易被环境淘汰。当然,如果T()<=n,那就是直接死亡了。。。
  这么一来,只有用更少的代码实现特定的任务,才能在演化中“生存”下来。

在这个过程中,似乎随机就完全不是一件好事了,因为真随机代表着无限长的代码,从而这样的基因就完全会被瞬间淘汰。
  在演化的过程中,随机的来源应该更多是基因以外的,是从环境中来的。
  但,进化过程中基因的演变又离不开随机性。
  接着,我们考虑到算法熵也即算法复杂度在很多情况下都可以被视为一种真正的熵,从而高算法复杂度就意味着高温,这么一来真随机就是一个超高温区域,而生命的基因显然是一个低算法复杂度的区域,因此上面的过程就可以被这么来翻译:

低温系统通过与高温系统的接触来保持低温。

这倒是一个非常反物理直觉的过程啊。。。不过也不算太反物理直觉,比如对于黑洞来说,黑洞的质量越大,熵越小,而一个黑洞通过从伴星或者星际物质中吸收物质来不断增加自己的质量,从而也可以看作是在不断地通过接触高温物体(仅从引力来看)来实现自身的降温。
  这种类比还有很多,比如有人计算了人脑思考时的信息量,换算成电子比特,然后换算成能量,发现这个能量接近恒星形成黑洞的临界质量(看到有报道中说是钱德拉塞卡极限,但钱德拉塞卡极限是恒星形成白矮星的临界质量,不是黑洞哟)。

因此,就个人来说,或许可以通过研究引力与算法这两个领域中为何低温系统接触高温系统反而能保持低温这么个问题,来获得很多有趣的东西哟。

PS:还记得以前本科的时候写过一个科幻小说(再次没写完),其中一个设定就是人的思考与引力微子相关,这么一来,似乎就有趣了很多。


结尾

这篇纯粹是没来得及认真思考的随笔,肯定有很多有错的地方,没有的话反而就不对了。
  所以,欢迎拍砖。


  1. 具体可查这篇Wiki

  2. 当然这个说法本身不够严格,因为在AIT中可以证明K(s)<=len(s)+c,其中c是一个和s无关而至于图灵机及语言的选择相关的常数。

推荐阅读更多精彩内容

  • 算法 Algorithm 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描...
    卡尔是正太阅读 3,458评论 2 53
  • 这次开一个小脑洞。因为是脑洞,所以是有水分的,很多定义是模糊的,推理过程也并不要求严格。 话题先从标题的最后一项开...
    LostAbaddon阅读 1,234评论 10 11
  • 本系列第三篇,承接前面的《浅谈机器学习基础》和《浅谈深度学习基础》。 自然语言处理绪论 什么是自然语言处理? 自然...
    我偏笑_NSNirvana阅读 11,864评论 2 63
  • 这篇笔记紧跟着上一篇。 在这篇记录中,所谓随机字符串被这么定义:如果字符串只能被直接将其打印出这一种图灵机所输出,...
    LostAbaddon阅读 490评论 21 6
  • 1 “你的梦想相册进展如何?” “我已经开始做了/我本来是打算继续的,可是…可是我没有…,也没有…。” 熟悉的对话...
    L大大婷阅读 18评论 0 0