階層的時間メモリコア学習アルゴリズム

良い一日!
最近、ハブに記事が非常に頻繁に登場し、著者は、人工知能とニューラルネットワークを構築するための現代の理論とアプローチについて説明しています。 ただし、特定の実装のかなり少数の例が提供されています。 このギャップを埋めようとしましょう。 この記事では、 Numenta Incが提供するアルゴリズムの実際のレイアウトを作成する際に使用される主な理論的および実用的なポイントのみを説明します。

実装の基礎はここで利用可能なドキュメントでした 。 ロシア語の翻訳版もありますが、完全を期すために、オリジナルを使用することを個人的にお勧めします。

HTMアーキテクチャ

著者が保証するように、ネットワークアーキテクチャは、大脳皮質の構造に基づいており、むしろ、大脳皮質のその部分( 新皮質と呼ばれる)に基づいています。 基本的な単位であるニューロンセルは列に編成され、 列が順番に領域を構成します 。 将来のサイトから、ネットワークに名前が付けられた階層を構築することができます。
公式サイトの写真は、プロットの構造の一般的な考え方を示しています。
画像

細胞の構造は、天然のニューロンとの類推によって、 樹状突起セグメント (樹状突起の特定のセットで構成される)とシナプスの存在を提供します- シナプス -別の細胞の軸索とそれ自身の樹状突起との間の接合部。 HTMの各シナプスは、実際には「永続性」(0〜1の実数)で表されます。シナプス強度が指定値よりも小さい場合、シナプスは反対に「存在しない」とみなされます-有効です。 これは潜在的なシナプスの概念です。
1つの細胞の樹状セグメントは、遠位と近位に分けられます。 近位は入力情報を取得するために使用され、遠位は特定のエリア内でセルを互いに接続するために使用されます。 提案されているNumentaアーキテクチャでは、各セル列に1つの共通の近位セグメントがあり、速度が向上します。 各樹状セグメント(遠位および近位の両方)には、多数の潜在的なシナプスが含まれています。
情報の入力ビットは、近位樹状突起とシナプスを形成できる細胞の層として表されます。
このアーキテクチャに基づいて、トレーニングアルゴリズムは、空間(空間)および一時(時間、一時?)ハタの2つのフェーズで構成されます。

空間ハタ

空間グルーパーには、オーバーラップ、抑制、学習の3つのフェーズが含まれます。
重複フェーズでは、各列について、入力情報の入力情報の「単一」ビットのこの列の近位樹状突起セグメントのシナプスによる「カバレッジ」を反映する値が計算されます。 シナプスはアクティブであると見なされます。シナプスの強度は設定値より大きく、リードする情報のビットには1が含まれています。
  1. public void SOverlap ( ) {
  2. for ( int i = 0 ; i < xDimension * yDimension ; i ++ ) {
  3. オーバーラップ[ i ] = 0.0 ;
  4. for ( Synapse synapse : connectedSynapses ( i ) ) {
  5. オーバーラップ[ i ] + = input ( time、synapse。c、synapse。i ) ;
  6. }
  7. if (オーバーラップ[ i ] < minOverlap )
  8. オーバーラップ[ i ] = 0.0 ;
  9. 他に
  10. オーバーラップ[ i ] * =ブースト[ i ] ;
  11. }
  12. }

抑制フェーズでは、アクティブな列のリストが計算されます。 最大の「カバレッジ」を持つ列は、隣接する列を抑制します。領域内のアクティブな列の数は、ユーザー定義のパラメーターによって規制されます。
  1. public void SInhibition ( ) {
  2. activeColumns。 add ( 新しい ArrayList <整数> ( ) ) ;
  3. for ( int i = 0 ; i < xDimension * yDimension ; i ++ ) {
  4. ダブル minLocalActivity = kthScore ( neighbors ( i ) 、desiredLocalActivity ) ;
  5. if (オーバーラップ[ i ] > 0.0 &&オーバーラップ[ i ] > = minLocalActivity ) {
  6. activeColumns。 get (時間) 。 追加 ( i ) ;
  7. }
  8. }
  9. }

トレーニング段階では、各アクティブ列の近位樹状突起セグメントのアクティブシナプスの強度が上昇し、非アクティブになり、それに応じて低下します。 次に、リージョン内のすべてのスピーカーが定期的にトリガーされるようにするメカニズムが適用されます。 一般的に言えば、各列のアクティブ化の履歴を( 移動平均の形で)保持し、ダウンタイムが長い場合に列の「カバレッジ」を強化するという事実に基づいています。
  1. public void SLearning ( ) {
  2. for ( 整数 c : activeColumns。get ( time ) ) {
  3. for ( Synapse s : potentialSynapses。get ( c ) ) {
  4. if ( input ( time、 s。c 、 s。i ) > 0 ) {
  5. s。 永続性 + = permanenceInc ;
  6. s。 永続性 = 数学 。 分 ( s。 永続性 、 1.0 ) ;
  7. } else {
  8. s。 永続性 -= permanenceDec ;
  9. s。 永続性 = 数学 。 max ( s。 永続性 、 0.0 ) ;
  10. }
  11. }
  12. }
  13. for ( int i = 0 ; i < xDimension * yDimension ; i ++ ) {
  14. minDutyCycle [ i ] = 0.01 * maxDutyCycle ( neighbors ( i ) ) ;
  15. activeDutyCycle [ i ] = updateActiveDutyCycle ( i ) ;
  16. boost [ i ] = boostFunction ( activeDutyCycle [ i ] 、minDutyCycle [ i ] ) ;
  17. overlayDutyCycle [ i ] = updateOverlapDutyCycle ( i ) ;
  18. if ( overlapDutyCycle [ i ] < minDutyCycle [ i ] ) {
  19. incrementPermanences ( i、 0.1 * connectedPerm ) ;
  20. }
  21. }
  22. hibitionRadius = averageReceptiveFieldSize ( ) ;
  23. }

この段階で、空間グルーパーは終了します。 その結果、まだ必要なアクティブな列のリストがあります。

一時的なハタ

時間グルーパーは、空間のものと同様に、3つのフェーズで構成されます:各セルの活動状態(アクティブ)および学習(学習)の計算、予測状態(予測)の計算、および前のステップで予想されるネットワーク構造の変更を適用するフェーズ-新しいシナプスの追加/遠位樹状突起セグメント。
最初のフェーズでは、空間グルーパーから取得したリストのアクティブな列ごとに、このアクティビティが列内のセルのいずれかによって予測されたかどうかが計算されます。 そのようなセルが見つかった場合、それだけがアクティブになります。それ以外の場合、列内のすべてのセルがアクティブになります。 特定のルールに従って、トレーニング用のセルが選択され、ルールが満たされない場合、列から最も適切なセルがトレーニングされます。
次のフェーズでは、セグメントのアクティビティに基づいて、予測状態のセルが計算され、アクティビティが最後のタイムステップで予測に成功したセグメントが増幅されます。
最終段階では、前の2つのフェーズで提案されたすべての変更が学習セルに適用されます。 新しいセグメントまたは潜在的なシナプスが、このセグメントの既存のセグメントのリストに追加されます。
  1. public void TLearning ( ) {
  2. for ( int c = 0 ; c < xDimension * yDimension ; c ++ ) {
  3. for ( int i = 0 ; i < cellsPerColumn ; i ++ ) {
  4. if ( learnState。get ( time ) 。get ( c ) 。get ( i ) ) {
  5. adapterSegments ( segmentUpdateList.get ( c ) .get ( i ) 、 true ) ;
  6. // segmentUpdateList.get©.get(i).clear();
  7. } else if ( ! predictiveState。get ( time ) 。get ( c ) 。get ( i ) && predictiveState。get ( time - 1 > 0 ? time - 1 : 0 ) 。get ( c ) 。get ( i ) ) {
  8. adapterSegments ( segmentUpdateList.get ( c ) .get ( i ) 、 false ) ;
  9. // segmentUpdateList.get©.get(i).clear();
  10. }
  11. segmentUpdateList。 get ( c ) 。 get ( i ) 。 クリア ( ) ;
  12. }
  13. }
  14. }

おわりに

この記事で紹介されている学習アルゴリズムの一般的な考え方は、基本原理を理解するのに十分であると想定しています。 特定の実装に興味があるすべての人をgithubに招待できます。 そこで提示されたプロジェクトは、HTMアーキテクチャへの準拠という点では理想からはほど遠いものですが、実際には、Noumenovsky pdfで提示された擬似コードの断片、および関数とデータの説明に正確に対応しています。

Source: https://habr.com/ru/post/J146267/


All Articles