Kolmogorov复杂性

原文-wiki

看Kolmogorov复杂性看到云里雾里,于是干脆把wiki上的翻译了一下。

Chaitin complexity, algorithmic entropy, program-size complexity


定义

Kolmogorov 复杂性可被定义到任意数学对象,为简化本文的范围,限制到字符串。必须首先为字符串指定一个描述语言。这种描述语言可以基于任意计算机编程语言。如果\(P\)是一个程序,输出字符串\(x\),则\(P\)\(x\)的一个__描述__。描述的长度只是\(P\)作为字母串的长度,再乘与每个字母的bit数。

另外,我们可以选择一个图灵机编码,这里__编码__指一个把每个图灵机\(M\)关联到一个bit串\(<M>\)的函数。假如\(M\)是一个图灵机,对于输入\(w\),输出字符串\(x\),则字符串的联合\(<M>w\)则为\(x\)的一个__描述__。为了进行理论上的分析,这个方法更适合于构造详细的正式证明,且通常被研究性文本所采用。本文中,我们讨论一种非正式的方法。

任意串\(s\)至少有一个__描述__,即程序:

function GenerateFixedString()
    return s

如果\(s\)的描述,\(d(s)\),长度最小,即使用最少的bit数,即称 \(d(s)\)\(s\) 的__最小描述__。因此,\(d(s)\) 的长度(即,描述中的bit数)即为 \(s\) 的__Kolmogorov__复杂性,记为 \(K(s)\) 。用符号表示,

\( K(s)=|d(s)| \)

最小描述的长度取决于所选择的描述语言;但是改变描述语言的效果是有范围的(一个结果称之为_invariance_定理)。


Invariance 定理

非正式方法

从下面这些方面讲,存在一些描述语言是最优的:用某个描述语言得到的对某个对象的描述,可以将其连同一个固定的头信息放到最优描述语言中。头信息只取决于所用的语言,不受对象的描述影响,或者对象本身。
下面是最优描述语言的例子。一个描述由两个部分组成:

  • 描述另一个描述语言的部分
  • 用这种语言描述的对象部分

更技术性的术语中,第一个部分是一个计算机程序,第二个部分是能让程序输出此对象的输入。
Invariance定理如下:任意描述语言\(L\),连同头信息,最优描述语言至少等于\(L\)的效率。

证明:

通过先把 \(L\) 表述成一个计算机程序 \(P\) (第一个部分),然后用原描述D作为程序的输入(第二个部分),可以把\(L\)中的任意一个描述\(D\)转换到最优语言。新的描述\(D\prime\)的长度为(近似地):

\(|D\prime|=|P| + |D|\)

\(P\)的长度固定且不取决于\(D\)。因此,最多有一个固定的开销,且与被描述的对象无关。因此,最优语言一般最多是附加的固定开销。

更正式些的方法

定理

如果 \(K1\)\(K2\) 是对于图灵完备的描述语言 \(L1\)\(L2\) 的复杂性函数,那么有一个常量 \(c\) -- \(c\) 只取决于选择 \(L1\) 还是 \(L2\) -- 使得

$ \forall s. - c \leq K1(s) - K2(s) \leq c. $

证明:

根据对称性,有某个常量\(c\)使得对于所有串\(s\)

$ K1(s) \leq K2(s) + c $

假设有\(L1\)语言的程序作为\(L2\)的解释器:

function InterpretLanguage(string p)

\(p\)\(L2\) 语言的程序。解释器的特征由以下属性决定:

  • 对输入 \(p\) 运行 InterpreLanguage 返回 \(p\) 的执行结果

因此,如果 \(P\) 是一个 \(L2\) 程序,是 \(s\) 的最小描述,那么 \(InterpreteLanguage(P)\) 返回串 \(s\)\(s\) 的描述的长度是:

  1. InterpreLanguage程序的长度,即常量 \(c\)

  2. \(P\) 的长度,即 $K2(s) $

以上二者之和。复杂性的上限得到证明。


历史与环境

算法信息理论是计算机科学的一个领域,研究对于字符串(或其他数据结构)的Kolmogorov复杂性和其他复杂性度量。

Kolmogorov复杂性的概念和理论基于一个关键的定理,此定理首先被Ray Solomonoff发现,于1960年发表,在_"A Preliminary Report on a General Theory of Inductive Inference"中,作为他发明的__算法概率__的一部分得到描述。在1964年出版的_"A Formal Theory of Inductive Inference"__中,他给出了一个更完整的描述,在__Information And Control__的第一部分和第二部分。

Andery Kolmogorov后来在1965,__Proglems Inform. Transmission__上独立发表了这个定理。Gregory Chaitin也在__J.ACM__上提出了他的定理 - Chaitin的论文于1966年10月提交并修改于1968年12月,引用了Solomonoff和Kolmogorov的论文。

定理表述,把字符串从其描述(编码)解码的算法当中,存在一个最优的算法。此算法,对于所有字符串,它可以使得编码可以与其他算法允许的编码一样短,到一个附加的取决于算法但并不取决于字符串自身的常量。Solomonoff用这个算法和其允许的编码长度,定义了一个字符串的_"普遍概率"_,字符串的后续数字的归纳推理可以基于此概率。Kolmogorov使用这个定理定义了几个字符串函数,包括,复杂性,随机性和信息。

Kolmogorov知道Solomonoff的工作时,他知道了Solomonoff 优先。几年来,比起在西方世界,Solomonoff的工作在苏联更多人知道。然而,科学界的一般共识是把这类复杂性归功于Kolmogorov,他关注序列的随机性,而算法概率归功于Solomonoff,Solomonoff 专注于用他发明的普遍优先概率分布去做预测。在更广泛的包含描述复杂性和概率的领域中,这个领域则通常称为Kolmogorov复杂性。

还有几个其他Kolmogorov复杂性或者算法信息的变体。应用最广泛的一个基于self-delimiting program,主要归功于 Leonid Levin。

对Kolmogorov复杂性的一个不证自明的方法基于 Blum 公理,由Mark Burgin在Andrey Kolmogorov发表的论文中引入。(TODO:??)


基本结论

下面的讨论中,\(K(s)\)是字符串\(s\)的复杂性。

不难看出,字符串的最小描述不能比它自身更长 -- 输出s的程序GenerateFixedString是一个固定的大于s的数量。

定理:

存在一个常量\(c\),使得

$ \forall s. K(s) \leq |s| + c $

Kolmogorov复杂性的不可计算

定理:

存在有任意大Kolmogorov复杂性的字符串。形式化表述:对于每个属于自然数的数\(n\), 有一个字符串 \(s\)\(K(s) \geq n\)

证明:

否则所有无限多的可能的字符串可以由有限多的复杂性低于\(n\) bit的程序产生。

定理:

K不是一个可计算函数。换句话说,没有程序可以接受字符串\(s\)作为输入,产生一个整数\(K(s)\)作为输出。

下面的非直接的证明使用了类似 Pascal 的语言表示程序;为简化证明,假设其描述(即解释器)长度为1,400,000bit。为得到矛盾,假设有这样一个程序,

function KolmogorovComplexity(string s)

接受\(s\)作为输入,返回\(K(s)\);为简化证明,假设长度为7,000,000,000bit。思考长度为1,288bit的程序:

function GenerateComplexString()
    for i = 1 to infinity:
        for each string s of length exactly i
            if KolmogorovComplexity(s) >= 8000000000
                return s

使用KolmogorovComplexity作为子程序,尝试每个字符串,由最短的开始,直到返回一个字符串,其Kolmogorov复杂性至少是8,000,000,000bit,即,字符串不能由任意短于8,000,000,000bit的程序产生。但是,上面产生\(s\)的程序长度仅仅是7,001,401,288 bit,得到矛盾。(如果KolmogorovComplexity的代码更短一些,矛盾仍然存在。更长一些的话,则GenerateComplexString的常量可以任意改变。)

上面的证明用了和Berry悖论一样的矛盾:"The smallest positive integer that can not be defined in fewer than twenty English words"。通过从停机问题 \(H\)归约,同样可以用来显示\(K\)的不可计算性,因为\(K\)\(H\)是图灵等价的。

有一个引理,在编程语言社区叫做"全雇佣定理",说的是没有完美的对长度进行优化的编译器。

Kolmogorov复杂性的链式法则

Klmogorov复杂性的链式法则:

\( K(X,Y) = K(X)+K(Y|X) + O(log(K(X,Y))) \)

表述产生\(X\)\(Y\)的最短程序,比产生\(X\)的程序加上对给定的\(X\)产生\(Y\)的程序,不会多于对它所取的对数。


压缩

计算K(s)的上限是很直接的 - 只要用某个方法压缩字符串\(s\),用特定语言实现相应的解压缩程序,然后把解压缩程序与压缩后的字符串连接起来,再测量其长度即可。

\(c\)是一个整数,如果对字符串\(s\),存在一个描述,其长度不超过\(|s|-c\)bit,则\(s\)对于\(c\)是__可压缩__的。否则,\(s\)对于\(c\)是不可压缩的。不能被1压缩的字符串简单地称为不可压缩 - 根据鸽巢原理,鸽巢原理所以适用是因为每个被压缩串只映射到一个未压缩串,不可压缩串一定存在,因为长度为\(n\)的,\(2^n\)bit的串只有\(2^n-1\)个更短的串存在,即,长度(0,1,...,n-1)小于\(n\)的串。

同样原因,从不能对他们高度压缩这个方面看来,很多串是复杂的 -- 比起|s|,他们的\(K(s)\)不是很小。要更精确的的话,则固定一个n的值。有长度为\(n\)\(2^n\)个bit串。此空间上的bit串的一致概率分布准确地分派相等的权重\(2^{-n}\)到每个长度为\(n\)的字符串。

定理:

长度为n的bit串的空间上的一致概率分布,使得字符串对于\(c\)不可压缩的概率至少是\(1-2^{-c+1}+2^{-m}\)

要证明这个定理,注意长度不超过\(n-c\)的描述的数量由以下几何级数指定:

\( 1+2+2^n+ ... +2^{n-c}=2^{n-c+1}-1 \)

有至少\(2^n-2^{n-c+1}+1\)个长度为n的bit串对于\(c\)是不可压缩的。要得到此概率,则用它除与\(2^n\).


Chaitin的不完备定理

【略】


最小消息长度

【略】


Kolmogorov随机性

【略】


与熵的关系

【略】

posted on 2014-06-27 18:24  MLNLP  阅读(4786)  评论(0编辑  收藏  举报

导航