FUNC-RETURN

システム、インフラ、AI、デザイン

【HTM - Python】NetworkAPIの導入と探索

f:id:kijnmb-1110:20171231231233p:plain





HTM記事全体の目次は以下。

【HTM - Python】新皮質モデルで機械学習(目次) - FUNC-RETURN

NetworkAPIとは

NetworkAPIとは、HTMリージョン間の関係を定義し、ネットワーク全体の操作ができるAPIです。

HTMは右図のように脳の処理分野単位がリージョンとして定義されており、それらを相互に連結して新皮質全体のネットワークとみなせる構成を作ることができます。[Fig1]

ここにHTMネットワークの汎用的側面を期待できます。

例えば、[Fig2] は視覚的情報である画像と、聴覚的情報である音声が別々のリージョンを経由して上位リージョンに到達するような構成になってます。
より上位なリージョンでは、より抽象的で本質的な概念を獲得しうるかもしれません。

f:id:kijnmb-1110:20171231232153p:plain
Fig1. HTMネットワークの全体像
f:id:kijnmb-1110:20171231233026j:plain
Fig2. 音声情報と視覚情報を別々のリージョンにInputし、
上位リージョンでそれらを統合するようなネットワーク

Modelクラスは何をしてるのか

Swarmingを実行して得たパラメータと、ModelFactoryで生成していたModelクラスは何をしていたのか。
結論から言うと、Modelクラスは1レイヤーで構成されたNetworkAPIの作成と操作をうまい具合にしてくれてます。


実装は以下で確認できます。
nupic/htm_prediction_model.py at master · numenta/nupic · GitHub

基本的な実装ガイド

nupic.engine.Networkを使います。

Network — NuPIC 1.0.3 documentation


from nupic.engine import Network

...

network = Network()


リージョンを追加
nupic.engine.Network#addRegionで新規リージョンを追加できます。
第一引数はリージョン名、第二引数はリージョンのタイプ、第三引数はオプションです。

Network — NuPIC 1.0.3 documentation


from nupic.engine import Network

...

network = Network()

# Row Dataがインプットされるセンサーリージョンを追加
network.addRegion("sensor", "py.RecordSensor", sensor_params)

...

# 空間プーリングリージョンを追加
network.addRegion("SP", "py.SPRegion", sp_params)

...

# 時間プーリングリージョンを追加
network.addRegion("TM", "py.TMRegion", tm_params)

...

# クラスタリングリージョンを追加
network.addRegion("classifier", "SDRClassifierRegion", cl_params)


リージョンオブジェクトを取得
addしたリージョンはregionsプロパティからアクセスできます。
ちゃんとしたドキュメントは存在しませんが、getSelf()を通して初めてaddしたリージョンオブジェクトを取得できるようです。

network.addRegion("sensor", "py.RecordSensor", sensor_params)

# RecordSensorオブジェクトが取得できる。
sensorRegion = network.regions["sensor"].getSelf()


リージョンのSpecを取得
getSpec()で、リージョンの取りうるInputやOutput、Parameterなどの情報を取得できます。

Regions — NuPIC 1.0.3 documentation



import pprint as pp

...

sensorRegion = network.regions["sensor"].getSelf()

pp.pprint(sensorRegion.getSpec())


リージョン間のリンクを貼る
addしたリージョン同士をlinkで接続することができます。

Network API — NuPIC 1.0.0 documentation

network.addRegion("sensor", "py.RecordSensor", "{}")
network.addRegion("SP", "py.SPRegion", sp_params)

# センサーリージョンのデータをそのまま空間プーリングリージョンにインプットする
network.link("sensor", "SP", "UniformLink", "", srcOutput="dataOut", destInput="bottomUpIn")


ネットワークの初期化と実行
実行前に、initialize()で初期化する必要があります。
追加された全リージョンを初期化します。

run(N)でN回分のイテレーションを一度に実行します。
他の機械学習のミニバッチ学習のようなニュアンスで捉えれますが、
時系列データなので、ミニバッチのようにランダムにN個選ぶような処理ではなく、単純にN個分のまとまりで実行するだけな気がします。

Network API — NuPIC 1.0.0 documentation

# 初期化
network.initialize()

# ネットワークをN個単位で実行する
RECORD_NUM = 1000
N = 1
for _ in range(0, RECORD_NUM, N):
  network.run(N)


各リージョンのパラメータ
各リージョンのパラメータをセットするには、setParameter(parameter_name, parameter_value)でセットできます。
セットされている値はgetParameter(parameter_name)で取得できます。
各リージョンのパラメータの説明は、上記getSpecで確認できます。

Regions — NuPIC 1.0.0 documentation


# 予測するフィールド名
network.regions["sensor"].setParameter("predictedField", "sine")

# 学習モード
network.regions["SP"].setParameter("learningMode", 1)

# 予測モード
network.regions["SP"].setParameter("inferenceMode", 1)

print(network.regions["SP"].getParameter("inferenceMode")) #=> 1

ネットワークAPIを使ってみる

以前、Swarming + ModelでSine関数の予測をする記事を書きました(これ)。
次は、これをNetworkAPIで全て実装してみようと思います。

github.com




f:id:kijnmb-1110:20171231231233p:plain