【HTM - Python】大脳新皮質モデルの機械学習導入
HTM記事全体のの目次は以下。
【HTM - Python】新皮質モデルで機械学習(目次) - FUNC-RETURN
まず、これを読めば導入はすっ飛ばせるというのを貼っておきます。
2010年に発表されたNumenta公式ドキュメントが翻訳されたものです。
HIERARCHICAL TEMPORAL MEMORY including HTM Cortical Learning Algorithms
まず、HTMの開発元であるNumentaがどう定義しているか。
Hierarchical Temporal Memory (HTM) は、新皮質の構造的・アルゴリズム的性質を捉えることを目指した機械学習技術である。
つまり、機械学習は機械学習でも大脳新皮質に着目した技術です。
基本原理を一言で説明している箇所がありました。
HTM ネットワークは伝統的なコンピュータとかなり違うものの、階層構造、時間と
疎分散表現(詳しくは後述する)の主要機能を包含する限り、我々は汎用的なコンピュ
ータを使ってモデル化することができる。
つまり、側だけ見ると既存のニューラルネットワークシステムと比べると、
- 階層構造
- 時間
- 疎分散表現
の3点のみ大きく異なります。
ちなみに後に、時間は時間プーリング(Temporal Pooling)、疎分散表現は空間プーリング(Spatial Pooling)
として、HTMアルゴリズムの核となる概念に対応していることが分かります。
リージョンが階層的な構造を持って相互連結されること。
基本的にメモリ容量が一定ならば、リージョンの大きさと数は、トレードオフな関係となります。
視覚情報と聴覚情報を、別々の低レイヤーリージョンに入れて、高次野で統合させることもできるぽいです。
ある程度まとまった機能を持つ領域のこと。
いくつかのセルのまとまりが二次元のカラム状に配置されて、リージョンを構成します。
実際の新皮質におけるリージョンの話はこんな感じ。
人の新皮質は面積約 1,000cm2、厚さ 2mm のニューロンの皮である。この皮を視覚
化するには、食事に使うナプキンの布と考えてみれば、新皮質の面積と厚さのちょうど
良い近似になっている。新皮質は十数種類の機能的なリージョンに分かれていて、その
いくつかは視覚に関係し、あるいは聴覚、言語などに関係している。
一つのリージョンが持つ機能は結構大きいようですね。
(視覚野全体で数個のリージョンを持つとしても、一つあたりかなりの複雑性を持っていることになりそう。)
セルは二次元のカラム状に配置される。
この図では、1 カラム当たり 4 つのセルで構成される HTM リージョンの小さな区画を表している。
一言で言えば、
空間プーリングの最も基本的な機能はリージョンへの入力を疎なパターンに変換することである。
つまるところ、HTMリージョンは常に、入力を疎(スカスカ)な状態に維持する。
10,000ビットの入力があるとして、ある時は3,000個が "1" で、ある時は5,000個が "1" かもしれないが、
HTMリージョンは常に、入力ビットの内、2%しかアクティブにしないそうです。
空間プーリングは既存のニューラルネットワークでも、入力の抽象表現を獲得するためによく使われますね。
(Max Pooling、Average Pooling、L2 Pooling)
HTMにおける空間プーリングは、時間プーリングの際に別のメリットをもたらす。
時間の概念がいかに重要か、この例が分かりやすいですね。
(ここで言う「重要」とは、人が持つ認知アルゴリズムの中で不可欠な特徴となっていると言うことです。)
誰かが貴方の手の上にりんごを置いたとしよう。
ほんの数秒間触ってみることでそれが何かが分かるだろう。
りんごの上で指を動かせば、触覚から得られる情報が常に変化しているにも関わらず、その物体そのもの ― そのりんごや貴方が持つ「りんご」という高レベルの認識 ― は変化しない。
しかしながら、もし貴方が手のひらを開いて、その上にりんごが置かれて、しかも手や指先を動かしてはいけないと言われたなら、それがレモンではなくりんごであると識別するのは非常に難しいだろう。
つまりは、触覚からの入力情報が時間的に変化することが非常に重要だと言うことです。
時間プーリングの本質的な目的は、時間的に同じパターンを示すシーケンスを記憶し、その記憶した情報を使って次の状態を予測することです。
この際に、空間プーリングが非常に重要になってきます。
この引用丸々が一番分かりやすいです。
仮想的に、あるリージョンが全部で 10,000 個あるセルのうち、常に 200 個のセルがアクティブになることで表現を形成しているとしよう(任意の時点で 2%のセルがアクティブ)。
200 個のアクティブなセルで表される特定のパターンを記憶・理解するにはどうすればよいだろうか。
これを行う単純な方法は、関心がある 200 個のアクティブなセルのリストを作成することである。
ちょうど同じ 200 個のセルが再びアクティブになったことが分かれば、そのパターンを理解したことになる。
しかしながら、200個のアクティブなセルのうち 20 個だけのリストを作成して、残りの 180 個を無視したとしたらどうだろうか? 何が起こるだろうか?
20 個のセルだけを記憶したら、200個のセルの異なるパターンにおいてそれら 20 個の部分がちょうどアクティブになるようなパターンが数多く存在して、間違いだらけになると読者は考えるかも知れない。しかしそうはならない。
パターンは大きくかつ疎であるため(この例では 10,000 個のうち 200 個のセルがアクティブ)、20 個のアクティブなセルを記憶することで 200 個すべてを記憶することとほとんど同じくらいうまく記憶できる。
実際のシステムで間違いが起こる可能性は極めて稀で、必要なメモリ量を非常に節約できる。
つまり、入力時に疎な状態にしていることで、それらが大きなセル空間内で共通の20個を共有する確率は無視できるようになるので、時間プーリング時に200個の内20個のみ記録しておけば良いようになります。
ニューラルネットは往往にしてメモリとの戦いが核の問題となるので、そういった意味でも非常にうまくモデル化されているなあと思います。
かなりざっと原理を見ましたが、セル自体の構成や、空間プーリング・時間プーリングの具体的なアルゴリズム、あるいは実際の学習・推論・予測のアルゴリズムにもっと興味ある人は、ドキュメントを読んでください。
特に、ドキュメントの最終章あたりを眺めていると、いかにHTMが観測的に構築された理論かが分かります。
かなり実際の新皮質の詳細なアルゴリズムと対比して説明してくれます。
次回は、HTMでSine関数を予測してみようと思います。
↑書きました。
haretoke.hatenablog.jp