こどもの頃は少年合唱団、ポンダッドです。

前回はHTMの理論についてまとめました。今回は実際につかってみることで、その仕組の理解を深めようと思います。

『考える脳考えるコンピューター』では、自己連想記憶の例として歌の記憶があげられていました。歌の最初のフレーズを聞くだけで、人間はその歌がなんであるか聞き分けます。

また、歌のキーが変化していても同様に聞き分けることができます。これらは歌のフレーズを普遍の表現として記憶し、音の入力からそれを予測することで可能になります。

HTMが新皮質を再現したのであれば、同じ処理ができるはずです。そこで実際にどのような処理をおこなうか試してみました。

記事の最後にはJupyter-Notebookのノートを添付しています。ぜひ一緒に試してみましょう。

NuPIC(Numenta Platform for Intelligent Computing)

2013年にNumentaはオープンソースプラットフォーム NuPIC(Numenta Platform for Intelligent Computing)を公開しました。これはコア部はC ++で書かれていますが、APIによりPython、JAVA 、JavaScriptなど様々な言語で利用することができます。

64bitの各OSに対応していますが※1、ひとつ注意点があります。Pythonライブラリは2系にのみ対応しています。

2020年現在、有志の方によりPython3系の移植版 htm.core が作成されています。Numentaは今後3系の開発はしない意向のようです。

今回はUbuntu18.04とPython2.7をつかいます。※2

音源ファイルの作成

図1

Scratchで音楽の再生

音源はWAVファイルであれば何でも良いのですが、今回の実験ではHTMに学習させるため周波数を変えた同じ音楽が必要になります。

そこでビジュアルプログラミングエディターScratchを使うことにしました。Scratchの「音楽」ブロックは「楽器」を21種類選択できます。この機能を使い、音楽の周波数を変えて再生します。

今回は「キラキラ星」を楽器を変えて10回、検証用に「メリーさんのひつじ」を1回演奏するプログラムを組みました。サンプルプログラムは下記リンクより利用して下さい。

サウンド・リピーター - Scratch

Chrome拡張機能で音楽の録音

音源の録音にはMacであればQuickTimeで録音すればよいでしょう。今回はChrome拡張機能AudioRecorderを使って音源を録音します。

以上で5分弱の音源WAVファイルが生成できました。

HTMアプリケーションをつかう

図2

今回は、Numentaが公開しているHTMのサンプルアプリnupic.criticをつかいます。これは発生音のストリーミングデータをもとに異常検知をおこなうアプリです。

HTMではリアルタイムで学習と予測をおこなうため、異常値でないシーケンスは、記憶していると判断できます。

1. アプリケーションのクローン

以下のソフトが必要になりますので、Python2系のものを事前にインストールして下さい。

HTMのサンプルアプリnupic.criticをレポジトリhtm-community/nupic.criticからクローンします。

1
$ git clone https://github.com/htm-community/nupic.critic.git

2. 音源をCSVに変換する

図3

先程ダウンロードしたwavファイルをカレントディレクトリに移動して下さい。convert_wav.pyでWAVファイルをCSVファイルに変換します。

1
$ python nupic.critic/convert_wav.py myRecording00.wav

3. SDRへ変換し学習・予測をおこなう

図4

ディレクトリ内にdata/myRecording00_5hz_10b/inputフォルダが生成されました。この中にWAVファイルを音階ごとにCSV化したファイルが保存されています。保存されたファイルをSDRに変換後、学習と予測を同時におこないます。

1
$ python nupic.critic/run.py data/myRecording00_5hz_10b/input

図5

サンプルアプリでは1秒に5回学習と予測をおこないます。時間ごとに前のステップで予測した周波数と、実際の周波数の誤差を計測しているのがわかります。

4. 予測の可視化

今度はディレクトリ内にdata/myRecording00_5hz_10b/inputフォルダが生成されました。この中に時間ごとの予測と、誤差が保存されています。保存したデータをプロットして可視化出来ます。音楽の再生と合わせてどの部分が記憶できたか確認してみましょう。

1
$ python nupic.critic/plotter.py data/myRecording00_5hz_10b/output -w 'myRecording00.wav'

図3

上のグラフが各音階のデータ、下のグラフが予測に対しての誤差をあらわします。

学習フェーズでは、空間プーリングによる推論のみおこなわれているため予測はおこなわれません。ミニカラムはバースト状態にあり、普遍の表現を形成します。

図4

時間プーリングをつかった予測がはじまりました。セル同士のシナプスが結びついていないため、赤い部分が目立ちます。

図5

シナプスの結合がすすみ、赤い部分が目立たなくなってきました。時間プーリングの学習と予測は同時におこなわれるため、新しい楽器で演奏され最初フレーズが予測されなかった場合でも修正がおこなわれていることが分かります。

図6

青線の部分がクラリネットで演奏した「キラキラ星」、赤線の部分が同じくクラリネットで演奏した「メリーさんのひつじ」です。(音源ファイル3:57以降の部分)

概ね「キラキラ星」を記憶し、「メリーさんのひつじ」は違う歌だと予測できている結果となりました。

まとめ

無事、機械知能が自己連想記憶をよびだすのを確認することができました。音楽のフレーズをきっかけに記憶を思い出すなんて、『ノルウェイの森』の主人公ワタナベみたいだなと感じました。

新皮質の構造をもとにしているので、今なにをしているのかが直感的にわかりやすいと感じました。今回はデモ用のアプリをそのまま使っただけなので、ライブラリの使い方をすこしずつおぼえていきたいですね。

ではまた。

Jupyterノートブック

ノートブックは以下のリンクからアクセスしてください。

HTM-learning-1-ja.ipynb

注釈

※1: MacOS Catalinaでインストールを試したのですが、ライブラリの依存関係でエラーが出るためインストールできません。Ubuntuの仮想環境をつくるか、もしくはhtm.coreをインストールしてください。

※2: RaspberryPi4は64BitのUbuntuが動作するため、NuPICのインストールが可能です。ただし、Arm64版のインストールは依存関係が複雑で、ビルドにすごく手間がかかるのでここでは説明を割愛します。

補足図

それでも試してみたいというマニアックな方は こちら を参考にしてください。