2015 年 9 月

第 30 卷,第 9 期

本文章是由機器翻譯。

測試回合 - 人工刺突神經元 (Artificial Spiking Neurons)

James McCaffrey

James McCaffrey電腦科學的有趣區域運算以人為的峰值神經 — 生物神經的行為的小型軟體元件。假造的峰值神經是相關但截然不同假造的神經常見的軟體類神經網路中。

我馬上假造的峰值神經本文不可能是立即幫助您一般日常的程式設計工作的最上層狀態。但是它可讓您深入了解未來的運算可能就像,而且您會發現假造的峰值神經有趣本身。

最佳的方式來抓住操作的是何種 spiking 神經並查看其中本文開頭都是看看在示範程式 [圖 1

人工峰值神經示範
[圖 1 人工峰值神經示範

這個示範顯示單一 spiking 神經的輸入和輸出值。有三個輸入資料流,有時也稱為特殊圖文集火車。

每個輸入的特殊圖文集火車有 16 0 或 1 的值。三個輸入的特殊圖文集火車 ︰

0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1
1 0 1 1 0 0 0 1 1 1 0 1 1 0 1 1
1 1 0 1 0 0 0 1 1 0 1 1 1 1 1 1

這些 0 或 1 的值會表示從其他 spiking 的神經經過一段時間的輸入。換句話說,在時間 t = 0 時,從第一個特殊圖文集訓練的輸入的值為 0。在時間 t = 1、 輸入是 0;在 t = 2、 輸入為 1。在透過 t = 15 時輸入的值為 1。

在時間 t = [0,spiking 神經接收來自所有三個資料流的輸入,因此在 t = [0,完成輸入神經是 (0,1,1)。在時間 t = 1、 輸入是 (0,0,1)。在透過 t = 15 輸入時 (1,1,1)。

示範程式的下一個部分會顯示定義行為的神經的數值常數。有三個加權值 (4,-2,3) 對應至每個輸入的訓練。遺漏可能會 (1)、 臨界值可能會 (8)、 特殊圖文集可能會 (4) 和後置的尖峰延遲的意義 (2) 將稍後說明。在內容中的峰值神經,「 可能 」 是指 (鬆散) 電力電壓而非 「 可能 」 或 「"即將。

示範程式會模擬 16 時間刻度。在每個刻度,三個輸入以及神經 (作用中或非使用中) 和目前的神經電力可能 (V) 的狀態會顯示 0 或 1 的值。請注意在時間 t = 6 神經達到可能的 V = 8 和尖峰到 V = 12。在幕後處理每一組輸入值時,0 或 1 的輸出值會產生並儲存在緩衝區中。已處理所有輸入的值之後,示範程式會顯示產生的輸出尖峰訓練:

0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0

此時就可能不太厲害。一大堆 0 或 1 的值中進出一大堆 0 或 1 的值。但是請稍微忍耐而且您會看到為什麼假造的峰值神經可能有助於導致電腦和電腦運算的基本變更。

本文假設您至少有程式設計技巧的初學者但不會假設您知道峰值神經。我已經自動程式碼使用 C# 的示範程式但不應該有太大重整至 Python 或 JavaScript 另一個語言的問題。示範程式碼很短和整個本文中所示。還有隨附程式碼下載中提供完整的來源。

了解峰值神經

看看在圖形 [圖 2。此圖形會顯示電力的潛在價值、 V、 峰值神經從時間 t 此示範 = 0 到 t = 15。有許多不同的變化的峰值神經。示範程式是以稱為溢位的整合和-射擊 spiking 神經模型為基礎。

溢位整合和-射擊峰值神經行為
[圖 2 溢位的整合和-射擊峰值神經行為

神經電力可能會隨著時間增加。當 V 符合或超過 spiking 臨界值等於 8 以虛線表示 V 值立即尖峰向上 4 (spike 潛在),然後立即重設為 0。峰值事件發生在時間 t = 6 和 t = 13。如果 spiking 事件發生時,就會發出 1 至輸出尖峰火車,否則為 0,就會發出。

簡直就只是 V 的計算方式為 t 的每個值嗎? 在時間 t = [0,三個輸入的值是 (0,1,1)。您應該記得神經的三個加權值是 (4,-2,3)。首先,輸入時間加權的產品的總和會計算並加入至目前 V 的值。如果 V 會被假設為開頭的示範 0 然後:

V = V + sum
   = 0 + (0)(4) + (1)(-2) + (1)(3)
   = 0 + 1
   = 1

這是整合步驟。接下來,減去遺漏值。示範,遺漏因此 = 1:

V = V - leak
   = 1 - 1
   = 0

V 的新值 = 0 不會超過 8 的臨界值不會突然增加神經因此就會發出輸出尖峰火車 0。接下來,在時間 t = 1、 輸入的值為 (0,0,1)。結合的整合和遺漏步驟提供:

V = V + sum - leak
    = 0 + (0)(4) + (0)(-2) + (1)(3) - 1
    = 0 + 3 - 1
    = 2

假造的溢位整合和-射擊峰值神經都非常簡單。請注意所有值都是整數,其中結合與簡化設計,表示人工神經可以有效率地實作在軟體或硬體。

[圖 2, ,您可以看到在時間 t 發生尖峰事件 = 6。在 t = 5,V 因此 = 5 t 的整合流失計算 = 6 是:

V = V + sum - leak
    = 5 + (1)(4) + (0)(-2) + (0)(3) - 1
    = 5 + 4 - 1
    = 8

此時,V 符合臨界值為 8,因此 V 的值衝到 8 + 4 = 12,就會發出輸出值為 1,然後 V 會立即重設為 0。尖峰事件之後模擬的神經會進入的狀態一段時間就會忽略輸入的值。示範設定此延遲期間為 2,因此有時 t = 7 和 t = 8、 V 維持不論的輸入值 0。在時間 t = 9、 神經會變成作用中和恢復正常的行為。

實作示範程式

示範程式,以節省空間,一些次要的編輯結果的程式碼所示 [圖 3。若要建立示範程式,我啟動 Visual Studio 並建立新 C# 主控台應用程式的專案命名為 SpikingNeuron。演示程式有沒有重大的 Microsoft.NET 框架依賴關係,因此,任何較新版本的Visual Studio將工作。

[圖 3 峰值神經程式

using System;
namespace SpikingNeuron
{
  class SpikingNeuronProgram
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Begin spiking neuron demo");
      int[][] inputs = new int[3][];
      inputs[0] = new int[] { 0, 0, 1, 0, 1, 0, 1, 1,
        1, 1, 0, 0, 1, 0, 1, 1 };
      inputs[1] = new int[] { 1, 0, 1, 1, 0, 0, 0, 1,
        1, 1, 0, 1, 1, 0, 1, 1 };
      inputs[2] = new int[] { 1, 1, 0, 1, 0, 0, 0, 1,
        1, 0, 1, 1, 1, 1, 1, 1 };
      Console.WriteLine("The inputs are: ");
      for (int i = 0; i < inputs.Length; ++i)
        ShowVector(inputs[i], false);
      Console.WriteLine("");
      int[] output = new int[16];
      int[] wts = new int[] { 4, -2, 3 };
      Console.Write("The weights are: ");
      ShowVector(wts, true);
      Console.WriteLine("");
      int leak = 1;
      Console.WriteLine("Leak potential is: " + leak);
      int v = 0; // electrical potential (voltage)
      int thresh = 8; // Threshold
      int spike = 4;  // Increase in v at spike
      int tNext = 0; // Time when neuron is active
      int latency = 2; // Inactive after spike
      Console.WriteLine("Threshold is: " + thresh);
      Console.WriteLine("Spike is: " + spike);
      Console.WriteLine("Latency time is: " + latency);
      Console.WriteLine("Starting processing\");
      for (int t = 0; t < 16; ++t)
      {
        Console.WriteLine("----------------------");
        Console.Write(" ");
        Console.Write("t = ");
        if (t <= 9) Console.Write(" ");
        Console.Write(t + ". ");
        Console.Write("Inputs = " + inputs[0][t] +
          " " + inputs[1][t] +
          " " + inputs[2][t]);
        if (t != tNext) // Neuron not active
        {
          Console.Write(". Neuron is inactive. ");
          Console.WriteLine("V = " + v);
          output[t] = 0;
        }
        else // Neuron is active
        {
          Console.Write(". Neuron is   active. ");
          int sum = 0;
          for (int j = 0; j < inputs.Length; ++j)
            sum += inputs[j][t] * wts[j];
          v = v + sum;
          v = v - leak;
          if (v < 0)
            v = 0;
          Console.WriteLine("V = " + v);
          if (v >= thresh) // Spike and reset
          {
            v = v + spike;
            Console.WriteLine(" Spiking, V = " + v);
            output[t] = 1;
            v = 0;
            tNext = t + 1 + latency;
          }
          else
          {
            output[t] = 0;
            tNext = t + 1;
          }
        } // Active
      } // t
      Console.WriteLine("----------------------");
      Console.WriteLine("Output spike train = ");
      ShowVector(output, false);
      Console.WriteLine("End spiking neuron demo");
      Console.ReadLine();
    } // Main
    static void ShowVector(int[] vector, bool plus)
    {
      for (int i = 0; i < vector.Length; ++i)
      {
        if (plus == true && vector[i] >= 0)
          Console.Write("+");
        Console.Write(vector[i] + " ");
      }
      Console.WriteLine("");
    }
  } // Program
} // ns

載入文字編輯器中的範本程式碼之後,在 [方案總管] 視窗中我重新命名為 SpikingNeuronProgram.cs 的 Program.cs 檔案並允許 Visual Studio 來重新命名為我的類別程式。上方的原始碼我移除了所有不需要使用陳述式離開只是最上層系統命名空間的參考。

在 Main 方法中的程式碼一開始會設定輸入的資料和輸出值的儲存體緩衝區:

int[][] inputs = new int[3][];
inputs[0] = new int[] { 0, 0, 1, 0, 1, 0, 1, 1,
  1, 1, 0, 0, 1, 0, 1, 1 };
...
int[] output = new int[16];

以下是三個輸入資料流。假造的峰值神經可以容納任何數量的資料流。每個資料流具有 16 0 或 1 的值。輸入的長度是任意的但從程式設計師的觀點來看,您可以將每個展示輸入資料流做為 16 位元不帶正負號的值。

接下來,示範設定定義神經行為的值:

int[] wts = new int[] { 4, -2, 3 };
int leak = 1;
int v = 0; // Electrical potential (voltage)
int thresh = 8; // Needed to fire an output spike
int spike = 4;  // Increase in v at spike event
int tNext = 0; // Next time when neuron is active
int latency = 2; // Number t inactive after spike

請注意 0 和 2 的輸入資料流的加權為正數和因此採取行動來增加電力潛在的神經,但輸入資料流 1 的權數是負數,因此它可減少可能。有時候這些區別 excitatory (增加) 以及 inhibitory (減少) 輸入。

這裡的遺漏值設為 1。要考慮的替代方案是使外洩隨機;也就是隨機改變遺漏值之間,說出、 0 到 3 在每個時間刻度。或者您可以變更要與目前可能成正比的遺漏值。您也可以考慮進行重設延遲時間週期的尖峰隨機值。

所有處理都是由時間驅動迴圈都控制:

for (int t = 0; t < 16; ++t)
{
  // Compute new V
  // Spike if V >= threshold
  // Emit a 0 or 1
}

在時間迴圈中,示範會先檢查神經是否為非使用中:

if (t != tNext) // Neuron is not active
{
  Console.Write(". Neuron is inactive. ");
  Console.WriteLine("V = " + v);
  output[t] = 0;
}
else
{
  // Active
}

變數 tNext 神經都可使用時的下一個時間值。在大部分的情況下 tNext 為 t + 1。非使用中的神經是基本上是進入睡眠狀態,因此沒有電力可能不會變更,而且沒有特殊圖文集可能會發生。在主動神經分支內計算電力的潛在 V:

int sum = 0;
for (int j = 0; j < inputs.Length; ++j)
  sum += inputs[j][t] * wts[j];
v = v + sum;
v = v - leak;
if (v < 0) v = 0;

J 下面是輸入資料流 (0,1,2) 的索引和 t 是時間索引。例如,輸入 [1] [8] 是 0 或 1 值針對輸入資料流 1 在時間 t = 8。找出遺漏減去 V 之後,產生的值會檢查以確定 V 不會傳送負值。不過,在真實的神經電力 potentials 可以事實上是負數,所以要考慮的選項是允許 V 去負數。

若要查看是否應該發生尖峰事件,如所示 V 經過計算後,會檢查其值 [圖 4

[圖 4 檢查是否應該發生尖峰事件

if (v >= thresh) // Spike and reset
{
  v = v + spike;
  Console.WriteLine(" Spiking, V = " + v);
  output[t] = 1;  // Fire
  v = 0;
  tNext = t + 1 + latency;
}
else // No spike
{
  output[t] = 0;
  tNext = t + 1;
}

尖峰事件發生時,V 的目前值會遞增 (藉由在示範 4),並再立即重設為 0。換句話說,暫存刺的 V 的值不是完全。為您要考慮的替代方式是將不會自動重設 V = 0。相反地,您可以重設減去某數從刺 V 值。例如,在時間 t = 6 中示範 V 暫時衝 8 到 12。如果使用的特殊圖文集重設值為 10,然後而不是從 12 重設為 0,神經會重設從 12 為 2。

重點何在?

假造的峰值神經會針對不同用途研究不同群組的人員。Neurobiologists 嘗試建立軟體完全以深入瞭解生物程序複寫的真實神經行為的模型。其實溢位的整合-和-尖峰神經模型是太容易完成更複雜的模型通常會使用複寫的真實神經行為。

假造的峰值神經也做為機器學習分類系統的基礎。雖然未的使用實數值模擬的神經有已經存在數十年的假造的峰值神經網路研究的人為類神經網路探索很多。在我看來,這方面的研究結果是結果不明並不清楚的假造的峰值神經網路是否提供任何優於傳統實數值的人工神經。仍有許多開放研究問題。

最後,人工峰值神經正用於努力建立電腦和程式設計基本上是新的方法。美國Defense Advanced Research Projects Agency (DARPA) 系統的 Neuromorphic 彈性塑膠可擴充性電子產品 (SyNAPSE) 專案的目標是建立可調整成生物層級的電腦。而不是使用傳統的硬體架構,一些初始大有可為設計中採用數十億個互連人工溢位整合和-射擊峰值神經。如果這些努力證明成功,它可能無法建立幾乎 inconceivably 比目前的系統更強大的電腦。


Dr。James McCaffrey Redmond,華盛頓中的 Microsoft Research 的運作方式他曾在包括 Internet Explorer 和 Bing 的數個 Microsoft 產品。Dr.McCaffrey 可以到達 jammc@microsoft.com

感謝以下的微軟技術專家對本文的審閱: Todd Bello 和 Dan Liebling