矢量量化
20世纪80年代初期,我开始探索另一个经典模式识别难题:人类语音识别。最初,我们采用传统人工智能方法,利用专业知识直接对语言基本构成单位——音素,以及音素形成单词和词组的方法进行编程。每个音素都有自己独特的频率模式。例如,我们知道“e”和“ah”这两个元音在某些情况下会产生共振频率,即共振峰(formants),而且每个音素都拥有自己的共振峰值,“z”和“s”这样的咝音则拥有特定频率的连续音响。
我们用声波来记录语言。通过一系列过滤器,语言最终可以转化为不同频段(即我们平时所感知的音高)。光谱图则体现了这种转化(见图7-7和图7-8)。
过滤器就相当于我们的耳蜗,是生物处理声音的前期步骤。根据音素的不同频率模式,软件先识别音素,然后根据得到的音素串识别不同的单词。
测试取得了部分成功。我们的机器可以识别某个拥有中等词汇量,即几千个单词的说话者的说话内容。而当我们试图识别数以千计的单词、不同的说话者以及流利无间断的话语(词与词之间没有停顿)时,就会遇到不变特征这一难题。针对同一音素,不同的人会有不同的发音,例如某些人发的“e”音听起来很像其他人发的“ah”音。而且就算是同一个人,同一个音素的发音特征也会有所变化。音素的发音通常受到临近音素的影响。很多音素也会出现完全消音的现象。许多单词出现的情境不同,发音(音素串组成单词)也会不同。我们的编程基础——语言学规则被推翻了,而且它也远远无法满足口语的多变性。
我突然明白,层级知识结构决定了人类语言模式和概念能否被正确识别。拥有复杂层级结构的人类语言就证明了上述观点。但是,我们仍无从知晓这些结构的基本成分。因此在研究机器人识别正常人类语言时,这也是我思考的第一个问题。

图7-7三个元音的声谱图
注:从左到右依次为:a ppre ciate中的元音[i],a cous tic中的元音[u]和ah中的元音[a]。数轴显示了声音的频率。频带颜色越深,该频带上的声能就越高。

图7-8一个人说出“hide”这个单词时的声谱图
注:水平部分显示了说话者声音的共振峰。共振峰不仅频繁出现,而且峰值较高。
空气振动后,声音便进入人耳。随后,耳蜗内的3 000多个内部毛细胞将这种振动转换为不同频率段。每个毛细胞都拥有特定的频率段(也就是我们所说的声调),而且都扮演着频率过滤器的角色,当它们收到符合频率段的声音或者相近的频率段时,毛细胞就会发出信号。当声音离开人的耳蜗时,3 000多个不同的信号就是声音的体现,每个信号代表了窄频率带(频率带之间会有很多重合)的时间变化强度。
虽然大脑不会歧视任何信号,但是在我看来,大脑也无法公正地对这3000多个听觉信号进行模式匹配。我曾怀疑进化就是如此缺乏效率。现在我们已经了解:在声音信号到达新皮质之前,听觉神经内的数据会急剧减少。
在我们设计的语音识别软件中,我们同样也植入了过滤器软件,确切地说,一共有16个,后来增加到32个,但我们发现数量的增加并不影响最终结果。所以,在我们的系统中,每个点由16个数字表示。我们不仅要保留重要的语言识别特征,还得把16个数据带整合为1个数据带。
为了整合数据,我们采用了数学最优化法,即矢量量化(vector quantization)。无论情况怎样变化,声音(至少是一只耳朵听到的声音)都由16个不同的数字表示:即16个声频过滤器过滤后的信息。(对人类的听觉系统而言,需要3 000组这样的数字才能够实现全模拟,每组数字代表了人类耳蜗的一个毛细胞。)在数学领域,这样一组数字(不管是生物学意义上的3 000组数字还是软件设置上的16组数字)被称为向量。
简而言之,我们可以用二维矢量坐标来表示矢量量化过程(见图7-9)。每一个矢量都可以被视为一个二维空间的交汇点。如果将很多这样的矢量放到图中,你就会发现它们呈现一种集群状态(见图7-10)。

图7-9矢量量化过程

图7-10矢量的群集状态
为了清晰地辨别这些集群,我们需要限制观察的数目。我们将项目中的数字限定为1024个,这样我们就可以为它们编号,并且匹配一个10比特(因为210=1 024)的标签。正如预期,我们的矢量样本数据满足了数据多样性的要求。我们首先假设,最初的1 024个矢量为单点集群。然后加入新的矢量,即第1025个矢量,随后找到跟它最接近的那个点。如果这两个点之间的距离比这1024个点中最近的两个点之间的距离还要小,我们就认为这个点就是一个新集群的开始。然后我们就将距离最近的两个集群合并为一个单独的集群。这样我们仍然有1 024个集群。因此,在这1024个集群中,每个集群就不止拥有一个点。随后我们按照这种方式处理数据,但集群的数量始终保持不变。处理完所有点之后,我们就用这个集群中的中心点来表示这个多点集群(见图7-11)。

图7-11多点集群
矢量样本中所有的矢量都会采用同样的方法。通常情况下,我们会将数百万个点加入到1024(210)个集群中;根据不同情况,我们也会将集群数目增加到2 048(211)个或者4 096(212)个。每个集群都用位于该集群几何中心的那个矢量来表示。这样,该集群中所有点到该集群中心点的距离总和就能尽可能达到最小。与最初数百万个点(或者数量更多的可能点)相比,采用这种方法后,我们就可以将庞大的数量减少到1 024个,使得空间最优化。那些用不到的空间也就被遗弃了。
然后,我们为每个集群分配一个数字(0~1 023)。这些被简化、“量化”的数字就是其所指集群的代号,这也是这项技术得名为矢量量化的原因。当新的输入矢量出现后,我们就用离这个矢量最近的那个集群数字表示。
根据每个集群中心点到其他集群中心点的距离,我们可以预先绘制一张表格。当新的矢量(我们用量化点来表示这个矢量,换句话说,就是这个新点到离它最近的那个集群的数字)进入系统时,我们就可以立即计算出这个新矢量与其他集群之间的距离。因为我们是用离这个点最近的集群的数字表示这个点的,所以我们就能知道这个点与以后加入这个集群的点之间的距离。
在描述这项技术时,我只用了两个数字来表示一个矢量,而在软件中每个点都由16个基本矢量来表示,虽然数量不同,但方法是一样的。因为我们采用了16个数字来表示16个不同的频率段,所以我们系统中的每个点都占据了一个16维的空间。人类很难想象三维(如果把时间这个维度加进去就是四维)以上的空间到底是什么样子,但是机器却没有这样的困难。
运用这项技术,我们已经取得了4项成果。第一,我们大大降低了数据的复杂性。第二,我们将16维空间数据缩小为一维空间数据(每个矢量都是一个数字)。第三,在研究传递尽可能多信息的可能声音的空间比例时,我们提高了寻找不变特征的能力。大多频率段的组合在物理上是无法实现的,至少是很难实现的,因此我们不需要给予不可能输入联结与可能输入联结同样的空间,这项技术使得减少数据成为可能。第四,即使原始数据包含多个维度,我们仍然可以使用一维模式识别器。这一方法可以高效使用可用的计算机资源。