脑皮层学习算法 ---nupic的深入学习(一)
1.nupic简介
1.1 背景
说到AI,我们首先就会想到深度学习,tensorflow等。目前以深层的神经网络占据了AI的半壁江山。从本质上来说,深度学习所表述的神经网络,其实是源自于一个“类脑”的想法—通过模仿人类大脑的神经元的相互连接,结合权重,反向传播等数学知识所构成。但深度学习的神经网络运作仍与人类大脑真实运作情况相去甚远。
nupic是一个在github上开源了的AI算法平台,相比于深度学习,其更为接近人类大脑的运行结构。其算法的理论依据,就是纯粹的生物神经学知识,类似突触连接与分解,神经元,多个脑皮层的交互,动作电位等等。工程实现也基于此。
nupic是由Jeff Hawkins等人创造的算法,其目的是生产出更为接近真实人脑运作的AI。其理论依据主要是人脑中处理高级认知功能的新皮质部分的运作原理。目前,nupic还远远无法模拟整个人脑。不过,这已经是机器学习上的重大进步了。
NuPIC 并不是唯一开源的机器学习算法,但是它有自己的独特之处。Taylor 说,许多机器学习算法无法适应新模式,而 NuPIC 的运作接近于人脑,“当模式变化的时候,它会忘掉旧模式,记忆新模式”。如人脑一样,CLA 算法能够适应新的变化。“如果有一天,你醒来的时候发现过去认为是蓝色的东西变成了红色,一开始会感到不安,”他说,“但你会逐渐地适应”。
1.2 nupic的作用
nupic的运作其实比较类似大脑,接受外部输入(时间序列),学习其模式,并不断纠错,然后在这过程形成经验,进行预测。因此,nupic可用于预测以及异常检测,适用面非常广(目前认为,只要是时间序列都可以)。其内部结构决定了其有很强的记忆和学习功能。
nupic最特别的一点,也是其相对于其他深度学习算法最大的不同,那就是,nupic模型一旦建好,就能够学习完全不同的多个输入模式,并对他们同时做出预测和异常检测。这一点就类似人脑,大脑不同部位负责不一样的学习任务。而深度学习的算法就做不到这点,一个算法面对一个同样的输入模式。但这只是深度学习与nupic的不同,并无优劣。
nupic的预测也很有趣,在当前时刻,算法能够预测接下来的几个时间点的数值(nupic是针对时间序列开发的)。另外,预测的结果并不止一个。nupic会预测好几个可能的数值,并给出对应的概率。
nupic的鲁棒性很强,这我多次测试过,确实如此。另外,预测能力也非常强,经历几次异常值后,在不妨碍系统辨认出其是异常值的情况下,算法会将具体异常值也预测出来。
nupic的缺点就是,调参比较难。这点还在学习。
2.nupic资源
github:https://github.com/numenta/nupic
国内资料:AIS论坛,http://www.51hei.com/mcu/3970.html
白皮书:白皮书是nupic的算法内部原理介绍文档,由其开发团队发布于2010。网上应该有,有兴趣的人可以去寻找。实在找不到,可以私我。
nupic API 教程:http://nupic.docs.numenta.org/1.0.3/index.html
3.算法深入介绍
笔者花了一段时间,阅读了算法的英文白皮书,大致弄清了整个算法的框架。下面将会详细讲述。笔者会先讲述大体框架,然后讲述一些神经学的概念,然后再结合这些概念,详细讲解结构细节。
3.1 总体框架
nupic的核心其实就是一个算法,HTM算法。在htm算法中,有区域/层级的概念。htm算法的框架大致如下:
如图就是一个htm多层网络的框架图。最下面的是外部输入,算法接受的是被编码器编码过的时间序列。最下面的箭头往上,就是一级级的区域,也称层级。最上面的箭头,就是输出。上下层之间都有前馈和反馈(但在白皮书没有讲述反馈这一部分)。
所以htm网络也是神经网络的一种,看起来是不是很像卷积网络,但实际上,内部原理完全不一样。所以这里可以完全忘记卷积网络。这张框架图可以用人的大脑皮层运作来描述:每一层的层级,就类似于人脑中的每层脑皮质,然后每一层里面,就包含了无数的神经元,以及联系神经元的突触
每一层级大概长这样子:
这里有几个概念需要知道:
cell —-就是细胞,上图中圆圆的球状
柱状区域 —-上图中4个cell组合而成的一个列。
区域 —就是层级,一个二位平面的柱状区域就是一个区域了。
3.2 神经学的概念
在这里讲述的概念,都是在htm层级中用到的,笔者会结合htm网络的框架进行描述
a. 神经元
—就是层级中的cell。每个cell由几部分组成:细胞核,轴突,树突。
如图,类似树状的就是树突,长长的灰色的带状就是轴突。每个细胞都会有很多树突,一个轴突。
在htm中,细胞有两种树突:近端树突和远端树突。
近端树突会接收外部输入序列的前馈输入
远端树突会连接到同层区域的细胞的输入
b.树突区域
HTM 细胞有相当真实的(因此也是复杂的)树突模型。根据理论每个 HTM 细胞有一个接近细胞核的树突和许多末端树突,我们称之为近端树突和远端树突。靠近端树突接受前馈输入,远端树突接受附近的细胞的横向输入。有一类抑制神经元制约着整个柱状区域的细胞对相似前馈输入的响应。为了简化,我们用一个柱状区域共享的树突来代替每个细胞上的近核树突。
一个细胞有很多个树突区域。
c.突触
树突与轴突相连的部分,因此,突触是连接到树突区域的。在htm中,一个细胞有非常多的突触。对于突触,有两个概念:潜在突触和活跃突触。
一个树突区域就对应这一堆潜在突触,对于这些突触,若他们的“连通值”超过了阈值,他们就会变成活跃突触。那什么是“连通值”?这是对每个潜在突触设置的标量。一个突触的连通值是指树突与轴突之间连通性的程度。从生物学上讲,
这一程度从完全不连接开始,到刚开始形成一个突触但仍未连接,再到满足连接的最低要求,最后满足最大连接。连通值是一个关于突触的标量,值域为 0.0 到 1.0。学习的过程包含了增加或减少突触的连通值。当一个突触的连通值超过阈值时,它就是连通的并且权值为1。当一个突触的连通值小于阈值,它就是不连通的且权值为0,因此,突触权值是二元性的。
3.3 内部细节
如图,这就是htm的算法架构图—–外部输入到第一层,然后从第一层往上,不断将信息提取出来,送到高层,然后高层继续这一过程,然后输出。在这个架构里面,有3步工作要做:
- 构建输入的稀疏离散表征
- 在有先前输入的环境里构建输入的表征
- 在有先前输入的环境里根据当前输入构建预测
a.构建输入的稀疏离散表征
首先来解释,什么是稀疏离散表征?
如下图,就是一个稀疏离散表征,简称SDR
深色的细胞就是一个表征,对低层输入的表征,无色的代表没有**,可见这是个离散稀疏分布的。
对于被encoder编码过的信息,已经是一段很长的二进制编码,比如里面有60%的1,40%的1,一定程度上,可以说这是稀疏的,当输入到区域后,这段二进制编码会改变区域中的突触的连通情况,从而细胞被**,这样区域就有了一个新的表征。这种表征会比原始输入更为稀疏,比如只有2%的1
引用一段关于SDR的特性描述:
b.在有先前输入的环境里构建输入的表征
完成构建SDR后,即已经有了先前输入环境后,需要做的工作就是在这基础上,基于一些规则构重建输入的一些表征
图2.1的时候,我们可以看到,柱状区域是整条都被**的,但图2.2就不是了。变成这样,基于的原则是这样的:
基于这样,就会有柱状区域里,有一些是全部细胞都**的,有一些只是**其中一个或两个的。
c.在有先前输入的环境里根据当前输入构建预测
这一步的任务就是“基于过去预测未来”。因为SDR这样的结构,区域是拥有记忆,并纠错的功能的。
预测的过程大致如下:当基于b中原则重构了输入表征后,细胞就存在两种状态:**(active)以及不**的,但预测是基于细胞的第三种状态—预测态(predictive state)。大致实现如下:当一个细胞被**了,那么他就会跟附近前一刻被**的细胞进行突触上的连接,一旦连接完成,所有细胞(已经被**的例外)会遍历自己的突触连接,如果连接到活跃细胞(即被**的细胞)超过一定阈值,就会被置为预测态。
而所有被置为预测态的细胞集合的表征就是我们想要的“预测”,而在htm中,会有一个classifier模块,将这个“预测”转为数值型的输出。
值得一提的是,htm的预测不是预测一步,会预测接下来的好几步。
在这ABC三步里,在htm实现里其实是分成了两个部分—-时间沉积池和空间沉积池。时间沉积池对应于将输入构建成SDR,空间沉积池对应于为表征构建上下文环境以及实现预测,即bc两步。
4.htm特性分析
关于时间空间沉积池,我留在下一篇文章讲述。接下来我会分析一下HTM的特性。
htm是如何实现记忆和纠错功能的?
在将外部输入转化为SDR后,输入就相当于“储存”在区域中了,当下一时刻的输入到来时,由于SDR是稀疏离散的,所以相似输入所导致的的SDR也是相似的。并且区域有多层,这样的结构就会导致,越往上走,层级就越稳定。这样其实也加强了预测的鲁棒性(抗噪)。
实现记忆和纠错,是时间沉积池的作用。当当前时刻的输入到来后,当前**的细胞会跟上一时刻**的细胞建立起突触,这样就形成了一种“上下文环境”,也是为什么htm算法能识别序列的原因。建立起突触后,会有部分的细胞进入预测态(拥有活跃突触就可以进入),那么就实现了预测,**的细胞也储存了当前的信息。
如何实现纠错?当一个意料之外的输入进来时,**了相对应的细胞,这些细胞所在的柱状区域是没有细胞上一时刻处于预测状态的,所以被**的细胞所在的柱状区域,整条都会被**。这一点可以使得,区域学到了新模式。
5.一些学习过程的疑惑
1.在白皮书里,所说明的“预测”有两种说法,一种是处于预测态的细胞,一种是预测态的细胞加上被**的细胞。目前仍不是很确定。