信息理论修炼手册(1):汉明距离

为啥写这个系列

2021年,告别上一段科研历程,开始新的征程。作为一名二手信息论科学家,职业素养还是要的。那么就以此作为契机,请诸君与笔者在地球online服务器上开始一段神秘的信息论探索之旅吧。

开篇就要大搞特搞

一提汉明距离,但凡搞咱这行的,多多少少都有些耳闻的。毕业以后参加工作面试,碰到个把岗位不想招人的主儿,分分钟让你写个最小化汉明距离也不是不可能的。那么如何搞懂、搞会汉明距离的相关概念,从妈见打变成妈见夸,就是笔者写此篇的目的了。

我是谁,我在哪

要回答这一问题,我想最好的办法就是问一下Richard Hamming老爷子,他是怎么想出鬼点子的。遗憾的是,老爷子98年就走了,不然一顿饭就能搞定的事,也就没必要逼的大家各种问谷歌了…

不过好在老爷子跟我们一样有喜欢写博文的好习惯,所以在他1950年发表的这一篇具有奠基意义的文章中,我们可以推想如今大名鼎鼎的汉明距离是在何种场景下诞生的。

上世纪50年代,正是电信行业如日中天的时代。彼时的小理查德还是一名在贝尔实验室寂寂无名的打工人,身边围绕着一群诸如香农这样的大神。然鹅机智的小理查德在枯燥的工作中观察就发现,实验室里面的继电器计算机5号(长相见下图):

在工作中经常会停机(原文,halt),而且这种错误的出现有时是靠自检程序所无法规避的,频率大概是每200~300万条继电器操作(relay operation)出现一次。当时的计算任务特点是经常运转在无人看守的夜间或者周末,所以一出问题又会影响接下来的正常使用(为什么小理查德会发现呢,因为这孩子习惯在周五提交计算任务)。所以仅仅是发现错误(error detection)是不够的,还要让计算机能快速处理(更正错误,error correction)。当时他就暗下决心:如果机器能够发现错误,那么一定有一种方法,能让它更正自己的错误!

梦开始的地方

如何使程序本身(或者说信息本身)自带一种自我纠错的本领呢?带着这个想法,小理查德踏上了探索编码理论的道路。当然,我们的所研究的信息载体皆转换为二进制字串(binary sequence),也就是0101这样的比特序列,这一点无需多言(如果你是个好奇心很重的孩子,想更深入了解这一点,可以参考香农大神的这篇文章)。对于存储来说,傻大粗笨的方案就是用维护两个副本(replica),当某一bit位出现问题的时候就可以选多数来查到原信息。这一方案的关键在于假设不会有高于一个副本在同一bit位出错。

更普遍的想法,是在原有信息的基础上,加上一部分“冗余”的纠错信息。更官方的说法,是在n个比特数位上(binary digits),加入m位原信息(message),用剩下的k=n-m数位,记载错误查改信息(校验位)。自然地,为衡量某一编码的优劣,可以使用R=n/m冗余度(redundancy)来表示使用系统化编码(systematic code 意指上述包含纠错码的二进制码)承载同一信息单位所必需的数位。使用两个副本的方案,冗余度很明显较高(R=3)。

柿子要挑软的捏

上述问题的一个最最简化版本是,给一串比特序列,若知道仅有一位出错,如何使用最少的比特量检测出错误。再次强调一下,错误检测(error detection)和纠错(error correction)是两个概念,决不可混为一谈。那么最简单的办法,是在某一特定位(首或尾)添加0或者1,使得整串比特序列(或者目标片段)共包含偶数个1。这样,一旦发现发来的信息包含奇数个1,即证明出错。这一解法中,R=1 + 1/(n - 1),咋一看,好像说n越大,用这一方法检测错误的效率越高;但仔细想想,其实不然,因为随着n的增大,出现错误的几率也随之增大,那么出现double error的情况也会增加而使得该方法失效。但这不意味着奇偶校验法就毫无用处,事实上任何一种encoding,都无法保证信息的完全无误,编码方案的指定应以达到特定error数量上限前的鲁棒性(robust)为依据。

这个糙办法,其实也不是Rechard的发明。早在计算系统广泛应用奇偶校验法之前,电信系统早已普及parity check。奇偶校验法的trick在于,原信息任何位置的一位bit信息改变,都将直接导致parity bit的变化(牵一发而动全身)。受此方法启发的小理查德,开始思考如何在比特序列中的特定位置混入校验码,从而在错误被检测出来的同时,机器可以获得相应的错误比特位置信息。

ㄟ(●′ω`●)ㄏ
0%