Learning both Weights and Connections for Efficient Neural Networks 論文進一步的實驗與思考

Learning both Weights and Connections for Efficient Neural Networks 論文進一步的實驗與思考

上一篇文章我實驗了net-300-100網絡去識別手寫數字體,通過剪枝發現,每一次的激活神經元個數沒有明顯的變化,而且每次都要激活50%左右,同時淺層的權重可以被大量的剪枝掉,最後只剩下300多個,下面我們就做一個實驗,把第一層的個數增加到600個神經元,看看相應的實驗結果

net-600-100 實驗

下面就是基於以上的代碼,使用手寫數字體的數據集進行的實驗,我會記錄實驗過程中的數據變化過程。

初次訓練網絡

在這裏插入圖片描述
比net-300-100強了一丟丟,幾乎可以忽略不計。

神經元激活

從上圖可以看出,經過20次的迭代,網絡的正確率已經到達了97%
對於數字6的圖像進行識別,圖像的非零點數是155個,第一層神經元激活個數303,第二層神經元激活個數76,識別結果是6正確

層數 個數
fc1 303
fc2 76
fc3 結果是6

通過這個數據,可以看出第一層網絡好像激活的概率大概在50%左右。

爲了證實這個想法,我再做一個net-1200-100 的實驗。

正確的個數到了9749個,確實又有了一丟丟的進步,
對於數字6的圖像進行識別,圖像的非零點數是155個,第一層神經元激活個數623,第二層神經元激活個數77,識別結果是6正確

層數 個數
fc1 623
fc2 77
fc3 結果是6

進一步印證了我的想法。下面我再試一個小的網絡做一個對比,更有說服力。

爲了證實這個想法,我再做一個net-150-100 的實驗。

正確的個數到了9697個,確實是最差的那一個,但是其實結果並沒有差很多。
對於數字6的圖像進行識別,圖像的非零點數是155個,第一層神經元激活個數78,第二層神經元激活個數74,識別結果是6正確
這個明顯說明50%左右的激活率是沒有毛病的,其實這個結果也可以解釋,因爲我用的RELU的激活函數,激活和不激活是以0爲界的,就是隨機的將數據切分爲兩部分,按照隨機的來說,就是應該激活一半的神經元。

層數 個數
fc1 78
fc2 74
fc3 結果是6

在這裏插入圖片描述

第一層權重的深度分佈圖

在這裏插入圖片描述

權重柱狀圖

下圖是全部參數的柱狀圖、第一層參數的柱狀圖、第二層參數的柱狀圖、第三層參數的柱狀圖,可以看出參數都基本集中的0附近,成中心分佈的樣子。其實這個參數的分佈並沒有太大的差異,下面就進行剪枝操作。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述

剪枝99.5

經過非常多次剪枝99.5%然後參數再訓練,整個網絡的性能還是會慢慢提升的
計算出來的閾值是:0.013283501705269006
在這裏插入圖片描述
在這裏插入圖片描述

層數 個數
fc1 78
fc2 71
fc3 1

下圖是全部參數的柱狀圖、第一層參數的柱狀圖、第二層參數的柱狀圖、第三層參數的柱狀圖,可以看出參數都基本集中的0附近,成中心分佈的樣子。其實這個參數的分佈並沒有太大的差異,下面就進行剪枝操作。
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

此時,一共有2657個神經元,第一層652個,第二層1433個,第三層572個

通過上面的數據,和第一次的進行對比,我這裏做到了兩次剪枝之後的權重的個數都是2657個,總數是一樣的,但是兩次網絡的正確率還是差別很大的,net-300-100的正確率只有65%而net-600-100卻做到了89%的正確率,要說網絡中真正多出來的東西,那就是多了300個激活函數,說明網絡中激活函數,對整個網絡的影響還是很大的。
然後再看第一層神經元是652個,net-300-100剪枝後的神經元是300個,這裏發現,其實第一層的權重差不多就是輸入層神經元的個數。也說明了從淺層中提取出了更多的特徵。下次可以做一個實驗,通過增加net-300-100中把100變成200,看看剪枝後的正確率是否有提高。

net-300-200 實驗

下面就是基於以上的代碼,使用手寫數字體的數據集進行的實驗,我會記錄實驗過程中的數據變化過程。

初次訓練網絡

在這裏插入圖片描述
比net-300-100強了一丟丟,幾乎可以忽略不計。

神經元激活

在這裏插入圖片描述
從上圖可以看出,經過20次的迭代,網絡的正確率已經到達了97%
對於數字6的圖像進行識別,圖像的非零點數是155個,第一層神經元激活個數303,第二層神經元激活個數76,識別結果是6正確

層數 個數
fc1 190
fc2 137
fc3 結果是6

剪枝99.104

經過非常多次剪枝99.5%然後參數再訓練,整個網絡的性能還是會慢慢提升的
計算出來的閾值是:0.012800342721641052
在這裏插入圖片描述
這驚訝的正確率,此時的權重數量是一樣的,但是正確率確實飆升。
在這裏插入圖片描述
在這裏插入圖片描述

層數 個數
fc1 49
fc2 98
fc3 6

下圖是全部參數的柱狀圖、第一層參數的柱狀圖、第二層參數的柱狀圖、第三層參數的柱狀圖,可以看出參數都基本集中的0附近,成中心分佈的樣子。其實這個參數的分佈並沒有太大的差異,下面就進行剪枝操作。
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

此時,一共有2663個神經元,第一層1102個,第二層835個,第三層725個

通過上面的數據,前兩次進行對比,權重的個數都是2663個左右,總數是一樣的,但是網絡的正確率還是差別很大的,net-300-100的正確率只有65%而net-600-100卻做到了89%的正確率,而net-300-200卻做到了96%的正確率,這次網絡中激活函數的增加還沒有net-600-100增加的多,但是卻達到了最高的正確率。
再看權重的分佈情況,此時雖然增加的是第二層網絡的個數,但是第一層的參數卻增加了很多,同時第二層的參數減少了。這種變化像是,參數在各層之間進行了均等。
其實我認爲,非線性激活函數的存在,可以相當於很多權重,由泰勒展開定理我們可以知道,函數都可以用無數個簡單的函數來表示,所以多了激活函數後,增加了第二層的表達能力,就不需要很多參數來擬合這些非線性,所以可以節約下來參數給第一層,提取出更多的特徵值。但是剛剛的激活神經元個數可以看出,僅僅激活了49個第一層的神經元,卻達到了很高的正確率。可能特徵的多少不太重要,特徵的精細度對識別的影響較大。
還有一個神奇的現象就是,我把第二層激活函數去掉,好像整個正確率不會有很大的改變,第二層的激活函數像是一個擺設一樣,這也很令我費解,既然增加了第二層的神經元,正確率上升很多,但是激活函數好像有不太重要,跟我的分析產生了一些矛盾。不過經過思考好像也是可以解釋的,可能對結果的正確性的確定是和特徵有關的,我們100箇中間層時,輸出結果時不管輸入多少特徵,決策的特徵只有100個,而變成200的時候,決策的特徵就有200個翻了兩倍,所以正確率會飆升。然後再討論激活函數的問題,因爲我用的relu的激活函數,本來就是線性的,激活的數值是不會有變化的,同時我們訓練的過程中是強化跟特徵有關的權重,所以和解無關的特徵對應的權重基本被我們設置爲0了,所以這個數值激活不激活對我們的結果其實影響不太大。這樣解釋,就可以解釋上面的問題了。
那下面就可以實驗net-300-300了,來看一看實驗結果是怎麼樣的。

net-300-300 實驗

一直按上面實驗,其實結果是大同小異的,300-300的網絡在同樣的參數量的情況下是可以做到96%的正確率的。但是這其中是因爲,我做實驗過程中出現了一個失誤,這個失誤也出現在了300-200網絡中,所以300-200網絡的正確率纔會飆升。

實驗過程中出現了重大的問題

由於論文中指出,權重小的權重相對於不重要,所以可以刪除掉而不影響準確率。但是這似乎是有些問題了,我在實驗中多剪去了一些權重,所以多出來了很多零權重,然後把零權重訓練,之後的網絡正確率瞬間就上來了,在達到同樣的正確率的情況下,這種訓練的網絡可以減少更多的權重,以我用300-300的實驗爲例,我把權重剪枝到99.5也就是權重只剩下1641個,比當初的網絡權重快少一半了,但是正確率仍然是96%。在同樣的正確率下,用這種訓練一些小權重的方法,可以大大減少權重的數量。這也從側面說明一些問題,好像並不是說小的權重就不重要,我們整個網絡中還是需要有大有小的權重的。
還有一個重要的問題,就是最有一層的隱藏層的激活函數可以去掉,對輸出結果其實並沒有很大的影響,但是第一層的隱藏層的激活函授去掉之後網絡的正確率就爛掉了。

剪枝99.5

經過非常多次剪枝99.5%然後參數再訓練,整個網絡的性能還是會慢慢提升的
計算出來的閾值是:0.012652947250753777
在這裏插入圖片描述
這驚訝的正確率,此時的權重數量其實很少了,但是正確率沒有變化。
在這裏插入圖片描述
在這裏插入圖片描述

層數 個數
fc1 22
fc2 47
fc3 7

此時就激活很好的神經元,卻仍然以很高的正確率把數字識別成功。
下圖是全部參數的柱狀圖、第一層參數的柱狀圖、第二層參數的柱狀圖、第三層參數的柱狀圖,可以看出參數都基本集中的0附近,成中心分佈的樣子。其實這個參數的分佈並沒有太大的差異,下面就進行剪枝操作。
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
此時,一共有1641個神經元,第一層1043個,第二層268個,第三層330個
從這個每層的神經元個數中,或許我們也可以看出一些問題來,因爲後面層的權重較大,如果剪枝是按全部的百分比進行剪枝的話,大量的淺層的權重就會被剪枝掉,但是其實那些權重其實是有用的,或許權重較小的或許真的不重要,只是我們的剪枝方式有問題,導致一些不重要的權重變大,然後就一直無法被剪掉,從而搶佔了有用權重的位置。
用了這種方法,就連300-100在剪枝99%時的正確率也是96%,這就是這麼的神奇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章