能夠參加開源項目是一個機緣巧合,當時我正好在做ANN轉換SNN的研究。有一次開會的時候,老師突然說,要不你把你現在的工程實踐整理一下,放到師兄們開發的開源項目里面。當時我正好在寫相關的代碼,因為實驗不成功,代碼已經改版兩次了。所以毫不猶豫地,我就接下了這個活,因為我知道要是做好了這個模塊,就不需要重復造輪子了。之前其實也有相關的ANN轉SNN的代碼。在GitHub上有一個叫做NeuromorphicProcessorProject
/snn_toolbox的項目。但是這個項目更多地是面向神經形態硬件的,代碼也沒有PyTorch版本,主框架是拿keras寫的。這就更加給了我開發的動力。其次,我覺得我們作為新一代研究者是有義務去推廣脈沖神經網絡的。人工神經網絡(ANN)就不用說了,大家都很熟悉。而SNN則是脈沖神經網絡(”所謂的第三代神經網絡”),在現在的人工智能語境中其實沒有那么受到重視。但是它有很多好的特性沒有被大家注意到,比如說脈沖神經網絡相比于GPU運行沒有那么耗能源,而且在理論上的性能也是能夠等同圖靈機的。
ANN轉換SNN的研究能夠給深度學習和脈沖神經網絡架起一座橋梁,我覺得這是一件特別有意思的東西。在師兄們開發好的框架上,我需要的就是利用現有的神經元模型,構建SNN,并且完成轉換的SNN的仿真工作。SpikingJelly中的神經元模型,其實特別好用,我一直都是用PyTorch的,SpikingJelly的神經元定義,就和在PyTorch中定義ReLU一樣,特別順滑。如果需要對神經元進行重置,也只需要調用resnet_net就好,特別方便。
盡管如此,開發過程中也走了挺多彎路。因為ANN-SNN轉換需要知道底層的PyTorch拓撲(類似ResNet這樣的),最重要的就是選擇一個合適的方式來處理PyTorch模型中的復雜拓撲。關于處理拓撲的方案其實選擇了很久。最終,選擇了基于另一個開源項目,ONNX。PyTorch中有實現接口可以無縫轉換到ONNX模型。而且ONNX作為一個通用公用的模型表示方式可以使得今后其他框架的模型通過轉換為onnx表示之后也可以通過我們的框架轉換。這就使得我們的代碼在未來可以發揮更加廣泛的作用。
自從框架開源后,我們的貢獻得到了更多人的關注。我想這就是開源的意義所在吧。尤其我們的定位是科研。這意味著更多研究脈沖神經網絡的科研院所可以通過我們的工作、通過ANN-SNN轉換的工作得到收獲。ANN-SNN轉換在SNN今后的研究中,可能更多地是一個baseline的存在,即便這樣,我想能夠做好這一件事情也是我們的榮幸。
作者:丁健豪