我從一個神經網絡中移除了74%的神經元。 這僅使準確率下降了0.50%。 以下是詳細資訊(附帶代碼):
訓練過的神經網絡總是有一些神經元對性能沒有實質性的貢獻。 但它們仍然消耗內存。 這些可以被移除,而不會顯著影響準確性。 讓我們看看如何識別它們!
以下是步驟: 步驟 1) 照常訓練神經網絡。 步驟 2) 將驗證集通過訓練好的網絡,對於隱藏層中的每個神經元,計算: - 平均激活值 - 激活值的方差(如果激活值可以是負的) 檢查這個👇
步驟 3) 剪除激活均值和方差接近零的神經元,因為它們對模型輸出影響不大。 理想情況下,繪製在幾個剪枝閾值下的性能,以選擇適合您大小與準確性權衡的模型。 查看這個 👇
讓我們來看看代碼。 我們首先定義一個簡單的神經網絡並對其進行訓練。 由於我們稍後將計算神經元級別的激活以進行剪枝,因此在前向傳播中返回所有中間激活。 查看這個👇
接下來,我們定義兩個包含三個元素的列表: - 一個將存儲激活的均值 - 另一個將存儲激活的標準差 我們將驗證集通過我們的模型,以計算每個隱藏層的這些統計數據。 查看這個 👇
在這個階段,讓我們創建一個神經元級統計的分佈圖,如上所生成的。 如下面所示,大多數神經元的平均激活值及其標準差都重度分佈在接近零的值附近。 接下來讓我們嘗試修剪它們。
對於修剪,我們遍歷一個閾值列表並: - 創建一個新網絡並轉移通過閾值的權重。 - 評估新網絡並計算總參數。 - 將結果附加到列表中。 查看這個 👇
此表比較了修剪模型在幾個閾值下相對於原始模型的準確性和大小減少。 在 mean=0.1 和 std-dev=0.4 時: - 模型的準確性下降了 0.08%。 - 模型的大小減少了 62%。 這是一個巨大的減少。 查看這個 👇
這是另一個有趣的結果。 在 mean=0.5 和 std-dev=1 的情況下: - 模型的準確率下降了 0.5%。 - 模型的大小減少了 74%。 所以基本上,我們可以用四分之一的參數獲得幾乎相似的性能。 查看這個 👇
當然,準確性和大小之間存在權衡。隨著我們減小大小,準確性會下降(查看視頻)。 但在大多數情況下,準確性並不是我們優化的唯一指標。 相反,效率、內存等幾個操作指標才是關鍵因素。
48.63K