読者です 読者をやめる 読者になる 読者になる

Hierarchical Temporal Memory を学ぶ

こんにちは。@iizukak です。この記事は、KLab Advent Calendar の 7 日目の記事です。

私は最近 Hierarchical Temporal Memory (HTM) という、大脳新皮質のモデル化及びコンピュータ上への実装を目指す理論について調べたり実験したりしています。この記事では、HTM 自体と、HTM について学んでいく上で有用だと思われる情報へのリンクを紹介したいと思います。情報へのリンクは、HTM の理論を学びたい方と、応用・実装を学びたい方へ分けて掲載してみました。

私は HTM のスペシャリストではありません。なるべく誤りのないように心がけていますが、この記事には誤った情報が含まれるかもしれません。そのような誤りを見つけた場合は、コメント欄にて教えていただけると幸いです。

HTM とは何でしょう

概要

HTM は、脳、特に大脳新皮質における神経科学的な知見を応用した理論です。HTM の目的は大きくふたつあるように思います。そのふたつが

  • 大脳新皮質の動作原理をモデル化すること
  • 大脳新皮質の動作原理を応用したテクノロジを実装すること

です。なぜ大脳新皮質に着目しているのでしょうか。HTM 提唱者の Jeff Hawkins によれば、大脳新皮質こそが知能に関する最も重要な脳の部品なのであり、大脳新皮質を探ることで知能に関する深い知見が得られるとともに、その知見を応用することで知能の実装を作ることができると予想しているからです(Hawkins のいう「知能」は、「人間らしい振る舞いをする」ことを意味しません。知能とは単に脳の仕組みを真似た階層的記憶システムのことをいいます)。

HTM の目的は、現実世界に存在する特定の問題を解決するアルゴリズムを構築することにはありません。すなわち HTM は、二値分類に対するサポートベクタマシンや、画像認識に対する畳み込みニューラルネットのように、何かの問題に適したアルゴリズムというわけではありません。しかしながら、 HTM にも様々な応用が考えられています。現在実験されている応用として、時系列データの異常検出や単語の意味の表現手法などがあります。様々なデータを汎用的に学習できるのが魅力なのですが、現段階では、それぞれの問題領域に特化した機械学習アルゴリズムにベンチマークで勝ててはいないようです。異常値検出については、ベンチマークでいい性能が出るよという論文が最近出たりしているので、応用に関しては現在研究が進んでいる段階なのだと思われます。

大脳新皮質は数層の細胞からなる領域(リージョン)を、さらに階層的に繋げた構造をしています。その階層的構造と、視床などの脳内の部品をうまく利用することで、入力された情報の流れを統合し、記憶することができるといいます(「考える脳・考えるコンピュータ」 6章)。ですから、この理論は「Hierarchical Temporal Memory」 = 「階層的時間記憶」と名付けられているのだと思います。

Spatial Pooling と Temporal Pooling

HTM を学んでいく上で重要なキーワードに「Spatial Pooling」及び「Temporal Pooling」があります。Spatial Pooling は HTM モデルに入力された情報を HTM の内部表現である、"Spatial Distributed Representation(SDR)" に変換するアルゴリズムです。Temporal Pooling は Spatial Pooling で生成された表現である SDR のシーケンスを学習するアルゴリズムを含みます。Spatial Pooling に関しては、この Wiki が分かりやすいです。Temporal Pooling は [2] の「時間プーリングの概念」の章、もしくは [1] の 6 章を読むのが分かりやすいかと思います。

生体の新皮質のうち、ある特定の領域(リージョン)に着目してみると、無数に存在する柱状構造のうち、常にある低い割合の柱状構造が興奮状態にあることが分かっています。例えば、10000 個の柱状構造からなる領域のうち、その 1 % にあたる 100 個のみが興奮するというような具合です。かなり単純化すれば、次の図のようなイメージといっても間違いではないでしょう。

f:id:iizukak:20151207104621p:plain

(NuPIC Wiki の Sparse Distributed Representations のページより引用)

この図を見てもらえればわかるように、興奮した柱状構造は疎になっています。これは、ある柱状構造が興奮状態にあるとき、近所の柱状構造の興奮を抑制する作用を持っているからです。これをモデル化したのが SDR です。

Temporal Pooling を端的に説明するのは現在の私には難しいことです。それは新皮質の六層構造におけるそれぞれの層の役割及び、新皮質と視床の入出力にも関わる複雑なもので、私はまだ完全には理解できていません。Spatial Pooling に関しては、理論も実装も固まってきている状況にありますが、Temporal Pooling に関しては現在も検討が進んでいる状況に思われます。Temporal Pooling に関する最新の情報へのリンクは [4] の 2 にあります。

HTM の理論を学びたい方へ

ここからは、HTM を学んでいく上で有用だと思われる情報へのリンクを紹介します。

[1] On Intelligence (邦題:考える脳・考えるコンピュータ)

HTM を主テーマとして扱っている書籍は、現在のところこの一冊しかありません。HTM の提唱者は、Jeff Hawkins という人です。Hawkins が HTM の元となるアイディアについて広く知ってもらうことを意図して書いた本が「On Intelligence」で、その邦訳が「考える脳・考えるコンピュータ」です。2004 年の本なので、現在の HTM とは多少異なる部分もありますが、その目指すところを知るためには十分かと思います。翻訳も申し分ない品質です。この本の中では、

  • 従来の人工知能のアプローチの問題点
  • 大脳新皮質の働き
    • 神経科学的に合意が取れているもの及び Hawkins による予想を含む
  • 知能とは何か。知能をコンピュータに実装することは可能か?に関する Hawkins の意見

が書かれています。私はこの本を読んで HTM にハマっていくことになりました。HTM の理論を知りたい人はもちろんなのですが、応用を知りたい人も、まずはこの本を読んでみると得られるものはあると思います。しかし、残念なことにこの本はすでに絶版になってしまっています。大きな図書館などにはあることもあるようなので、図書館を当たるというのもありかと思います。

[2] HIERARCHICAL TEMPORAL MEMORY including HTM Cortical Learning Algorithms

Hawkins は HTM の研究開発を行っている Numenta という会社の創設者であり、Numenta による HTM の理論と実装方針をまとめた文書が、「HIERARCHICAL TEMPORAL MEMORY including HTM Cortical Learning Algorithms」です。PDF で無料で配布されています。HTM 界隈では「White Paper」の呼び名で親しまれ、HTM 研究者/実装者に広く親しまれています。

[1] では主に概念的なことが述べられており、どのように実装すればよいのかについては書かれていません。White Paper を読めば、HTM をいかに実装すればよいのかを知ることが出来ます。この文書のなかで、Spatial Pooling 及び Temporal Pooling の詳細及び擬似コードについても書かれています。また、HTM におけるニューロンのモデルと、生体のニューロンとの差異についても触れられています。

[3] 最近の HTM 論文

2015 年に、Hawkins 及び共同研究者である Subutai Ahmad は、HTM に関する論文を立て続けに書いています。私自身まだ読めていないものもあるのですが、arxiv へのリンクを掲載します。

  1. Why Neurons Have Thousands of Synapses, A Theory of Sequence Memory in Neocortex
  2. Porting HTM Models to the Heidelberg Neuromorphic Computing Platform
  3. Properties of Sparse Distributed Representations and their Application to Hierarchical Temporal Memory
  4. Evaluating Real-time Anomaly Detection Algorithms - the Numenta Anomaly Benchmark

[4] NuPIC Wiki - Hierarchical Temporal Memory Theory

HTM を解説した Youtube へのリンクなどが、こちらの Wiki ページにあります。NuPIC Wiki には有用な情報が記載されていることも多いのですが、古い情報がそのまま放置されていたりもします。Wiki のなかで特に有用だと思われるリンクが以下のものです。

  1. Sparse Distributed Representations (SDRs)
    • SDR の解説です。SDR を使う利点にも触れられています。
  2. New Ideas About Temporal Pooling
    • Hawkins による Temporal Pooling についての新しめのアイディアが書かれています。On Intelligence からの差分についても書かれています。

応用と実装を学びたい方へ

やはり実装があるとよりやる気が出ますよね! HTM は複数言語での実装があるのでご安心ください。

[5] NuPIC

HTM の実装のうち、最も広く使われているのが Python 実装の NuPIC です。しかしながら、NuPIC は、HTM の全てを実装しているわけではありません。具体的にいえば、階層に関する実装が一部省略されたりしています。

NuPIC は Python 製なのですが、コアのアルゴリズムは、nupic.core として C/C++ で実装されています。Spatial Pooler, Temporal Pooler も nupic.core で実装されています。

NuPIC を学習したいと思ったら、次の流れがおすすめです。

  1. Wiki ページを参考にインストールする
  2. チュートリアルをやってみる。こちらに様々なチュートリアルが有ります。比較的簡単に動かすことができますので、ぜひ試してみてください。
  3. 自分でデータを使って実験してみる。たとえば、ここ などに実験に使えそうなデータがいろいろとあります。時系列の数値データを使う例がチュートリアルに多いので、同じようなものを使うと比較的扱うのが楽です。しかしながら、だいたい一発では動きません。いろいろとパラメータを調整したり、パラメータ自体を決定するアルゴリズムを使ってみたりすることで、NuPIC をより深く知ることができます。
  4. Network API を使って、HTM をハックしてみます。普通 NuPIC では、Spatial Pooling, Temporal Pooling を直接は扱わず、全てをラップした便利な model クラスを使ってしまうのですが、使い込んでいくうちに Spatial Pooling, Temporal Pooling をいじくりまわしたくなってきます。そんなときに使えるのが Network API です。
  5. 実装を読んでみる。どこから読み始めれば良いのか結構迷うのですが、nipic.core の Spatial Pooler, Temporal Pooler あたりを読んでみるのが良いかと思います。NuPIC の encoder ディレクトリもおすすめです。

[6] 応用の実例

HTM Challenge

HTM の応用例をいろいろ見てみたい!という方は、HTM Challenge のページを見てみてください。HTM の研究開発を行っている Numenta は、半年に一回 HTM のハッカソンを主催しています。最新のハッカソンが HTM Challenge というイベントで、様々な応用が提出されました。私が面白いと思ったものをあげると、

  1. Traffic Anomaly Detection in Adelaide using HTM
    • 交通量のオープンデータから事故などを起因とする異常値を検出する実験です。このプロジェクトは、大学の博士課程の研究の一環として実装したものだそうです。
  2. Intelligent drum machine that generates new beats, powered by the HTM
    • HTM の応用としてはけっこう変わり種なのですが、ドラムマシンのリズム生成に HTM を応用したものです。
  3. Classify your brainwave patterns with the HTM
    • 脳波のデータの分類に HTM を応用したものです。
  4. ECG Anomaly Detection System using HTM
    • 心電図の異常検出に HTM を応用したものです。手前味噌で申し訳ないのですが、これは私のプロジェクトです。興味がある方はコンタクトしてくだされば、このプロジェクトについていくらでも語ることができます :)

nupic.reaserch

nupic.reasech に、Numenta で行われている実験的な HTM のプロジェクトがいくつも含まれています。NLP のプロジェクトなど興味深いものもあり、一見の価値があるリポジトリだと思います。

Cortical.io

Cortical.io は、HTM を NLP に応用したスタートアップ企業です。Cortical.io は、単語の意味を SDR に変換する Retina API を提供しています。デモページ で、Cortical.io のテクノロジを試してみることができます。単語間の意味の類似度を SDR で表現するデモや、言語の種類を判定するデモなどがあります。

[7] その他の言語の実装

私は使ったことがないのですが、HTM はいろいろな言語で実装されています。

  1. Java(htm.java)
  2. Clojure(Clortex)
  3. Clojure(Comportex)
  4. Go(htm)

Java 実装の htm.java および Clojure 実装の Comportex は活発に開発が行われている印象です。

[8] メーリングリスト

HTM に関する議論は、メーリングリスト経由でやり取りされれることが多いです。メーリングリストはいくつかあるのですが、次の 2 つが活発です。

  1. nupic-discuss
    • このメーリングリストは、基本的になんでもありです。名前に「nupic」と書いてありますが、NuPIC 以外の HTM の実装についても話し合われます。「こんな実験をしたよ!」みたいな報告もOKですし、もっと簡単な「チュートリアルうまく動かないんだけど!」みたいな投稿も許される緩い風潮です。私も時たま議論に参加しています。
  2. nupic-theory
    • nupic-discuss よりは若干固め。HTM の理論に関する議論が行われます。HTM に関する論文の出版や、他領域の HTM に関連しそうな論文紹介などがここで行われます。このメーリングリストには Jeff Hawkins がたまに降臨します。

私は、「お!HTM にこんな応用があったら面白いんじゃないか!」と思い付くと、まずこれらのメーリングリストを検索することにしています。そうすると、だいたいの場合同じことを過去に思いついた人がメーリングリストに投稿しています(笑)

[9] Youtube - NuPIC Open Source チャンネル

HTM に関する豊富な解説動画が Youtube の NuPIC Open Source チャンネル にアップロードされています。最近アップロードされたものでおすすめだと、

  1. HTM Retrospective
    • On Intelligence において HTM の元となるアイディアが描かれてから、10年が経ちました。ここ10年の HTM の進展及び将来の展望が、HTM 研究者の Subutai Ahmad によって語られています。
  2. Getting Predictions out of HTM (CLA Classifier)
    • HTM がパターンのシーケンスをどのように予測するのかが説明されています。
  3. The NuPIC Network API
    • NuPIC の Network API の解説です。一通り NuPIC を動かしてみてから見ると、スムーズに理解できると思います。

最後に

この記事では、HTM の概要及び、参考となる情報を紹介しました。お一人でも HTM に興味を持った方のお役に立てれば幸いです。HTM と共に、Machine Intelligence の世界に飛び込んでみませんか!

さて、KLab Advent Calendar の次は、knsh14 さんの「標準Profilerだけに頼らないUnityのプロファイリングに挑んでみる」です。お楽しみに!