# 測試運行 - 借助人工尖峰神經元進行計算
通過?[James McCaffrey](https://msdn.microsoft.com/zh-cn/magazine/mt149362?author=James+McCaffrey)?| 2015 年 9 月 |獲取的代碼:?[C#](http://download.microsoft.com/download/F/A/B/FABA846E-7E6A-499F-AC79-931F1E4EACA3/Code_McCaffrey.TestRun.0915.zip)[VB](http://download.microsoft.com/download/F/A/B/FABA846E-7E6A-499F-AC79-931F1E4EACA3/VBCode_McCaffrey.TestRun.0915.zip)

計算機科學領域的迫切地區域計算與人工峰值狀態神經元 — 模型生物神經元的行為的小型軟件組件。人工峰值狀態神經元是相關,又與常見的軟件神經網絡中人工神經元完全不同。
讓我事先人工峰值狀態的神經元的這種討論不可能將立即有益于正常的日常編程任務權限聲明。這將有助于您深入了解計算的未來可能是 like、 但您可能覺得人工峰值狀態神經元有趣憑其自身。
若要獲得有個大概了解是哪些峰值狀態的神經元以及請參閱本文所述觀點的最佳方法是看一下在演示程序圖 1。
?
圖 1 人工峰值神經元演示的數量
該演示程序顯示單個峰值狀態不同,神經元的輸入和輸出值。有三個輸入的流,有時也稱為峰值火車。
每個輸入的峰值火車了 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 值從其他峰值狀態的神經元表示隨著時間的推移的輸入。換而言之,在時間 t = 0 時,從第一個峰值定型的輸入的值為 0 ;在時間 t = 1,輸入是 0;t 處 = 2,輸入為 1 ;等到 t = 15 時輸入的值為 1。
在時間 t = 0,峰值狀態的神經元接收來自所有三個流的輸入,因此在 t = 0 時,完整的輸入神經元是 (0,1,1);在時間 t = 1,輸入是 (0,0,1);等到 t = 15 在輸入 (1,1,1) 時。
演示程序的下一部分顯示定義的行為的神經元的數值常量。有三個具有與每個輸入火車相對應的值 (4,-2,3) 的權重。(2) 將稍后說明泄漏潛在 (1)、 (8) 中的閾值可能性、 峰值可能 (4) 和后的峰值延遲的含義。在峰值神經元的數量的上下文中,術語"可能"是指 (松散) 電氣電壓而不是"可能"即將。"
演示程序雖模擬 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。有許多不同變體峰值神經元的數量。演示程序雖取決于調用存在泄漏的集成火災峰值狀態神經元的模型。
?
圖 2 滲漏集成火災蜂值神經元行為
神經元的階梯電勢往往會隨著時間推移而增加。V 滿足或超過為 8,由虛線,指示的峰值狀態閾值時 V 值的可立即峰值 4 (峰值潛在) 上移,然后立即重置為 0。峰值狀態事件發生在時間 t = 6 和 t = 13。如果發生峰值狀態的事件,向輸出峰值火車開,否則為 0,將發出發出一個 1。
因此,只需計算的方法 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
~~~
模板代碼加載到文本編輯器中之后,在解決方案資源管理器窗口中我將文件 Program.cs 重命名為 SpikingNeuronProgram.cs 并允許重命名類 Program 為我的 Visual Studio。我刪除了源代碼頂部所有不需要使用語句,離開只對頂級 System 命名空間的引用。
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] 是時間 t 處的輸入流 1 的 0 或 1 值 = 8。泄漏減去 V 后,所得到的值被檢查以確保不會負 V。但是,在實際神經元電氣潛力實際上能為負,因此,可以考慮選擇是允許 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;
}
~~~
當峰值事件發生時,會遞增 (通過在演示中的 4) V 的當前值并將其然后立即重置為 0。換而言之,未在所有使用 V 的臨時錐的值。要考慮的替代方法是將不會自動重置為 V = 0。相反,您可以通過減去一定的量錐 V 值重置。例如,在時間 t = 6 在演示中,V 臨時峰值從 8 到 12。如果您然后使用峰值重置值為 10,而不是從 12 重置為 0,神經元會重置從 12 為 2 上。
## 有什么用呢?
人工峰值狀態神經元是研究中,對不同組的人員用于不同的用途。Neurobiologists 嘗試創建完全為了深入了解生物進程復制實際的神經元的行為的軟件模型。事實證明存在泄漏集成峰值神經元模型是非常簡單,并完全復制實際神經元的行為更常用于復雜的模型。
人工峰值狀態神經元還充當機器學習分類系統的基礎。雖然從來沒有使用幾十年來,人工峰值狀態的神經元的網絡學習了實際值模擬的神經元的人工神經網絡探討了很多。在我看來,在這一領域的研究結果不是最終并不清楚的人工峰值狀態的神經元的網絡是否提供任何優于傳統實際值的人工神經元。仍有許多開放研究問題。
最后,人工峰值狀態神經元正在用于在工作中創建一種全新方式實現計算機和編程。美國防御高級研究項目局系統的 Neuromorphic 自適應塑料可伸縮電子設備 (SyNAPSE) 項目的目標是創建可以擴展到生物級別的計算機。而不被使用傳統的硬件體系結構,一些很有前景的初始設計已使用幾十億張的互連人工滲漏集成火災峰值狀態神經元。如果這些工作證明成功后,它可能可以創建幾乎 inconceivably 比當前的系統功能更加強大的計算機。
* * *
Dr.James McCaffrey?*供職于華盛頓地區雷蒙德市沃什灣的 Microsoft Research。他參與過多個 Microsoft 產品的工作,包括 Internet Explorer 和 Bing。Scripto可通過?[jammc@microsoft.com](mailto:jammc@microsoft.com)?與 McCaffrey 取得聯系。*
- 介紹
- 云連接移動應用 - 借助身份驗證和離線支持構建 Xamarin 應用
- 崛起 - 自由 Internet 廣播
- Microsoft Azure - 云中的容錯問題和解決方法
- 最前沿 - 適合常見應用程序的事件源
- Azure 深入了解 - 跨云平臺創建統一的 Heroku 式工作流
- 借助 C++ 進行 Windows 開發 - Windows 運行時中的高級類型
- 編譯器優化 - 借助按本機配置優化來簡化代碼
- 數據點 - 再探 JavaScript 數據綁定(現在包含 Aurelia)
- 云安全 - 借助 Azure 密鑰保管庫保護敏感信息的安全
- 測試運行 - 借助人工尖峰神經元進行計算
- 開發運營 - 在 Microsoft 堆棧上啟用開發運營
- 孜孜不倦的程序員 - 如何成為 MEAN: Node.js
- 新型應用 - 提升新型應用的易用性的做法
- 別讓我打開話匣子 - Darwin 的照相機
- 編輯寄語 - 汽車 Internet 發生故障