?

基于損失變化的CNN混合精度量化方法

2024-02-22 07:45何益智李鑒柏張少爽劉文龍
計算機工程與設計 2024年2期
關鍵詞:敏感度損失準確率

何益智,李 釗+,李鑒柏,張少爽,劉文龍

(1.山東理工大學 計算機科學與技術學院,山東 淄博 255000;2.淄博職業學院 電子電氣工程學院,山東 淄博 255000)

0 引 言

邊緣計算由于其低延遲、低成本、低功耗、隱私保護等優點在近年被廣泛研究。然而,許多CNN模型因為其較高的計算成本和內存占用,減緩了模型推理和訓練速度[1],限制了它們在邊緣設備上的應用。因此,研究人員提出了許多CNN模型的壓縮方法。

Howard等[2]提出了一種輕量級CNN模型Mobilenet-V3采用深度可分離卷積代替傳統的卷積計算,極大地降低了參數數量。He等[3]提出一種基于卷積核范數的卷積核剪枝方法,刪除可以被替代的網絡層,降低模型中的冗余度。另外,還提出了許多量化方法,在文獻[4]中表明,CNN模型中參數可以被量化為低位寬定點數,代替32位浮點數運算,節約硬件資源,提高運算速度,便于部署在FPGA(field programmable gate array)等移動平臺。Liu等[5,6]提出超低位寬量化方法,將權重和激活值量化到1或-1。然而在超低位寬的情況下使用統一的量化位寬會嚴重影響模型的性能,解決這個問題的一個非常有效的方法是通過混合精度量化。已有工作使用的強化學習[7]或者可微分搜索混合精度量化[8]允許神經網絡的每一層擁有不同的量化位寬,在很大程度上保證模型的推理準確率,但是確定每一層的位寬導致了一個指數級的搜索空間,同時每搜索一步都需要重訓練CNN模型,使得已有算法非常耗時。

針對上述問題,本文提出一種基于損失變化的混合精度量化方法,根據量化層的一階和二階導數信息確定量化層的敏感度,指導位寬分配。然后利用K-means方法將敏感度相近的量化層聚類為量化塊,以塊為單位調整位寬分配策略降低搜索空間。同時提出一種自適應量化策略搜索方式,根據按歷史策略訓練后的反饋結果自行調整“壓縮態”和“恢復態”,可在壓縮模型的同時確保模型推理準確率始終控制在設定范圍內。此外,將量化訓練中的參數量化和BN(batch normalization)層進行整合,以減少傳統量化訓練中冗余的乘法計算,在不影響結果的條件下可加速量化訓練過程。

1 基于損失變化的混合精度策略搜索設計

CNN模型中存在大量乘加運算,采用全精度浮點數進行運算需要較高的算力,并且乘加運算主要集中在卷積層和全連接層,因此選取出以上網絡層作為量化層,將量化層按照混合精度策略分配不同量化位寬。該過程具體思路如圖1所示。

圖1 混合精度量化方法框架

首先計算出CNN模型中各量化層加入干擾后引起的模型損失變化量,依據損失變化量確定每個量化層敏感度值,然后采用K-means方法根據量化層敏感度值將其聚類成量化塊。把策略搜索模塊得出的量化策略對應到每個量化塊中,進而傳遞到所有量化層中。按照策略重新訓練網絡,并將訓練結果反饋給策略搜索模塊,根據反饋結果和敏感度調整輸出策略,直至找到最佳位寬分配策略。

1.1 量化后模型損失值變化分析

模型量化后產生的損失值變化是由于CNN模型中原32位浮點型參數通過量化轉化成n位表示的低位寬數后,兩種數據類型間的誤差導致的,我們對參數量化過程和損失值的變化做出理論分析。首先由32位浮點數X轉化為n位整數Xint,過程如式(1)所示

(1)

其中,Qmin=-2n-1,Qmax=2n-1-1,z為常數,表示零點,S為縮放因子,其計算表達式如式(2)所示

(2)

Xmax和Xmin分別為X集合中最大值和最小值,round()為取整函數,clamp()函數定義式(3)為

(3)

隨后按照式(4)恢復成近似原值X的可用n位表示的數XQ

XQ=(Xint+z)×S

(4)

因此X值經過式(1),式(4)量化成XQ后產生一個了量化誤差。同理CNN模型中權重值W量化后變為WQ,WQ代替原32位浮點數W引起了模型損失函數值的變化,該過程如圖2所示。

圖2 經過量化后的部分CNN模型

把量化誤差視為一種干擾,并且在原參數W處利用泰勒公式展開,可近似計算出由量化引起的模型損失變化[9]如式(5)所示

(5)

ΔW為量化引起的誤差,L表示損失函數,g為關于參數W的一階導數,H為關于參數W的二階導數(Hessian矩陣)。一般情況下,模型量化后會造成損失函數值的增大和推理準確率的下降。因此,為保證模型量化后的推理準確率,需將目標函數ΔL取最小值,ΔL表示為

(6)

從上式可以看出量化后引起的損失值變化與每層網絡的一階,二階導數信息和量化誤差ΔW相關。

1.2 計算量化層敏感度值

通過以上分析可以表明量化后模型損失值在一階和二階信息下都會受到影響。在研究二階信息帶來的損失變化時,由于在CNN模型中的權重數據很多,直接計算Hessian矩陣相關值十分困難。所以,可利用冪迭代方法來近似估計Hessian矩陣的最大特征值,沿對應的特征向量方向對每層網絡參數加入干擾,衡量模型損失變化量[10]。

因此我們可以對模型中每個量化層中分別加入梯度方向和Hessian矩陣特征向量方向上的擾動,作為量化誤差。然后分別計算模型損失函數值,用損失函數變化值衡量每個量化層的一階和二階信息帶來的影響,作為量化層的敏感度值,根據敏感度值合理分配位寬。具體過程如算法1所示:

算法1:量化層敏感度計算

輸入:預訓練模型,訓練數據集

輸出:各量化層敏感度值

(1) 計算預訓練模型的損失值Loss=Criterion(Model(inputs),targets)

(2) 計算各量化層權重的一階導數g=Loss.backward()

(3) fori=1 toNdo:

(4) 設置一個與第i個量化層相同維度的隨機向量Vi=random(gi)

(5) 標準化Vi=normalization(Vi)

(6) forj=1 toMaxIterdo:

(7) 計算第i個量化層Hessian矩陣特性向量,記作HiVi

(8) 標準化Vi=normalization(HiVi)

(9) end for

(10) 第i個量化層加入第一種干擾Wi=Wi+λ·direction(gi)

(11) 計算加入干擾后的模型損失值L1=Loss(Model(inputs,W),targets)

(12) 第i個量化層加入第二種干擾Wi=Wi+λ·direction(Vi)

(13) 重新計算模型損失值L2

(14) 確定每個量化層敏感度值Si=Max(L1,L2)

(15) end for

在算法1中,步驟(1)~步驟(9)介紹了冪迭代法的過程,首先按照步驟(1)利用常見的交叉熵損失函數Criterion()計算預訓練模型的損失值,通過步驟(2)反向傳播計算出預訓練模型中各個量化層的梯度g。接下來選取第i個量化層,初始化一個隨機向量v,要求與目前第i個量化層維度相同,并做歸一化處理,如步驟(4)、步驟(5)所示。通過步驟(7)對該層的Hessian矩陣的特征向量HiVi,采用如式(7)所示鏈式求導法則,其中gi,Hi,Wi分別為第i層的一階導數、二階導數和權重

(7)

按照步驟(8)把該值歸一化處理后迭代執行步驟(7)、步驟(8),則計算出預訓練模型第i個量化層梯度和Hessian矩陣的最大特征值對應的特征向量。然后在這兩個方向上加入干擾值作為量化產生誤差。步驟(10)、步驟(11)表示對第i個量化層施加梯度方向的干擾,并計算在該層受到擾動后整個CNN模型損失值L1,λ值可用來調整擾動值大小。步驟(12)、步驟(13)表示對第i個量化層施加最大特征向量方向的干擾,然后重新計算其模型損失值L2。最后取L1和L2的最大值作為第i個量化層敏感度值。按照上述流程計算出所有量化層敏感度值。

在文獻中[11],僅采用一階信息作為敏感度值,可能會造成位寬分配不合理的情況。例如在一個函數的極小值點處,此時一階導數為零,假設極小值處二階導數大,曲線曲率大,即使加入較小的干擾也會引起函數值較大的變化。若只把一階信息作為衡量敏感度的指標,則在后續過程中可能導致位寬分配不合理。因此需要綜合考慮根據每個量化層的一階和二階信息,可更加準確判斷每個量化層對整個CNN模型的影響大小,選擇出更合適的位寬值。

1.3 K-means聚類量化層

目前量化研究已經可以實現在統一分配8位及以上位寬情況下,實現無損壓縮。本文提出的方法是在此基礎上探索更高壓縮比,所以量化位寬設定為2~8位。但是為模型中所有量化層確定位寬會帶來指數級搜索空間,因此提出采用K-means方法根據量化層的敏感度值將其聚類成量化塊,以量化塊為最小單位調整位寬分配策略,降低搜索空間。其中關鍵問題是對K值的選擇,在本文中K值選擇是基于量化策略的設定,網絡中所有量化層位寬均在[2,8]區間內,在理想情況下,根據位寬數可將所有量化層分為7個量化塊,因此可將K值設定為7。

假設CNN模型中有n個量化層,需把所有量化層集合N={N1,N2,…,Nn} 聚類到k個量化塊集合K={K1,K2,…,Kk} 中。從所有量化層中隨機選擇k個量化層的敏感度值作為k個量化塊的質心,并根據距離式(8)計算出每個量化層Ni與量化塊質心μj的距離,并把所有量化層就近歸入到量化塊中

(8)

其中,S(Ni) 表示量化層Ni的敏感度值,μj為第j個量化塊的質心,量化層加入到量化塊后,根據質心計算式(9)更新每個量化塊的質心值

(9)

迭代計算式(8)、式(9),使得目標函數(10)達到收斂狀態。即每個量化塊中的量化層處于穩定狀態,不再做出調整,質心不再發生變化,各量化層敏感度與質心誤差平方和達到最小,則完成將量化層聚類為量化塊的過程

(10)

1.4 自適應搜索設計

由于原敏感度值表示較為復雜,在搜索設計時不便于使用,因此采用相對敏感度代替原敏感度。把所有量化塊K的質心μ從大到小排序,把排序后的相對順序值設定為量化塊的相對敏感度值S′,可表示為

S′i=Sort(μi)

(11)

考慮到敏感度大的量化塊在量化時會引起更明顯的擾動,則設計搜索方法時,需要按照S′值依次確定量化塊的位寬值,同時滿足高敏感度值的量化塊分配的位寬要不少于低敏感度量化塊的原則。具體設計流程如圖3所示。

圖3 策略搜索流程

首先,將所有量化塊設定為未標記狀態,所有位寬設定為8位,從全8位量化開始搜索。并設定了兩種搜索狀態:“壓縮態”,在該狀態下降低所有未標記量化塊位寬數;“恢復態”,即逐步增加未標記量化塊中量化塊的位寬數。

每確定一個位寬分配策略,均按照此策略采用第2節所述量化方法訓練模型,將訓練結果與設定的準確率比較結果,若滿足設定要求,則將當前搜索策略置于“壓縮態”,將所有未標記量化塊位寬數減1;若不滿足設定要求,則將當前搜索策略置于“恢復態”,選擇未標記且具有最大S′值的量化塊,增加其位寬數。按照更新后的量化策略重新訓練模型,判斷結果是否滿足設定要求,若不能滿足設定要求,仍然按照“恢復態”增加量化塊位寬數;若能滿足,則把選擇的量化塊都置為已標記狀態,位寬設定為當前策略下的位寬值,直至所有量化塊都置為已標記狀態。策略搜索方法均以量化塊為單位,相比于以層為單位調整位寬可避免大量無效的量化策略,加快搜索過程。

在實驗過程中發現,在策略搜索處于“壓縮態”時,雖然位寬減小后可以達到設定的精度要求,但是當前策略與歷史策略模型推理準確率變化較大,則在后續壓縮過程中并不利于找到最優解,易陷入局部最優。為避免該情況的出現,在“壓縮態”種嵌入補償機制,即在策略搜索處于“壓縮態”時,若滿足式(12),將當前搜索策略切換到“恢復態”,按照相對敏感度值依次恢復量化塊的位寬值,直至不滿足式(12),繼續進行壓縮

Plast-Pnew≥α(P-Pset)

(12)

其中,Plast為歷史策略下模型準確率,Pnew為當前策略下模型準確率,P為全精度模型準確率,Pset為目標準確率,α為超參數,可根據Pset調節。

另外,在“恢復態”中引入敏感度調節模塊。某些量化塊在增加位寬,訓練結果較之前沒有明顯改善,故引入該模塊可根據實際訓練結果動態調節量化塊。即在搜索策略處于“恢復態”時,若Pnew-Plast≤0,將策略恢復成歷史策略,并且降低對應量化塊的相對敏感度值。

2 量化訓練

一般情況下,原32位浮點型權重量化成低位寬數后,模型推理準確率會有較大損失,因此采用量化訓練恢復原有的準確率。本文提出將量化訓練中的參數量化和BN層合并,改變傳統量化訓練中原有的卷積操作,在不影響結果的條件下可減少計算量。同時考慮到量化后CNN模型能充分發揮邊緣計算平臺的優勢,將同一量化層中的權重和輸入特征量化為相同的位寬數,可在后續工作中采用定制乘法器提高資源利用率,降低模型部署難度。

在CNN模型中,為加快模型收斂速度,防止梯度爆炸,梯度消失和過擬合等問題,許多網絡設有BN層。但是這個網絡層帶來的額外計算量使得神經網絡在硬件資源有限的平臺更加難以實現,因此可以通過將BN層與卷積層融合,可減緩硬件資源壓力。

假設在某個卷積層中權重為W,輸入特征為A,則卷積過程可以表示為

Yconv=W*A+b

(13)

BN層計算過程可以表示為

(14)

μ,σ分別表示為一個batch內的均值和標準差,γ表示縮放參數,β為偏移參數,ε為一個非常小的常數,設定為0.001,則卷積層與BN層融合后整個過程可表示為

Y=W′*A+b′

(15)

在傳統量化訓練中常用計算方法是通過式(4)和式(15)按順序計算結果。為進一步加快量化訓練過程,我們將參數量化,卷積層與BN層重新整合。將式(4)和式(15)結合,可得式(16)

[(Xint-zw)Sx]+b′

(16)

由于卷積運算為線性運算,因此可以將把式(16)可轉化為

Y=(Wint-zw)*(Xint-zx)Sy+b′

(17)

在量化訓練中,常用層級量化與通道級量化兩種量化粒度,可根據實際情況選擇。若量化粒度選為層級量化,則Sw和Sx在每個量化層中為一組定值,因此在改進傳統的量化訓練后每個量化層中Sy只需計算一次,最后與卷積運算后的結果相乘即可;若量化粒度選為通道級量化,則Sw和Sx在每個通道內為一組定值,在每個通道內計算一次Sy值即可。另外,若量化方式采用對稱量化,即zw=zx=0,式(17)中卷積運算可轉化為整型運算,結合目前許多GPU中的Tensor Cores技術(可支持INT8和INT4等不同的精度模式),可進一步提高模型訓練速度。

3 實驗驗證

為了驗證本文提出方法的有效性,選取常用對比網絡Resnet18、Resnet20、Resnet56在cifar-10和cifar-100數據集上進行量化實驗,分別測試3種CNN模型量化后的分類準確率和位寬。

實驗環境采用深度學習框架pytorch,在配有NVIDIA Tesla T4 GPU的LINUX系統服務器中完成模型預訓練和量化實驗過程。在訓練全精度模型時初始學習率設定為0.01,每訓練100輪調整到原來的1/10,量化訓練時學習率統一定為10-4,均使用SGD優化器調整模型權重。

設定模型量化后推理準確率損失小于1%(可根據實際需求調整該設定值)。在量化實驗前,將全精度模型訓練300輪后選取具有最高準確率的模型作為量化實驗的預訓練模型。每種量化策略訓練20輪,保存每種量化策略與對應的最高記錄作為實驗結果。實驗從壓縮比和量化后的CNN模型推理準確率兩方面進行對比分析,通過準確率的變化和壓縮比衡量量化工作的可行性。

3.1 cifar-10數據集上的量化實驗

實驗選取cifar-10數據集,該數據集包含5萬張訓練圖片和1萬張測試圖片,共10類物體圖像。在上述設定條件下進行量化實驗,測試原模型和量化后的模型分類準確率以及位寬值。具體實驗結果見表1。

表1 cifar-10數據集中量化實驗結果

Resnet18網絡預訓練后,推理準確率為94.55%,將預訓練量化后其推理準確率仍然可達到93.81%,權重和激活值位寬可從32位量化至3.4 MP(MP表示為混合精度量化的平均位寬值),在準確率僅損失0.74%的情況下,權重位寬與激活位寬平均壓縮9.41倍,其內存占用空間僅為全精度模型的10.63%。表1中另外給出了Resnet18網絡使用不同量化方法得到權重和激活的位寬,壓縮比以及模型的準確率??梢钥闯?,與UNIO方法相比,在具有更高壓縮比的同時,準確率也高出2.31%。DIFFO方法準確率高于本文方法0.09%,然而激活位寬仍采用32位浮點數,從后續部署到移動端方面考慮,仍然需要高成本的浮點數乘法器運算和高數據帶寬。本文方法權重與激活平均位寬壓縮至3.4位,只需要低位寬定點數乘法器和更低的數據傳輸量便可實現,因此整體上要更優于DIFFO方法。

另選取量化相關工作中常用的Resnet20網絡進行量化,量化結果見表1,量化后權重與激活平均位寬僅有4.3位,經量化訓練后模型準確率恢復至91.9%,相比于全精度模型僅損失0.99%。相比于PACT方法采用混合精度量化策略,本文方法在量化位寬平均5位時,Resnet20網絡的分類準確率要高出此方法0.81%,可以說明本文方法的位寬分配要更加合理。

選取層數較深的ResNet56網絡進行實驗,量化后權重和激活位寬可壓縮至平均3.64位,同時量化后模型準確率達到93.35%,相比于全精度模型準確率損失僅0.48%,所占內存空間只需全精度模型的11.4%。相比于QOCN方法,本文方法的選擇的量化策略不僅準確率提高了0.71%,而且壓縮比也高于該方法。因為此方法只簡單地采用兩種量化位寬,難以得到精細的量化粒度,而本文采用2~8位位寬選擇,提供多級量化位寬粒度,根據敏感度值可精細分配位寬,可兼顧壓縮比與準確率。

3.2 cifar-100數據集上的量化實驗

為驗證方法的通用性,采用cifar-100數據集繼續測試,該數據集共包含5萬張訓練圖片和1萬張測試圖片,分類結果增加至100種,對比測試Resnet18和Resnet20網絡全精度模型和量化后模型分類準確率的變化和量化后的位寬數,實驗結果見表2。

表2 在cifar-100數據上實驗結果對比

Resnet18網絡權重和激活位寬可量化至平均4.94位,量化后的模型推理準確率達到77.0%。為更直觀的與其它方法比較,選取實驗過程中一組權重和激活平均位寬量化至4位的策略進行對比分析,ZeroQ方法同樣是基于量化層敏感度分析實現混合精度量化,經對比可以看出其分類準確率要遠低于本文方法,本文方法選用的敏感度指標對量化層分配的位寬更加合理,在相同壓縮比下,準確率高出5.33%。Resnet20網絡在cifar-100數據集上量化后權重與激活位寬平均有4.48位,模型準確率恢復至68.08%。與表中ZeroQ方法相比,可以看出本文方法分配的更少的位寬,準確率仍然高出2.38%。與Hybird-Net方法相比,雖然壓縮比方面略低,準確率卻高出該方法4.2%。

3.3 量化層不同位寬的可視化實驗

為驗證第1.1節中的結論,進一步說明各量化層中不同位寬帶來的差異性,本文選取不同量化位寬方案訓練的Resnet20網絡,在同一位置可視化輸出值并進行對比,結果如圖4所示。

圖4 不同位寬Resnet20網絡量化層輸出特征

圖中每一行代表不同位寬的網絡在同一量化層輸出結果,實驗選取了網絡中3個不同位置比較??梢钥闯?,本文采用混合精度量化圖4(c)后的模型,即使在模型不同的位置其輸出特征基本與全精度模型圖4(b)保持一致,因此保證量化后準確率損失較小。在圖4第一、第二行中可以看到,雖然使用不同位寬值,直至量化至3位圖4(e),模型在該層輸出基本相同,但是在圖4第三行中,從4位模型產生的特征圖4(d)區別開始變大,說明統一量化為低位寬會造成模型與全精度模型輸出產生較大差異,易造成模型推理準確率的下降。

4 結束語

在本文所述的工作中,我們提出了一種CNN模型混合精度量化的方法,利用敏感度信息和聚類方法極大縮小了搜索空間,并且提出一種自適應策略搜索方案,可以根據目前量化策略結果自行調整搜索狀態,逐步調整量化策略。同時重新整合量化訓練過程,減少了傳統量化訓練的計算量,可加快模型訓練速度,更高效尋找規定準確率下的最優量化策略。最后在cifar-10和cifar-100數據集上選取不同的CNN模型進行測試,與目前各項主流方法對比,綜合各項指標來看,均有提升。但是該方法量化后的模型只完成了在PC端的實驗驗證,還未實際部署在邊緣計算設備上,同時這也是下一步的研究方向,結合FPGA并行計算和可自由配置乘法器及位寬的特點,真正實現CNN模型在邊緣設備上的高效應用。

猜你喜歡
敏感度損失準確率
胖胖損失了多少元
乳腺超聲檢查診斷乳腺腫瘤的特異度及準確率分析
不同序列磁共振成像診斷脊柱損傷的臨床準確率比較探討
2015—2017 年寧夏各天氣預報參考產品質量檢驗分析
全體外預應力節段梁動力特性對于接縫的敏感度研究
玉米抽穗前倒伏怎么辦?怎么減少損失?
高速公路車牌識別標識站準確率驗證法
電視臺記者新聞敏感度培養策略
在京韓國留學生跨文化敏感度實證研究
一般自由碰撞的最大動能損失
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合