人工知性を作りたい

私が日々、挑戦したことや学んだことなどを紹介していく雑記ブログです。 (新しいAI技術HTM, 専門の音声信号処理, 趣味のアニメ等も書いてます。)

NuPICからhtm.coreへ移植! htm.coreを用いた話者照合 -2次元入力-【SP+TM層】#異常検知 #notGPU

f:id:hiro-htm877:20190715195411p:plain

 

 

 

  

 

本記事のテーマ

NuPICからhtm.coreへ移植! htm.coreを用いた話者照合 -2次元入力-【SP+TM層】#異常検知 #notGPU

htm.coreは、Python3で動くHTMライブラリになります。

今までのNuPICでは今後提供が終了するPython2でしか動かないため、htm.coreを作成されました。

NuPICとhtm.coreの大きな違いはSDRというクラスにあります。

私もここの使い方で苦戦しました。

※HTM(Hierarchical Temporal Memory)

 

htm.coreへの移植

移植の流れ

 

1. SP層とTM層の生成

2. SDRの生成

3. 学習方法

4. 異常度の計算

5. モデルのsaveとload

 

SP層とTM層の生成

SP層とTM層の生成に関してはNuPICとほとんど変わりがありませんでした。

しかし、SP層においてはパラメータが増えていたり無くなっていたりするので、NuPICと全く同じパラメータを使うことは出来ませんでした。

※今回は各パラメータを理解していないのでhtm.coreのパラメータで1から調整しました。

SpatialPoolerクラス

sp = SpatialPooler(
      inputDimensions            = (20, 27),
      columnDimensions           = (10, 10),
      localAreaDensity           = 0.3,
      potentialPct               = 0.8,
      potentialRadius            = 269,
      globalInhibition           = True,
    #   synPermInactiveDec         = spParams["synPermInactiveDec"],
      synPermActiveInc           = 0.001,
    #   synPermConnected           = spParams["synPermConnected"],
    #   boostStrength              = spParams["boostStrength"],
    #   wrapAround                 = True
    seed = 1960
    )

 

TemporalMemory

tm = TemporalMemory(
      columnDimensions          = (10, 10),
      cellsPerColumn            = 16,
      activationThreshold       = 10,
      initialPermanence         = 0.21,
      connectedPermanence       = 0.5,
      minThreshold              = 4,
      maxNewSynapseCount        = 20,
      permanenceIncrement       = 0.1,
      permanenceDecrement       = 0.1,
    #   predictedSegmentDecrement = 0.0,
      maxSegmentsPerCell        = 64,
      maxSynapsesPerSegment     = 16,
      seed = 1940
    )

 

SDRを使ったSP層とTM層の生成

SP層とTM層への入力はSDRクラスを用います

・SDRクラスの宣言

sdr = SDR(dimensions = (20, 27))

・SDRクラスへの値の代入

これら3つの処理はどれも同じ結果を返します。ですのでどれを使って値を設定しても構いません。

・公式説明

任意の形式のデータにアクセスすると、SDRは、SDRへの最新の割り当てで使用された形式ではない場合でも、データ形式を自動的に変換します。

X.dense-> [[0、1、0]、
           [0、1、0]、
           [0、0、1]]
x.sparse-> [1、4、8]
X.coordinates-> [[0、1、2]、[1、1、2]]

ちなみに私はsparseを使っています。

sdr.sparse = np.nonzero(en[0].reshape(-1))[0]
activeColumns = SDR( sp.getColumnDimensions() )

 

 

学習方法

NuPICと方法は同じです。

sp.compute(sdr, True, activeColumns)
tm.compute(activeColumns, learn=True)

 

 

異常値の計算

異常値(RawAnomalyScore)の計算はhtm.coreですごく簡単になりました、

print(tm.anomaly)

 

モデルのsaveとload

学習モデルのsave

・()内は保存するファイルのpath

sp.saveToFile("sp.model")
tm.saveToFile("tm.model")

 

学習モデルのload

・()内は保存するファイルのpath

sp = SpatialPooler()
sp.loadFromFile("sp.model")
    
tm = TemporalMemory()
tm.loadFromFile("tm.model")

 

 

htm.coreで話者照合した結果は以下になります。

本実験の目的

・処理の軽い話者照合システムの実現!

NuPICは処理が少なく商品化しやすい技術だと思います。

現在の実験でもMacbookで動かしています。

 

・HTMを広めたい

 

使用する音声(RedDots)

RedDotsという音声コーパス

「学習音声」

・f0002の32=「OK, Google」、5音声

「テスト音声」

・f0002の32=「OK, Google」、19音声

・f0002の31=「My voice is My password」、32音声

・m0001の32=「OK, Google」、25音声

※ f=female(女性), m=male(男性)、数字は話者の識別番号

  

実験方法

HTMのTM層を用いて異常検出を行い、特定話者の特定音声のみには異常が出ないように学習させる。

入力データ

1. 正規化した音声をメルスペクトログラムに変換(20次元)

2. 角周波数ごとにパワーを0と1で表現(エンコード

3. 20個の周波数の配列を結合し、計340次元の配列としてSP層にに入力する

4. columnDimensionsは(10, 10)とする。

5. SP層で学習したactiveColumnの"1"の部分のIndexをTM層に入力する

6. computeRawAnomalyScoreで異常度を計算する

学習方法

・f0002「OK, Google」の24音声のうち5音声を用いて学習させる

・適当な長さ学習を行い、異常度が落ち着いたら学習を終了とする

・学習終了後はSPとTMのパラメータをpickleで保存する

学習システムの処理時間:20.45[秒]

検証方法

 

・学習時に保存したパラメータを使って学習モードをOFFにして検証する

 

実験結果

学習時

・学習結果f0002「OK, Google」(5音声)

f:id:hiro-htm877:20190901203233p:plain

ちゃんと異常度が落ち着いた。

ただ、過学習を起こしていそう...。

テスト時

・f0002「OK, Google

理想の結果:異常度が0

f:id:hiro-htm877:20190901203404p:plain

異常度はそこそこ落ち着いているが、もっと学習を上手く行った方が良さそう。

 

・f0002「My voice is My password」 

f:id:hiro-htm877:20190901203550p:plain

異常値がさっきよりは高く出ている。

 

・m0001「OK, Google

f:id:hiro-htm877:20190901203643p:plain

異常値が高く出ている。

 

比較検討・まとめ

今回は一応話者照合できてるかな...ぐらいの結果でした。

まぁ目的としてはhtm.coreへの移植ですので、移植後も学習できているみたいなので、今後はhtm.coreでも話者照合できるようにパラメータの調整やhtm.coreの使い方を勉強していこうと思います。

 

今後の予定

・信頼度を高める

・htm.coreに移植(完了)

・htm.coreで予測(完了)

・htm.coreでの話者照合

・論文的にまとめる(NuPIC)

 

 

 補足:学習モデルを用いた学習False時の異常値の疑問

htm.coreでsaveしたモデルをloadして異常値を予測した場合、学習時より少し大きく異常値が出ていたので、原因の探索として、学習後saveせずに続けて学習モードをFalseで動かしてみました。

 

こちらでも学習時より異常値が多く出ていたので、そういう仕様なのか、異常値の出し方を間違っているのか今後調査していきたいと思います。

 

f:id:hiro-htm877:20190921092626p:plain

 

ソースコード置き場

ソースコードの例は以下の記事に載せておきます。

www.hiro877.com