(HTM)nupic时间沉积池实现解读

(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()

其关键变量包括:

  1. columnDimensions=(2048,) 列数
  2. cellsPerColumn=32 每个列的细胞数
  3. activationThreshold=16 一个突触区域有16个有效细胞输入时会被激活
  4. initialPermanence=0.21 初始连通值
  5. connectedPermanence=0.50 连通阈值
  6. minThreshold=12 输入区域处于matching状态的阈值
  7. maxNewSynapseCount=20 树突区域性的突触的添加量
  8. permanenceIncrement=0.10 突触连通性增益
  9. permanenceDecrement=0.10 突触连通性减益
  10. predictedSegmentDecrement=0.0
  11. maxSegmentsPerCell=128 一个细胞能够拥有的最多的树突区域
  12. maxSynapsesPerSegment=32 一个树突区域连接到的最大细胞数
  13. inputWidth=2048
  14. newSynapseCount=20
  15. connections=[] 2048*32
  16. activeCells=[]
  17. winnerCells=[]
  18. activeSegments=[]
  19. matchingSegments=[]
  20. numActivePotentialSynapsesForSegment=[]
  21. numActivePotentialSynapsesForSegment=[]

 

tm.compute():

tm输入是从sp得到的哪些列激活的下标,它的本质是对当前输入的表示。在此基础上,我们需要对未来做出预测。因此,我们首先需要计算哪些细胞被激活,然后根据当前激活的细胞,计算激活的树突区域,然后再计算哪些细胞处于预测状态。本例中研究的tm实现只能预测未来一个时间步的内容。Tm的代码逻辑上相对简单,但在一些实现上非常晦涩。这里仅提供大体的实现思路。

 

一些关键变量的功能:

activeState记录细胞的激活状态

predictiveState记录细胞的预测状态,

learnState 记录哪个细胞用于学习。那些成功预测了的细胞会被用于学习。一个没有成功预测细胞的柱状区域,所有的细胞被激活,只有一个最符合的会被选为学习细胞。

SegmentUpdateList 突触连通值的临时修改

SequenceSegment ,bool,是否预测

NewSynapseCount 随机添加到树突区域的突触数量

ActivationThreshold 树突区域的活跃阈值

connectedPerm 突触的连通值阈值

activeSegments 存放活跃突触大于16的树突区域

matchingSegments 存放活跃突触大于12的树突区域

 

  1. 第一步:activateCells(activeColumns)

2048*32=65536.共计65536个细胞。我们的目的是计算出一个下标,指出这些细胞中哪些处于激活状态,哪些处于预测状态。在实现上实际计算处于激活状态的树突区域。

上一步的ActiveCells记录在prevActiveCells,winnerCells记录在prevWinnerCells

segToCol()计算细胞的所属列,winnerCells用于选择学习细胞。activeCells记录32个细胞。并选出一个winnerCell。

activateCells() 通过上一步的预测predictiveState和当前的活跃列activeColumns,计算哪些细胞应该是活跃细胞。保存在activateCells,2048*32

如果一个列是激活的,且有激活的突触区域,则称为activatePredictedColumn.则选取成功预测的细胞。

如果一个列是激活的,但没有激活的突触区域,则称为burstColumn。选取它所有的细胞。

如果一个列是不活跃的,有激活的突触区域,则称为punishPredictedColumn

 

  1. 第二步:activateDendrites 更新突触区域和学习。根据当前列的活跃状态来更新突触区域的活跃状态,供上一步活跃的列来查询是否由活跃的树突区域。

由上一步计算得到的activeCells和阈值connectedPermanence,由管理细胞,树突区域,连通性,连通值的connections来进行计算。取得activeSegments和matchingSegments。numActiveCOnnectedSynapsesForSegment和numActivePotentialSynapsesForSegment存放他们连接到的激活细胞的具体数字。根据当前activeCells得到的ActiveSegments已经可以转化成对应到每一个列的columnActiveSegments供上一步活跃的列检测活跃树突区域,用来选择激活的细胞了。对于一个树突区域,如果连接到的活跃细胞(从所有细胞中进行子抽样)大于16,则该树突区域激活。如果大于12,则置入matching列表。Connections 记录65536个细胞之间的树突连通性以及连通值。每一个细胞的一个树突区域有数量不定或固定的树突连接到其它细胞。Connections计算出numActiveConnected激活的树突数量,numActivePotential潜在的(matching)树突激活数量。由此再计算得到具体是哪些树突。保存到activeSegments和matchingSegments。由activeSegments可以非常简单的得到处于预测状态的细胞,实现getPredictiveCells()。

 

总结:

第一步,依据当前的激活列,和树突区域连通性,计算得到处于预测状态的细胞。然后计算得到活跃的细胞,即tm的输出。

第二步,依据当前的激活细胞,计算激活的树突区域。最后是学习过程。

你可能感兴趣的