【HTM - Python】NetworkAPIの導入と探索
HTM記事全体の目次は以下。
【HTM - Python】新皮質モデルで機械学習(目次) - FUNC-RETURN
NetworkAPIとは
NetworkAPIとは、HTMリージョン間の関係を定義し、ネットワーク全体の操作ができるAPIです。
HTMは右図のように脳の処理分野単位がリージョンとして定義されており、それらを相互に連結して新皮質全体のネットワークとみなせる構成を作ることができます。[Fig1]
ここにHTMネットワークの汎用的側面を期待できます。
例えば、[Fig2] は視覚的情報である画像と、聴覚的情報である音声が別々のリージョンを経由して上位リージョンに到達するような構成になってます。
より上位なリージョンでは、より抽象的で本質的な概念を獲得しうるかもしれません。
Fig1. HTMネットワークの全体像
Fig2. 音声情報と視覚情報を別々のリージョンにInputし、
上位リージョンでそれらを統合するようなネットワーク
Modelクラスは何をしてるのか
Swarmingを実行して得たパラメータと、ModelFactoryで生成していたModelクラスは何をしていたのか。
結論から言うと、Modelクラスは1レイヤーで構成されたNetworkAPIの作成と操作をうまい具合にしてくれてます。
実装は以下で確認できます。
nupic/htm_prediction_model.py at master · numenta/nupic · GitHub
基本的な実装ガイド
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())
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で全て実装してみようと思います。