- 大鱼炖火锅
-
摘要:
层次时间记忆(HTM)是一种受生物启发的机器智能技术,模仿新大脑皮层的结构和过程。在本文中,我们描述了如何将数据编码为用于HTM系统的稀疏分布式表示(SDRs)。我们将解释几个现有的编码器,这些编码器可以通过称为NuPIC的开源项目获得,并讨论为新类型的数据创建编码器的需求。
1 编码器是什么?
层次化时间记忆(HTM)为解决各种数据类型的预测、分类和异常检测问题提供了一个灵活而精确的生物学框架(Hawkins和Ahmad, 2015)。HTM系统需要数据输入以稀疏分布表示形式(SDRs) (Ahmad and Hawkins, 2016)。sdr与标准的计算机表示(如文本的ASCII)非常不同,这意味着直接编码到表示中。SDR由大部分为零且其中一些为零的大量比特组成。每个比特都有一些语义含义所以如果两个sdr有多个重叠的部分,那么这两个sdr有相似的含义。
任何可以转换为SDR的数据都可以在使用HTM系统的广泛应用程序中使用。因此,使用HTM系统的第一步是使用我们称为编码器的方法将数据源转换为SDR。编码器将数据的本机格式转换为可输入HTM系统的SDR。编码器负责为给定的输入值确定哪些输出位应该是1,哪些应该是0,以便捕获数据的重要语义特征。类似的输入值应产生高度重叠的SDRs。
2 编码过程
编码过程类似于人类和其他动物的感觉器官的功能。例如,耳蜗是一种特殊的结构,它将环境中声音的频率和振幅转换成一组稀疏的活跃神经元(Webster et al, 1992, Schuknecht, 1974)。这一过程的基本机制(图1)包括一组内层毛细胞,它们排列成一行,对不同的频率敏感。当适当频率的声音出现时,毛细胞刺激向大脑发送信号的神经元。以这种方式触发的一组神经元将声音编码为稀疏分布表示。
耳蜗编码过程的一个重要方面是,每个毛细胞对一系列频率做出反应,这些频率范围与附近的其他毛细胞重叠。这种特性在某些毛细胞受损时提供冗余,但也意味着给定的频率将刺激多个细胞。两个频率相似的声音在被刺激的细胞中会有一些重叠。表示之间的重叠是数据的语义相似性在表示中的捕获方式。它还意味着语义分布在一组活动的细胞中,使表示能够容忍噪声或子采样。
在编码数据时需要考虑以下几个重要方面:
1、语义上相似的数据应该会导致具有重叠活动位的SDR。
2、相同的输入应该总是产生与输出相同的SDR。
3、对于所有输入,输出应该具有相同的维度(总比特数)。
4、输出应该对所有输入具有类似的稀疏性,并且有足够的一比特来处理噪声和子采样。
在接下来的小节中,我们将详细地检查这些特征,然后描述如何对几种不同类型的数据进行编码。注意,几个SDR编码器已经存在,大多数人不需要创建自己的。这些人应该仔细考虑以上的标准。
1)语义上类似的数据将导致具有重叠活动位的SDRs
要创建一个有效的编码器,您必须了解应该有助于相似性的数据的各个方面。在上面的耳蜗示例中,编码器的设计目的是发出具有类似音高的声音,但没有考虑声音的响亮程度,这需要采用不同的方法。
设计编码器的第一步是确定希望捕获的数据的每个方面。对于声音,关键特征可以是音高和振幅;对日期,可能是否这是一个周末。
编码器应该为所选数据的一个或多个特征中相似的输入创建重叠的表示。所以对于周末编码器来说,周六和周日的日期应该是重合的,但不能和工作日的日期重叠。
2)相同的输入应该始终产生与输出相同的SDR
编码器应该是确定的,以便相同的输入每次都产生相同的输出。如果没有此属性,在HTM系统中学习的序列将随着值的编码表示的改变而过时。避免使用随机或自适应元素创建编码器。
创建自适应编码器来调整表示以处理未知范围的输入数据是很有诱惑力的。有一种方法可以设计一个编码器来处理这种情况,而不需要改变输入的表示形式,如下面的“更灵活的编码器方法”一节所述。该方法允许编码器处理输入的无界或未知范围。
3)对于所有输入,输出应该具有相同的维度(总比特数)
编码器的输出必须始终为每个输入产生相同的比特数。对sdr进行比较和操作时,采用逐位假设,即具有某种“意义”的比特始终处于相同的位置。如果编码器为SDRs生成不同的比特长度,则不可能进行比较和其他操作。
4)输出应该对所有输入具有类似的稀疏性,并且有足够的1比特来处理噪声和子采样
编码器的稀疏性可以从1%到35%不等,但是对于编码器的特定应用应该是相对固定的。在保持稀疏性不变的同时,稀疏性的微小变化不会产生负面影响。
此外,必须有足够的一比特来处理噪声和子采样。一般的经验是至少有20-25位。生成小于20位的表示的编码器在HTM系统中不能很好地工作,因为它们可能由于少量的噪声或不确定性而非常容易出错。
3 示例1 -编码数字
编码的最常见的数据类型之一是数字。这可以是任何类型的数值——82度,145美元的销售额,34%的容量,等等。在每个部分,我们都将改变我们想要捕捉并更新编码来达到新目标的语义特征。
3.1简单的数字编码器
在最简单的方法中,我们可以模拟耳蜗的编码频率。耳蜗的毛细胞对不同但重叠的频率范围有反应。特定的频率会刺激这些细胞。我们可以通过将实际值的重叠范围编码为活动位来模拟这个过程(图2)。因此,第一个比特可能是对0到5的值,下一个是0.5到5.5
等等。如果我们选择我们的编码有100个总位,那么最后一个位将代表49.5到54.5。表示的所有值的范围将是0到54.5。这种方法的最小值和最大值是固定的。在允许范围以上或以下的值将得到与最大或最小可能表示相匹配的表示。
使用之前的编码器参数,这里是7.0(图3A)、10.0(图3B)和13.0(图3C)的编码方式。注意,接近的数字(7.0和10.0,或10.0和13.0)彼此共享一个位,但是不太接近的数字(7.0和13.0)不共享任何一个位。
当我们创建这个编码器的实现时,我们首先将值范围划分为bucket,然后将bucket映射到一组活动单元格。以下是用这种方法编码值的步骤:
1、选择您希望能够表示的值的范围,minVal和maxVal。
2、计算范围为 range = maxval - minval
3、选择你将值分割到的buckets的数量。
4、选择每一个表示中的活动位的数量,w。
5、计算总比特数,n: n = bucket + w -1
6、对于给定的值v,确定它属于的bucket i: i = floor[bucket * (v - minval)) / range]
7、通过从n个未设置位开始创建编码的表示,然后将从索引i开始的w个连续位设置为活动位。
注意,这个编码方案有四个参数:最小值,最大值,桶的数量,和活动位的数量(w)。或者,你可以选择的总数,n,而不是桶的数量,将被计算为buckets =n -w+1
这是一个为某地温度在0到100 f之间变化的外部温度编码的例子。
1、最小温度为:0F,最大温度为:100F;
2、范围为:100;
3、我们选择将范围分割为:100;
4、我们选择每个表示具有21个活动的位;
5、位的整个数量被计算为:n=buckets+ w -1=120;
6、现在,我们为值72 f选择一个bucket, i =floor[100 * (72 -0) /100]=72;
7、表示将是从第72个位开始的具有21个连续活动位的120位。
这种编码方法很简单,提供了相当多的灵活性,但要求您知道数据的适当范围。如果您的数据超出了最小和最大值,那么编码器就不能正常工作。通常,您将使用最小的bucket处理范围以下的值,最大的bucket处理范围以上的值。因此,范围以上的所有值都具有相同的表示,范围以下的值也具有相同的表示。下面是100 f的温度表示。这也将是110 f或任何大于100 f的最大值的表示。
可以根据应用程序中此度量的固有噪声和预期预测的质量来选择桶的数量。对于非常嘈杂的信号,您可能需要更少的桶数。这将使HTM能够看到更稳定的输入,但它不能做出非常精确的预测。对于一个非常干净的信号,你可以有很多桶。在这种情况下,HTM能够做出非常精确的预测。
3.2 更灵活的数字编码器
像耳蜗这样的生物感觉器官具有一定的编码范围。在人类中,这大约是20赫兹到20千赫。如果世界上的声音转移到更高的频率,那么我们的耳朵将是无用的。我们上面描述的编码器机制也有一个固定的范围。编码器的设计者选择范围,但是一旦选择了范围,系统开始学习,你就不能改变它。然而,有一种方法可以克服这个限制。可以设计具有固定位数的编码器,但可以使用哈希函数对一个本质上无限的值范围进行编码。通过这种设计,SDR中的每个位可以表示多个值范围。如果这些范围是通过哈希函数分配的,那么两个距离很远的值的sdr可能会重叠一到两个位,但这个小重叠不会给HTM带来问题。现在,我们将在数字编码器中展示这是如何工作的,但是在本章后面描述的地理空间编码器中使用了相同的原则。
如果我们查看前一节中的步骤6,就会发现每个桶都由一个特定的位标识。然后我们为下面的w-1桶选择位来完成表示。每个桶都有与它的邻居重叠的比特。对于更灵活的数字编码器,我们可以执行相同的步骤1-6,但是要更改在表示形式中选择位的方式。具体地说,我们可以使用散列函数从bucket索引中决定性地选择一个输出位。我们对每个位分别进行选择,所以不是w个连续的位是活动的,而是基于哈希函数的w个位是活动的。散列操作如下:
这种方法的优点是您不需要将值限制在一个整体范围内。相反,您只需要选择每个桶负责的范围。可能会有一些不必要的碰撞。换句话说,由于偶然的原因,不应该有重叠位的两个存储桶实际上可能有一个或两个重叠位。只要您仔细地选择哈希函数并具有足够大的w和n值,这个问题在实践中就不是问题。
如果您从这个表示中取一个位,您将无法知道原始值是什么,因为有许多不同的值将生成包含该位的编码。但是如果你把所有的活动位放在一起,你就有了一个特定于你的输入的表示。这可能与许多生物编码器不同,但它将很好地工作,因为它满足我们前面概述的编码属性。
3.3数字对数编码器
一些应用程序可以从数字编码器中获益,数字编码器根据数字的大小捕获不同的数字之间的相似性。换句话说,4000和5000的值可能和数字4和5一样。使用对数函数的编码方法是这样的:
这个编码器对小数字的小变化很敏感。从3到15的更改将导致相当不同的编码。但是对较大数字的编码就不那么敏感了。例如,从1000到2000的变化对编码的影响要小得多,尽管数字的绝对变化要大得多。
3.3 Delta编码器
一个增量编码器被设计用来捕获值变化的语义,而不是值本身。这种技术对于建模具有可能出现在不同值范围的模式的数据非常有用,并且可能有助于与常规数字编码器一起使用。一个简单的例子是,当你试图预测一个不断增加的值时,你可以使用一个增量编码器。具有此特征的数据中的可预测模式不是值本身,而是值的变化——值是否比前一个值大或小,以及值的大小?虽然一个普通的数字编码器会对每个新值给出不同的表示,但是delta编码器会对与前一个值相比增加或减少的值生成重叠的编码。
如果你在一台机器上安装了一个温度传感器,delta编码器会识别由机器行为引起的温度模式,即使绝对范围因周围的天气模式而不同。外面的温度一天可能是60度,第二天可能是70度。一个普通的数字编码器在60年代的值表示不会与70年代的值表示有太多的重叠(如果有的话)。但是当值以类似的方式变化时,delta编码器会生成类似的编码,即使这些值本身以前从未见过。
这个编码器与以前的编码器不同,因为它使用当前和以前的输入来确定输出。这个编码器的实现与其他标量编码器中的实现是一致的,但是您可以将编码器应用到当前输入值与前一个输入值之间的差异上。
4 示例2 -编码类别
许多数据集包含分类信息(categorical information)。在某些情况下,数据由离散的、完全不相关的类别组成(例如商店中的产品sku)。在其他情况下,数据包含可能有一些关系的类别(例如一周的天数)。下面的示例展示了如何对这些类型的数据进行编码。
日期和时间的某些特征本质上是绝对的。例如:
1、工作日和周末
2、假期vs非假期
3、白天与夜晚
4、用餐时间vs非用餐时间
5、单词的词性
在许多情况下,将这些特征编码为完全离散的类别是有用的。这些情况下的编码应该尽量减少任何类别编码之间的重叠。最简单的方法是为每个选项提供一些比特。任何选项的编码都有其专用位为活动的,其余位为非活动的。这是一个工作日/周六周末编码的例子:
这种编码有助于增加数据流,在数据流中,流中的模式与周末不同。添加这种编码可以确保HTM系统在工作日和周末之间获得不同的输入模式,从而使它们更容易地学习两个时间段的独立预测。
类别编码也可以应用于部分语音。下面是一个这样的编码:
4.1有序类和循环类
有时模式是不断变化的,而不是完全独立的类别。因此,这种差异可能没有一条严格的、明确的线。正午的模式有时可能类似于早晨的模式,但其他日子可能更类似于常见的傍晚模式。在这些情况下,您只需转换到数值并使用标量编码器来生成SDR。
但是,特别是在日期和时间的情况下,除了连续之外,这些类别可能是循环的。例如,周五是工作日,但和周四有点不同。星期天晚上是周末,但不太像星期六晚上。您可以从将一周中的一天表示为从0到6的整数,其中0是星期日,6是星期六。数字编码器将创建一个良好的表示,除了周六和周日的编码将很少或没有重叠,因为它们位于范围的相反端。在这些循环情况下,编码必须“包装”。对于这个例子,我们将在编码中使用少量的比特。在真正的实现中,您需要更多的位元活动,因此需要更多的总位元。最简单的理解方法是使用图(图4):
图4中的两个图显示了星期五编码的表示。左边的图表显示了每天是如何落在一个圆上,并与它前后的天数重叠。右图显示了星期五的编码表示,以及每个编码的中心位置的注释。周日的编码将在最开始和最后都包含位(图5)。
您可能希望捕获的日期和时间的其他数字特征是:
1、一年的月份
2、每月的一天
3、每天的时间
4、小时的分钟
5 示例3 -编码地理空间数据。
5.1一个简单的地理空间数据编码器
这个示例展示了编码器如何捕获地理空间数据。最明显的一点是,靠近彼此的位置应该被认为是相似的,而相距遥远的位置不应该被认为是相似的。要对这个意思进行编码,我们首先要确定要编码的分辨率。在这个例子中,我们假设我们使用的是精确到10英尺的GPS坐标。我们会做二维的定位,虽然把编码扩展到三维是很简单的。
第一步是把GPS的位置转换成一个平坦的空间,我们可以把它分成10乘10英尺的正方形。然后我们决定建立一个索引系统,这样我们就可以通过整数X和Y坐标来识别任何部分
现在,我们需要将位置编码为一组n个位,其中w为活动的。在本例中,我们将使用n=100和w=25,但实际应用程序需要使用较大的数字,如n=1000。我们首先选择要编码的位置的坐标,比如x=5和y=10,然后确定周围位置的坐标。这些将形成一个由坐标3<=x<=7和8<=y<=12所确定的正方形位置集合。这个过程给了我们25组x, y坐标显示为灰色。
现在我们可以使用确定性哈希函数将每一对坐标映射到编码中的100位:
如前所述,通过使用哈希函数,我们可以使用固定数量的位来表示无界空间中的任何位置。因为我们使用的是确定性哈希函数,我们可以在需要时计算这些值,不需要存储它们。一个特定GPS坐标的编码最终是这样的:
注意,由于哈希冲突,最终的编码可能只有略小于25位。当对n和w使用足够大的数字时,这种情况不太可能发生,而且在任何情况下都不会在HTM中产生问题。
如果我们对x=6、y=10的位置进行编码,那么大多数(25个中有20个)所选择的坐标将与x=5、y=10的编码重叠,从而得到我们想要的SDRs中的语义重叠的结果。
5.2更灵活的地理空间数据编码器
如果您想要地理空间系统所允许的最好的编码,那么前面描述的编码方法可以很好地工作。如果这是10英尺,那么仅仅在20英尺之外移动会导致稍微不同的SDR,而移动1000英尺将导致完全不同的SDR。但这可能不是你想要的。您可能想要一个编码器,当一个物体移动缓慢时编码小的差异,当快速移动时编码更大的距离。例如,如果有人在走路,那么我们可能希望编码器在10英尺的位置上表示变化,但是如果有人在高速公路上行驶,那么10英尺在行驶方向上的差异并不重要。在高速时,200英尺以内的位置最好由相同的SDR来表示,而相距1000英尺的位置应该重叠。在许多地理空间应用程序中都需要这种类型的变量编码。通常有一种方法可以根据需要设计编码器。在这种情况下,可以通过使用所有可能位置位的子样本并使用对象的速度来确定子抽样的粗度来满足需求。
前面描述的地理空间编码要求您想要重叠的两个位置的距离决定了活动位的数量。您可能并不总是希望有那么多比特活跃。我们可以从这个范围中进行采样,但是需要确定哪些位以保留所需的编码器属性。具体地说,我们希望接近空间的数据点具有共享位的编码。
如果我们随机抽取半径内50%的比特,那么即使它们的半径重叠,附近位置的编码也可能不共享比特。
解决这个问题的一种方法是对所有坐标给出严格的排序,这些坐标决定了要对哪些位进行子抽样。为了做到这一点,我们可以使用确定性哈希函数将每个坐标映射到0.0到1.0之间的浮点数:
因为我们使用的是确定性散列函数,所以可以在需要时计算这些权重,而不需要存储在内存中。如果我们希望在编码中包含15个活动位,我们之前的编码可能是这样的:
加权方案有助于优先选择相同的坐标,以便附近位置的编码选择相同的坐标,但它不能保证这一点。因此,为了确保适当的重叠,必须选择足够多的总比特和活动比特。
6 示例4 -编码自然语言。
单词、句子和文档也可以编码成SDR。有许多现有的创建语言矢量编码的技术,包括Corticalio创建的产生SDR的技术。他们的技术在他们最近的白皮书中有详细的描述(韦伯,2015)。
7 选择新编码器的大小
每一个编码器,不管它代表什么,都应该创建具有固定位n和固定位w的sdr。为了保持稀疏性的性质,w不可能是n的很大一部分,但是如果w太小,我们就失去了分布表示的性质。一般来说,对于数值w应该至少为20,以正确处理噪声和子采样,n应该至少为100,以提供足够的分辨率来区分多个数字。
下面是一些在实际应用中成功应用的值。
1、在一个研究服务器的数值度量值的实验中,优化算法选择n = 134和w = 21作为好值。
2、在另一个实验中,n = 2048和w = 41被发现是地理空间编码器的好值。
3、当编码类别时,w可以是n的更高比例。例如,如果你编码一个二进制值,n可以是100,w可以是50。
在创建一个新的编码器时,通常使用广泛的指导方针来选择n和w通常是一个很好的策略。编码器调试完毕后,进行精度测试,然后通过更仔细的选择n和w来调整编码器的性能。
选择n和w的好值的很多背景来自Ahmad和Hawkins关于sdr属性的工作(Ahmad and Hawkins, 2016)。
8 编码多个值
有些应用程序需要为单个HTM模型编码多个值。单独的值可以自己编码,然后连接起来形成组合的编码。在这样做的时候,重要的是要保持一个位的数量,w,对于每一个单独的值编码器来说都是相对相似的,这样一个值就不会主导这个表示。
对于单独的编码器,n的总比特数有非常不同的值是可以的。
9。结论
有许多可用于大多数应用程序的编码器。如果您需要为新数据类型构建编码器,您可以使用一些简单的规则来创建编码器:语义上相似的数据1、应该会导致具有重叠活动位的SDR。
2、同样的输入应该总是产生与输出相同的SDR。
3、对于所有输入,输出应该具有相同的维度(总比特数)。
4、输出应该对所有输入都有相似的稀疏性,并且有足够的1比特来处理噪声和次采样。