(HTM)层次时序记忆-时间沉积池实现解读
如果你对HTM感兴趣,我建立了一个群,我们共同学习交流。515743445。
阅读本文前建议先阅读HTM白皮书(需要了解sp和tm的工作步骤),以及论文Continuous online sequence learning with an unsupervised neural network model
本文研究src/nupic/algorithms/temporal_memory.py的代码实现
我们以Complete-algo-example.py为实例对其进行研究。该范例的参数存放在model.yaml中。该范例的数据来自gymdata.csv。这是一个关于不同时间consumption数据的文件。其日期部分使用DateEncoder转换为SDR,其consumption部分使用RandomDistributedScalarEncoder转换为SDR。合并后输入sp。由sp计算激活列后,将激活列作为参数输入tm.compute()计算当前输入的激活细胞。由getPredictiveCells()可以获得其预测。
Tm在代码组织上具有和sp相同的结构。主要方法包括__init__(),compute()和getPredictiveCells()
其关键变量包括:
tm.compute():
tm输入是从sp得到的哪些列激活的下标,它的本质是对当前输入的表示。在此基础上,我们需要对未来做出预测。因此,我们首先需要计算哪些细胞被激活,然后根据当前激活的细胞,计算激活的树突区域,然后再计算哪些细胞处于预测状态。本例中研究的tm实现只能预测未来一个时间步的内容。Tm的代码逻辑上相对简单,但在一些实现上非常晦涩。这里仅提供大体的实现思路。
一些关键变量的功能:
activeState记录细胞的激活状态
predictiveState记录细胞的预测状态,
learnState 记录哪个细胞用于学习。那些成功预测了的细胞会被用于学习。一个没有成功预测细胞的柱状区域,所有的细胞被激活,只有一个最符合的会被选为学习细胞。
SegmentUpdateList 突触连通值的临时修改
SequenceSegment ,bool,是否预测
NewSynapseCount 随机添加到树突区域的突触数量
ActivationThreshold 树突区域的活跃阈值
connectedPerm 突触的连通值阈值
activeSegments 存放活跃突触大于16的树突区域
matchingSegments 存放活跃突触大于12的树突区域
2048*32=65536.共计65536个细胞。我们的目的是计算出一个下标,指出这些细胞中哪些处于激活状态,哪些处于预测状态。在实现上实际计算处于激活状态的树突区域。
上一步的ActiveCells记录在prevActiveCells,winnerCells记录在prevWinnerCells
segToCol()计算细胞的所属列,winnerCells用于选择学习细胞。activeCells记录32个细胞。并选出一个winnerCell。
activateCells() 通过上一步的预测predictiveState和当前的活跃列activeColumns,计算哪些细胞应该是活跃细胞。保存在activateCells,2048*32
如果一个列是激活的,且有激活的突触区域,则称为activatePredictedColumn.则选取成功预测的细胞。
如果一个列是激活的,但没有激活的突触区域,则称为burstColumn。选取它所有的细胞。
如果一个列是不活跃的,有激活的突触区域,则称为punishPredictedColumn
由上一步计算得到的activeCells和阈值connectedPermanence,由管理细胞,树突区域,连通性,连通值的connections来进行计算。取得activeSegments和matchingSegments。numActiveCOnnectedSynapsesForSegment和numActivePotentialSynapsesForSegment存放他们连接到的激活细胞的具体数字。根据当前activeCells得到的ActiveSegments已经可以转化成对应到每一个列的columnActiveSegments供上一步活跃的列检测活跃树突区域,用来选择激活的细胞了。对于一个树突区域,如果连接到的活跃细胞(从所有细胞中进行子抽样)大于16,则该树突区域激活。如果大于12,则置入matching列表。Connections 记录65536个细胞之间的树突连通性以及连通值。每一个细胞的一个树突区域有数量不定或固定的树突连接到其它细胞。Connections计算出numActiveConnected激活的树突数量,numActivePotential潜在的(matching)树突激活数量。由此再计算得到具体是哪些树突。保存到activeSegments和matchingSegments。由activeSegments可以非常简单的得到处于预测状态的细胞,实现getPredictiveCells()。
总结:
第一步,依据当前的激活列,和树突区域连通性,计算得到处于预测状态的细胞。然后计算得到活跃的细胞,即tm的输出。
第二步,依据当前的激活细胞,计算激活的树突区域。最后是学习过程。