什么是《失控》中说的“稀疏分布式网络”?

卡内尔瓦的算法是一种将有限数量的数据点储存进非常巨大的潜在的内存空间的绝妙方法。 换句话说,卡内尔瓦指出了一种能够将思维所拥有的任何感知存入有限记忆机…
关注者
105
被浏览
15,314

4 个回答

《失控》中的描述是:

Pentti Kanerva在1974年提出了Sparse Distributed Memory(SDM)
此算法简单明了,熟手一下午就能实现
在80年代中期,Kanerva使用微调后的SDM进行20x20像素的阿拉伯数字识别

之前看《失控》的时候对这东西很好奇,最近找了些资料研究了一下。个人感觉是,KK夸大了SDM的神奇之处。这是一个很有意思的模型,但远未达到“破解人类记忆奥秘”的程度。

我对SDM的理解如下:

计算机常规的存储方式是:一个地址(key)存一个值(value),根据精确地址取精确的值。所以,1. 有多少数据就需要多少空间、2. 不知道精确地址(key)就什么也拿不到。

而SDM能达到以下效果:1. 开固定大小的空间,不管来多少数据,不需要额外的空间、2. 对于任何地址(key)都能取到值,当然,也不保证取到的值一定靠谱。


SDM的核心思路解决了以下两个问题:

1. 怎么在一个地址保存多个值?

答:把他们加起来

2. 怎么从不精确的地址取到值?

答:存时候多存几个地方,取时候多取几个地方


以下是我构造的一个简单的例子,比论文中的又简化了一些。

先解释第一个问题:

怎么在一个地址保存“--+”和“-++”两条数据?(假定每个值都是3bit,为了表明key和value不需要有什么关系,value的二进制使用+/-而不是1/0来表示。)


答:每个地址初始为(0, 0, 0),将-视为-1,+视为1,把每个位的数值加和即可。所以存完这两条数据后,这个地址的值会变成(-2, 0, 2)。所以你看到了,确实是使用固定大小的空间来存的。如果每个位用一个byte来保存,那就需要限制数值的范围是-127~+127。假如我们使用的value是m bit,那不管有多少数据,一个地址需要的空间大小就是m * 8bit。

然后是第二个问题:

假设我们有两条数据:{001:--+, 011:-++},那应该怎么存,怎么取?(假设要存的key和value都是3bit的)

存:每条数据要存到多个地方,我们先假设每条数据要存到“差别<=1bit”的地址中(专业术语叫

Hamming distance

),那么001这条需要保存到{001, 101, 011, 000}这4个地址中,011这条需要保存到{011, 111, 001, 010}这4个地址中。存完之后,按照我们刚才说的算法,那么001位置保存的就是(-2, 0, 2);101位置只有第一条数据,所以是(-1, -1, 1);而110位置没有修改,还是(0, 0, 0)。

取:取的时候需要取所有“差别<=1bit”的地址。所以,如果以001来取数据,我们需要取{001, 101, 011, 000}这4个地址,然后将结果加起来(结果是(-6, -2, 6)),正/负理解为+/-,我们就得到了结果:--+。你看,我们成功地查出来了001:--+这条数据。

当然,这么折腾一圈肯定需要有更多的好处,我们再试试用100来取数据。我们需要取{100, 000, 110, 101}这4个地址,加和最后为(-2, -2, 2)。也就是,我们用100也查出来--+这条数据了。

如果用101作为条件,结果是(-4, 0, 4),0随机转为+和-,也就是说,有可能随机出--+,也有可能随机出-++。这就是多条数据混杂的情况了。更极端一点,可以想象如果每个地址下都是(0, 0, 0),那等价于随机。

总之,通过一个不精确的key,我们也是能查到点结果的。结果是否靠谱,取决于查询条件有多接近真实的key,以及有多少干扰。


真实的SDM与上面的模型还有一点区别:

1. 为了能解决具体问题key和value只用3bit肯定是不够的,怎么也得256bit,甚至上千bit。这时候,Hamming距离<=1肯定是不成的,怎么也得几十吧

2. 按上面这种参数算下来,存取一次就得读写海量的地址。所以,为了提高效率,并不是所有可能的key都有一个对应的地址,而是选取很少的一部分地址,只从这些地址中存取。

3. 具体的玩法包括:

  • 用来存key-value,可以进行模糊的查找。与大脑“提示一下就能想起来”有类似之处。
  • 用来存一堆key,key=value。虽然每次查询的结果不一定靠谱,但一定比起查询的key更接近一个真实的key。所以多次查询就可以达到逐渐逼近的效果。这与大脑“一点一点回忆起来”有相似之处。
  • 用来存一个链。key=P(n),value=P(n+1)。那么,对P(n)的查询就可以起到"预测"的效果了。这与大脑的“预测”有相似之处。

我的看法:

SDM想解决的是,超大数据量下,通用的模糊查询的问题。而目前,同类问题通常使用建模后学习参数的思路来解决。至于与大脑的“学习”相提并论,还缺少很多关键条件,比如:模式/概念的识别,结果的反馈等。

SDM作为一种通用的算法,不利用数据的规律,而是依赖Hamming距离决定数据相似度,在目前来看是比较失败的。这导致了:一方面,针对具体用途不会有什么效果优势;另一方面,在效果持平下,不会有效率优势。

用Google学术搜索的结果让我感觉这玩意貌似一直没有进入主流视野。在看到刚才那些例子(数字识别、链的预测)的时候,主流的反应通常是神经网络、马尔科夫链。(p.s. 神经网络比SDM提出的要晚,这是后话了)


附,主要参考资料:

1.

en.wikipedia.org/wiki/S

2. ftp://reports.stanford.edu/pub/cstr/reports/csl/tr/89/400/CSL-TR-89-400.pdf