二值神經網絡的介紹說明

導讀 每年都會開發出更深的模型來執行各種任務 例如對象檢測 圖像分割等 這些任務始終能夠擊敗最新模型。但是 人們越來越關注使模型更輕便

每年都會開發出更深的模型來執行各種任務 例如對象檢測 圖像分割等 這些任務始終能夠擊敗最新模型。但是 人們越來越關注使模型更輕便 更高效 以便它們可以在邊緣設備和移動設備上運行。這對于彌合機器學習的研究和生產價值之間的差距非常重要。

減少深度神經網絡的內存和計算成本的一種方法是二值神經網絡的概念。二值神經網絡的概念非常簡單 其中權重和激活張量的每個值都使用+1和-1表示 以便它們可以以1字節而不是全精度存儲(在1-中表示為0 位整數)。使用以下所示的符號函數將浮點值轉換為二進制值-

現在 使用閾值函數作為上述函數的一個主要問題是該函數的梯度趨于為零。一種解決方案是使用直通估算器。直通估算器是一種在梯度傳遞過程中完全照原樣通過漸變而不會發生任何變化的估計器。這簡化了二值神經網絡中閾值函數的反向傳播機制 并顯示出很好的效果。

在梯度累積階段 將使用二進制權重和激活來累積每一層的梯度。但是權重更新是對實值原始權重進行的。為什么會這樣呢?讓我舉例說明。

我們在神經網絡中有一個值為0.05的節點(原始參數)。

通過閾值函數傳遞此值后 我們獲得的值為1(二進制參數)。

讓我們假設在二進制參數處累積的梯度為3。我們使用直通估計器的概念將其照原樣傳遞給原始參數。

現在 一旦累積了漸變 我們就可以更新值。

如果我們使用二進制值獲得新的參數值 則參數的新值將為10.1 * 3(其中0.1是學習率) 即0.7。

如果我們使用原始參數值來獲取新參數 則新值將為0.050.1 * 3 即-0.25。

這是可以注意到差異的地方。當我們執行下一個迭代時 我們將再次通過二進制閾值函數傳遞新的參數值 它們將給出不同的結果。如果我們繼續使用參數的二進制值 則可能永遠無法更改該位 因為始終會根據1或-1計算損耗。

當更新參數值時 這些值將被裁剪為介于-1和1之間。主要原因是這些值只會增加/減少 否則對網絡沒有任何影響。需要注意的一件事是 最后一個激活層中的值未進行二值化 而是按原樣用于分類/回歸。這些是二值神經網絡的基本概念。

可以添加到權重和激活層二值化的另一個改進是使用縮放因子來表示權重和激活。在這里 比例因子只是權重向量中所有值的平均值的絕對值。如果我們有一個2 * 2矩陣 其值[[0.2 0.2] [-0.6 -0.6]] 則比例因子α將為0.2 二進制矩陣表示為[[1 1] [-1 - 1]]。

因此 一旦權重和激活連同它們各自的縮放因子一起以二進制形式表示 就可以使用以下公式表示。在此 I和W分別表示激活層和權重層 而激活和權重的縮放因子分別使用κ和α表示。

現在 作為卷積運算基礎的乘積(MAC)函數是非常昂貴的運算。現在 可以將其替換為XNOR + 彈出計數操作。 幾乎每個CPU都固有地執行按位運算 并且這些運算的執行速度明顯更快且成本更低。彈出計數操作只不過是檢查設置的位。下面的示例顯示了MAC操作可以由XNOR + 彈出計數操作代替。

但是二值神經網絡的主要缺點在于 它們無法實現與完全精度的深層網絡一樣高的精度。但這一直在緩慢地變化 并且每年(與每月發表論文的數量越來越相似) 隨著差距的縮小 已經有了很多進步。由于人們越來越關注在具有有限計算資源的設備上實施機器學習模型 因此在未來幾年中 將會在該領域進行更多的研究。責任編輯:YYX

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!