繆偉偉
(合肥工業大學 計算機與信息學院, 合肥 230601)
深度神經網絡(DNN)中存在大量的矩陣乘法運算。 然而隨著神經網絡層數的不斷增加,利用傳統處理器實現矩陣乘法會造成計算時間過長和能耗過大。 新型器件憶阻器(memristor)為實現矩陣乘法提供了一種更高效的方式[1],能夠以O(1) 的時間復雜度實現矩陣乘法。 并且與傳統的CMOS ASIC 和GPU 解決方案相比,憶阻器陣列可以將能效提高100 倍以上[2-3]。 憶阻器陣列實現矩陣乘法的結構如圖1 所示。

圖1 利用憶阻器陣列實現矩陣乘法Fig. 1 The implementation of matrix multiplication using memristor-based crossbar
圖1 中,憶阻器的電導值gij表示神經網絡的權值,為憶阻器電阻值的倒數。 對憶阻器陣列的第i行施加一個電壓矢量Vi,流經第i行第j列憶阻器的電流為gij·Vi,第j列的輸出電流,即為輸入向量與權值矩陣第j列的乘積結果。
盡管憶阻器具有很好的應用前景,但是由于IR-Drop 問題,會導致憶阻器陣列計算精度下降。IR-Drop 會造成輸入端電壓與實際到達憶阻器的計算電壓之間存在偏差,導致憶阻器的實際輸出偏移理想輸出,憶阻器陣列計算精度降低。 在本文中,將輸入端電壓稱為理想計算電壓,實際到達憶阻器的計算電壓稱為實際計算電壓。 憶阻器離輸入端和輸出端越遠,IR-Drop 造成的理想計算電壓和實際計算電壓的偏差越大,憶阻器的理想輸出電流和實際輸出電流的偏差也越大[4-5]。 并且隨著憶阻器陣列規模的增大,IR-Drop 對憶阻器陣列計算精度的影響也越明顯。 例如,當憶阻器陣列規模從16×16 增大到128×128 時,計算精度降低了35%[5]。
為減輕憶阻器陣列中IR-Drop 的影響,文獻[5]、文獻[6]分別提出主成分分析(Principal Component Analysis, PCA) 和 奇 異 值 分 解(Singular Value Decomposition, SVD)的方法將大矩陣分解為2 個小矩陣的乘積。 通過減小憶阻器陣列規模,降低IRDrop 對憶阻器陣列計算精度的影響。 文獻[7]、文獻[8]分別在憶阻器陣列每列的輸出端添加對應的平均電流偏移量以及調整每列跨阻放大器(TIA)的阻值,以此直接減小列輸出的偏差。 文獻[4]、文獻[9]在網絡訓練中加入憶阻器陣列的IR-Drop 模型,使訓練出的權值對IR-Drop 具有更好的魯棒性。
IR-Drop 會降低憶阻器的實際計算電壓,進而影響憶阻器的輸出結果。 但憶阻器的輸出結果等于憶阻器的實際計算電壓與權值的乘積。 憶阻器的權值越小,IR-Drop 造成的輸出結果偏差也越小。 假設理想計算電壓為1 V,憶阻器的實際計算電壓為0.8 V。當憶阻器權值為5 時,憶阻器的輸出結果偏差則為|1-0.8 |×5 =1。 而當憶阻器權值為1 時,憶阻器的理想輸出結果與實際輸出結果的偏差為|1-0.8 |×1 =0.2。 同時映射到憶阻器的權值越小,憶阻器阻值越大,IR-Drop 對憶阻器實際計算電壓的影響也就越小,造成憶阻器輸出結果偏差也越小[8]。因此,小權值會使憶阻器輸出結果對IR-Drop 有更好的魯棒性。
為減小IR-Drop 對憶阻器陣列計算精度的影響,本文提出了一種基于權值縮減的神經網絡訓練方法(A Network Training Weight Reduction),為敘述方便在后續部分中簡稱為NTWR。 首先,在網絡訓練中添加L2 正則化,以此使訓練出的權值盡可能小,從而提高憶阻器陣列計算精度對IR-Drop 的魯棒性。 然后,本文通過基于行列約束的映射算法將大權值映射到離輸入端和輸出端較近的位置,避免大權值映射到IR-Drop 影響較大的憶阻器上,產生較大的輸出結果偏差。 在確定權值與憶阻器的映射關系后,可能仍存在部分大權值映射到離輸入端和輸出端較遠處的憶阻單元上,導致憶阻器陣列計算精度降低。 最后,減小映射到離輸入端和輸出端較遠處的大權值,再利用重訓練調整附近權值以恢復由于減小權值帶來的計算精度損失。 不斷迭代減小權值和重訓練,直到憶阻器陣列的計算精度無法提升為止。
NTWR 方法的整體流程如圖2 所示。 由圖2 可看到,第一步是在神經網絡訓練中添加L2 正則化,使訓練出的權值分布在較小值的范圍,從而減小IR-Drop對憶阻器陣列計算精度的影響。 第二步是在得到訓練好的網絡權值后,執行行列映射算法將大權值映射到離輸入端和輸出端較近的位置,避免大權值映射到IR-Drop 影響較大的位置,造成較大的計算精度損失。 第三步是在執行映射算法后,減小映射在IR-Drop 影響較大處的權值,以此降低IR-Drop 造成的輸出結果偏差。 再執行重訓練恢復由于權值減小造成的計算精度損失,直到憶阻器陣列計算精度無法提升為止。

圖2 NTWR 的總體流程Fig. 2 The overall process of NTWR
在本節中,將詳細探討L2 正則化在神經網絡權值訓練中的作用。 研究時在訓練中增加L2 正則化,是因為L2 正則化在訓練過程中對大權重具有更大的偏向性, 可以將權重分布縮小到較小的值范圍[10],進而提高憶阻器陣列的計算精度對IR-Drop的魯棒性。因此本文提出在損失函數中增加L2 正則化的懲罰項,利用L2 正則化使訓練出的權值盡可能小,從而降低IR-Drop 的影響。 這里需用到的數學公式為:
其中,W是神經網絡的權值矩陣;λ是正則化參數,用來控制L2 正則化對損失函數的重要性;是L2 正則化的懲罰項。
目前,比較流行的為L1 正則化方法和L2 正則化方法,可分別由如下公式進行描述:
如果在網絡訓練中添加L1 正則化,則會使網絡權值為零,導致訓練出的神經網絡稀疏化。 盡管稀疏化使大部分權值為零,不會對神經網絡的計算精度造成較大的精度損失[11],但會使神經網絡的計算精度對訓練出的非零權值更加敏感。 在IR-Drop 影響下,會造成非零權值的輸出結果出現偏差,對憶阻器陣列計算精度產生更大的影響。 而由文獻[12]分析可知,L2 正則化可以降低神經網絡的敏感性,從而提高神經網絡的魯棒性。 執行神經網絡訓練后,可以得到L2 正則化后的權值矩陣。 下面將對權值矩陣的映射算法進行研究闡述。
在本節中,將詳細介紹基于行列約束的映射算法(Mapping algorithm with the Constraint of Row and Column, MCRC)的具體步驟。 MCRC 算法的主要思想是將權值矩陣中未確定映射關系的最大值在行列約束下映射到離輸入端和輸出端最近的憶阻器上,以此最小化IR-Drop 對憶阻器陣列計算精度的影響。 其中,行列約束指的是權值矩陣同一行和同一列的權值在映射到憶阻器陣列后仍在同一行和同一列。 之所以需要令確定的映射關系滿足行約束,是因為施加在憶阻器陣列一行的理想計算電壓是同一個,而不同行的理想計算電壓是不同的。 例如,若將權值矩陣整個第1 行的權值映射到憶阻器陣列第2行,則只需要在憶阻器陣列第2 行施加權值矩陣第1 行的理想計算電壓V1,權值矩陣第1 行第j列的輸出結果仍為V1× w1j,如圖3(a)所示。 但是若權值矩陣第1 行的w11和w12分別映射到憶阻器陣列第2行和第3 行,則權值矩陣第1 行第2 列的輸出結果不再是V1×w12、而是V3×w12,如圖3(b)所示。 同理,每一列的輸出結果等于該列所有憶阻器的輸出結果之和,如果權值矩陣一列的權值被映射到憶阻器陣列的不同列上,同樣會導致輸出結果出現誤差。 故權值矩陣與憶阻器陣列的映射關系也需要滿足列約束。

圖3 基于行約束映射的舉例Fig. 3 The example of mapping with the constraint of row
憶阻器陣列實現多層神經網絡時,每層憶阻器陣列的輸出都會連接下一層憶阻器陣列的輸入,如圖4 所示。如果調整第n層權值矩陣與憶阻器陣列的映射關系,例如將權值矩陣第i行映射到憶阻器陣列第j行,則原連接到第n層第i行的第n -1 層的輸出也需要重新連接到第n層的第j行。 同理,如果要將第n層權值矩陣第i列映射到憶阻器陣列第j列,則原連接第n層第i列和第j列的第n +1 層的輸入也需要交換連接。 因此,如果想要獨立映射每層權值矩陣的M行或M列,而不改變與相鄰層的連接,則需要使用M × M的路由模塊來連接相鄰層的憶阻器陣列,會帶來較大的硬件開銷[13]。 而MCRC算法是一種對憶阻器陣列通用的映射算法,無需得知憶阻器陣列的相關信息。 因此可以在確定每層權值矩陣與憶阻器陣列的映射關系后再制造憶阻器陣列,在多層神經網絡中無需考慮映射帶來的硬件開銷,只需確定的映射關系滿足行列約束。 故本文提出的MCRC 算法可以同時執行行映射和列映射。

圖4 憶阻器陣列實現多層神經網絡Fig. 4 The implementation of multi-layer neural network using memristor-based crossbar
MCRC 算法的偽代碼具體見算法1。
算法1 MCRC 算法
輸入權值矩陣Wn ×m, 距離矩陣Dn ×m
輸出輸出映射結果
1.Tn ×m =| Wn ×m |,mapped_row[n] 和mapped_col[m] 全部置為-1,occupied[n][m] 全部置為false;
2.While (存在未確定映射關系的權值)
3. 在當前Tn ×m中找到最大值,將其行序號和列序號分別賦給row,col
4.visited[n][m]=occupied[n][m]
/ /將occupied數組中的信息復制到visited數組中
5.While(true)
6. 在當前Dn ×m找到visited[i][j]=false的最小值,將其行序號和列序號分別賦給i,j
7.If( (mapped_row[i]=-1or mapped_row[i]=row)and(mapped_col[i]= -1or mapped_col[j]=col))
/
/判斷是否滿足行列約束
8.mapped_row[i]=row,mapped_col[j]=col;
/
/將確定的映射關系存儲到數組中
9.occupied[i][j]= true,T[row][col]=-1;
/ /更新狀態
10.break;/ /跳出當前while循環
11.End
12.visited[i][j]=true;
/
/標記當前位置被訪問
13. End
14.End
15.輸出映射結果
在算法中,輸入為權值矩陣Wn ×m和距離矩陣Dn ×m。 距離矩陣第i行第j列的元素Dij表示憶阻器陣列第i行第j列的憶阻器離輸入端和輸出端的距離。 以離輸入端和輸出端最近的憶阻器為原點,字線為橫坐標,位線為縱坐標,建立坐標軸,如圖5 所示。 以橫坐標和縱坐標之和表示憶阻器離輸入端和輸出端的距離,如Dij =i +j。

圖5 在憶阻器陣列上建立坐標軸Fig. 5 The coordinate system based on memristor-based crossbar
算法1 中,偽代碼的第1 行,對矩陣Tn ×m、數組mapped_row、mapped_col和occupied進行初始化。Tn ×m為Wn ×m的絕對值矩陣,其中Tij =|Wij |。 數組mapped_row和mapped_col分別用于存儲確定的行映射關系和列映射關系。 數組occupied用于標記憶阻器陣列中憶阻器是否已確定映射關系,occupied[i][j]=true表示憶阻器陣列第i行第j列的憶阻器已確定映射關系。
下面通過具體的例子來闡釋基于MCRC 算法的具體執行過程。假設矩陣Tn ×m、距離矩陣Dn ×m和數組occupied分別為、D3×3和。 研究推得的各矩陣值具體如下:
算法1 偽代碼第3 ~4 行, 按照Tn ×m中值大小降序確定權值的映射關系,令row和col分別為Tn ×m中最大值的行序號和列序號。 利用數組visited標記憶阻器是否被訪問過或已確定重映射關系。 例如在中,最大值為T22=1,row=2,col=2。
算法1 偽代碼第6 行,按照離輸入端和輸出端的距離升序選擇能在行列約束下與權值確定映射關系的憶阻器,令i和j分別為Dn ×m中visited[i][j]=false的最小值的行序號和列序號。 例如在當前D3×3中visited[i][j]=false的最小值為D00,i和j均為0。
算法1 偽代碼第7~11 行,判斷權值矩陣第row行第col列權值映射到憶阻器陣列第i行第j列憶阻器是否滿足行列約束。 如果滿足行列約束,則保存確定的映射關系,更新相應狀態。 例如在當前中,mapped_row[0] 和mapped_col[0] 均為-1,即憶阻器陣列第0 行和第0 列都未確定映射關系。 因此,權值矩陣第2 行第2 列的權值與憶阻器陣列第0行第0 列確定映射關系。mapped_row[0]= 2,mapped_col[0]=2,和分別更新為和, 跳出當前while 循環。 研究推得的各矩陣值具體如下:
算法1 偽代碼第2 ~14 行,若還存在未確定映射關系的權值,則繼續執行算法。 如中仍存在未確定映射關系的權值,因此繼續執行算法。 在中,最大值為T21=0.9,row=2,col=1。 將的信息復制到數組visited中。 在當前D3×3中visited[i][j]=false的最小值為D10,i=1,j=0。 因mapped_col[0]=2 且mapped_col[0] ≠1,即憶阻器陣列第0 列已經確定映射關系,且并不是權值矩陣第1 列確定的映射關系,因此不滿足行列約束。 將visited[1][0] 置為true,繼續尋找當前D3×3中visited[i][j]=false的最小值。 此時滿足條件的最小值為D01,i=0,j=1。mapped_row[0]≠1但mapped_row[0]=2,并且mapped_col[1]=-1,滿足行列約束。 因此,權值矩陣第2 行第1 列的權值與憶阻器陣列第0 行第1 列確定映射關系。mapped_row[0]=2,mapped_col[1]=1,和分別更新為和,跳出當前while循環。 由于在中仍有未確定映射關系的權值,因此繼續根據上述步驟執行算法,直到所有權值確定映射關系。 研究推得的各矩陣值具體如下:
算法1 偽代碼第15 行,當Tn ×m中所有值確定映射關系后,輸出映射結果。 如對繼續執行算法,可以得到映射后的T3×3為。 推得的矩陣值具體如下:
盡管利用MCRC 算法可以盡可能避免大權值映射到離輸入端和輸出端較遠的憶阻器上,但大權值若聚集于一行或一列,則無法避免地會有部分較大權值被映射到離輸入端和輸出端較遠的憶阻器上,導致憶阻器陣列計算精度的下降。 因此,本文提出一種重訓練算法,通過減小映射到離輸入端和輸出端較遠處的權值,降低IR-Drop 對輸出結果的影響。 再通過重訓練,恢復權值減小造成的計算精度損失。 重訓練算法的偽代碼具體見算法2。
算法2 重訓練算法
輸入映射后的權值矩陣, 距離矩陣Dn ×m, 偏差矩陣, IR - Drop 影響矩陣Sn×m
輸出輸出新的權值矩陣
1.While (憶阻器陣列計算精度仍可提升)
2. 初始化Modified[n][m],全部置為false
/
/用于標記修改過的權值
3. 在當前Sn ×m中找到最大值,將對應的權值賦給Wij
4.Wij =Wij /2/ /減小權值
5.Modified[i][j]=true
/
/將權值進行標記,重訓練中不更新該權值
7. 測試重訓練后憶阻器陣列的計算精度
8. 重新計算Sn×m
9. End
算法2 偽代碼第2 ~4 行是迭代將IR-Drop 影響最大的權值減小為原來的1/2,再通過標記該權值,使其在后續重訓練中不更新。 由于減小權值會造成計算精度的降低,因此通過重訓練來恢復計算精度,參見偽代碼第6 行。 在重訓練時,為避免權值出現較大變化,造成映射到離輸入端和輸出端較遠處的小權值突然更新為大權值的情況,可以以較小的學習率訓練神經網絡。 較小的學習率可以使權值以小細粒度進行調整,避免權值出現較大的變化[14]。 偽代碼第7 行測試重訓練后憶阻器陣列的計算精度,更新矩陣Sn×m。 如果相較于重訓練前,憶阻器陣列計算精度有所提升,則繼續執行算法。如果憶阻器陣列的計算精度無法繼續提升,則結束算法,輸出映射后的權值矩陣。
為了驗證NTWR 算法的有效性,在2 個數據集上進行了實驗。 首先,在Pytorch 上構建了一個4 層卷積神經網絡,采用MINST 數據集對其進行測試,輸入圖像的大小為28×28,由3 個卷積層和1 個全連接層組成。 然后,在Pytorch 上構建了LeNet,采用CIFAR-10 數據集進行測試,即由2 個卷積層、3 個全連接層組成。 憶阻器的電阻范圍為10 kΩ ~1 MΩ,憶阻器陣列中憶阻單元之間的導線電阻為2.5 Ω,參數配置見表1。

表1 實驗參數設置Tab. 1 Experimental parameters setup
圖6 為MINST 數據集上的4 層卷積神經網絡未添加L2 正則化和添加L2 正則化的權值分布圖。從圖6 中可以明顯看出,與不添加L2 正則化相比,添加L2 正則化可以將權值分布約束在一個較小值的范圍內。 圖7 為只考慮未添加L2 正則化和添加L2 正則化的憶阻器陣列計算精度對比圖。 從圖7 中可以看出, 添加L2 正則化后, MINST 數據集和CIFAR-10 下憶阻器陣列的計算精度可以分別提升15.30%和11.40%。可以得出相較于未添加L2 正則化,添加L2 正則化雖然會有部分計算精度損失,但是訓練出的權值對IR-Drop 的魯棒性有顯著提高。

圖6 MINST 數據集上未添加L2 正則化和添加L2 正則化的權值分布圖Fig. 6 The weight distribution with and without L2 regularization on MINST
圖8 為在MINST 和CIFAR 數據集下執行NTWR方法前后的計算精度對比圖。 從圖8 中可以看出執行MCRC 算法和重訓練后,可以明顯提高憶阻器陣列的計算精度。 在MINST 和CIFAR 數據集下,執行NTWR 方法可以分別使憶阻器陣列的計算精度接近理想水平,計算精度損失分別小于1%和3%。

圖8 執行NTWR 方法的計算精度對比圖Fig. 8 The accuracy comparison of memristor-based crossbar with NTWR
本文提出了一種基于權值縮減的神經網絡訓練方法,以此減小IR-Drop 造成的計算精度損失。 首先,通過L2 正則化,將權值盡可能訓練為較小值,以此減輕IR-Drop 對憶阻器輸出結果的影響。 然后,執行基于行列約束的映射算法,將大權值盡可能映射到離輸入端和輸出端較近的憶阻器上,避免IRDrop 產生較大的輸出結果偏差。 最后,減小映射到離輸入端和輸出端較遠處的大權值,再利用重訓練恢復權值減小造成的計算精度損失。 實驗結果顯示,本文所提方法最多可以將憶阻器陣列計算精度恢復到接近理想狀態,計算精度損失小于1%。