# [論文筆記]:BNext Family Note Link: [https://hackmd.io/@HsuJenLung/BNext](https://hackmd.io/@HsuJenLung/BNext) > [name=RE6121011徐仁瓏] Paper: **Join the High Accuracy Club on ImageNet with A Binary Neural Network Ticket** Reference: [https://arxiv.org/pdf/2211.12933](https://arxiv.org/pdf/2211.12933) > [TOC] # 貢獻 * BNext是一種新型的BNN架構,其損失曲面比現有的設計更加平滑,更容易優化。 * 提出了多樣化連續知識蒸餾技術,緩解反直覺的過擬合問題。 * BNext是第一個在ImageNet上達到>80%準確率的BNN。 # 動機 * 在 ILSVRC-2012 ImageNet 資料集中,最新的BNNs仍然落後最新的全精度模型大約10%的Accuracy。 * 原因是BNNs的損失曲面比全精度網絡粗糙得多,通往全局最小值的優化路徑比全精度網絡更加崎嶇。 <figure class="half"> <img src="https://hackmd.io/_uploads/SykYBwkkye.png"> <img src="https://hackmd.io/_uploads/SJ1l8vkkJl.png"> </figure> ``` 圖2(a) 全精度的損失曲面 圖2(b) 直接將網絡二進制化會使損失曲面變得極不連續和崎嶇不平。 圖2(c) BiRealNet 提出的 Double Skip-Connection 設計緩解了信息稀疏問題。 圖2(d) Real2BinaryNet 使用注意力模塊重塑二進制卷積的輸出,減少了信息瓶頸。 ``` > [!Tip] Analysis > > 作者萃取以前方法的優點(如:殘差連接、重塑輸出分佈)來加入自己的模型設計。 # 架構 ### Binary Neural Networks * 二進制神經網絡是由多層 1-bit 卷積組成的輕量級神經網絡。 * 在前向傳播中,每層 1-bit 卷積中的輸入 $x^t_r$ 和代理權重 $w^t_r$ 會使用符號函數將實數化為 ±1。 * 在反向傳播中,符號函數使用 hardtanh 函數的梯度進行近似,因此我們可以計算權重 $w^t_b$ 的梯度並優化 $w^t_r$。 * 在每次迭代中,權重 $w^t_b$ 的梯度會累積到代理權重 $w^t_r$ 上。 $$ x_b^t~, w_b^t = \text{binarize} ~ (x_r^t, w_r^t) = \begin{cases} +1 ~~~~ \text{if} ~x_r^t~, w_r^t\ge 0, \\ -1 ~~~~ \text{otherwise}. \end{cases} $$ $$ w_r^{t+1} = W_r^t - \alpha \frac{\partial l^t}{\partial w_r^t}, ~~~ \frac{\partial l^t}{\partial w_r^t} = \frac{\partial l^t}{\partial w_b^t} \frac{\partial w_b^t}{\partial w_r^t} $$ > $\frac{\partial w_b^t}{\partial w_r^t} = 1_{\lVert w _r^t \rVert \le c}$ , represents the Staight-Through-Estimation (STE) strategy. > **r** : real-valued variable > **b** : binary variable > **t** : iteration number ### Binary Convolution with Information Recoupling(Info-RCP) <figure class="half"> <img src="https://hackmd.io/_uploads/S1AuJTgyyx.png"> </figure> 1. 使用一個快捷連接來將主分支的輸入與輸出(BConv-BN-PReLU)進行逐元素相加。 2. 輸出被輸入到輕量級的全局感知Squeeze-and-Expand(SE)分支,並通過學習自適應地調整輸出分佈,該分支用於縮放主分支的輸出。 > [!tip] Analysis > > Info-RCP 的設計可能是參考 full-precision 模型流行的 Conv-BN-ReLU 設計順序,接著參考 Real2BinaryNet 使用 SE 分支重塑輸出分佈。 ### Basic Block Design with ELM-Attention <figure class="half"> <img src="https://hackmd.io/_uploads/ryVeBAk1Jg.png"> </figure> * 通過堆疊多個 Info-RCP模塊(Processor)來構建 Basic Block。 * 每個 Processor 之後都有一個 Batch Norm 層。 * 我們使用連續的 residual connections 來包圍每個基本處理器(Info-RCP-BN),有助於減少前向傳播中的信息瓶頸。 * 利用 element-wise bypass multiplication 動態校準每個 Basic Block 中第一個 3×3 Processor 的輸出。 * Element-wise bypass multiplication 有助於每個塊中的前向特徵融合和傳播,顯著改善損失曲面。 ### BNext Family Construction > BNext Architecture ![截圖 2024-10-07 上午9.59.35](https://hackmd.io/_uploads/Hkm9e6eyke.png) > BNext Family![截圖 2024-10-07 上午10.18.52](https://hackmd.io/_uploads/rytMH6xJke.png) N,M: 每個階段的深度比率, C: 輸入層的寬度, Q: 權重和激活(W/A)的量化位元寬度,分別用於第一層、SE分支和輸出層。(藍色部分) * 為了與現有的工作進行公平比較,我們將所提出的塊設計應用於流行的 [MobileNetV1](https://arxiv.org/pdf/1704.04861) 骨幹網絡。 * 通過改變每個階段中的塊寬和深度,得到了不同變種的 BNext。 # 蒸餾策略 ### Knowledge Complexity for Teacher Selection 提出了一個簡單而有效的指標,稱為知識複雜度(Knowledge Complexity, KC),該指標結合了準確度和模型的緊湊性,用於教師選擇。 $$ KC(T) = log\left(1+\frac{Params(T)}{Accuracy(T) \times 10^6 + 10^{-8}}\right) $$ 其中,T是選定的教師模型,Params是參數數量,Accuracy是教師的測試準確度。KC定義了教師參數空間的複雜性對暗知識有效性的影響。 下圖展示了三個流行的DNN家族的知識複雜度分析,以及對應的教師和學生的Top-1準確度。 <figure class="half"> <img src="https://hackmd.io/_uploads/H12AOpekJl.png"> <img src="https://hackmd.io/_uploads/HJupdTg1ye.png"> </figure> Student Model: BNext-T, Dataset: ImageNet, Epoch: 128, Resolution: 224x224 按照常理,我們需要一個更強大的教師來拉高學生準確度的上限。然而,如上圖所示,當教師同時具有高準確度和高KC時,會容易導致二進制學生出現過擬合問題(學生的Top-1準確度顯著下降)。 可能的原因是,在初期訓練階段使用過於複雜的教師訓練二進制學生,**未能顧及教師和學生之間預測分佈的巨大差異**。類似的觀察也出現在其他研究中,剪枝過的教師比原始教師表現得更好。因此,我們建議在BNNs的KD訓練中優先選擇知識複雜度較低的教師。 > [!Tip]Anaiysis > > 高 Accuracy 的老師無法使學生得到高 Accuracy,所以改用 KC 當作選擇老師的標準。 ### Diversified Consecutive KD 開發了一種多樣化連續 KD 算法來進一步提升 KD 訓練的性能。該方法包含一個差距敏感的知識集成(Gap-Sensitive Knowledge Ensemble)和一個知識提升策略(Gap-Sensitive Knowledge Ensemble)。 **1. Gap-Sensitive Knowledge Ensemble** * 使用 Knowledge Ensemble 來增加 Teacher Knowledge 的多樣性。 * Knowledge Ensemble 不是靜態的,而是根據知識的難度進行動態調整。 * 動態加權和融合方法限制了容量有限的二進制學生 $S_\theta$ 更加關注更為複雜的知識。 $$ L^i_{CE} = -\sum_x S_{\theta}(x)log\left(T^i_\theta(x)\right) $$ $$ \sigma(x) = \frac{e^{L_{CE}(S_\theta, T^s_\theta)}}{\sum_i e^{L_{CE}(S_\theta, T^i_\theta)}} $$ $$ L(x) = \sigma(x) KL_{S_\theta,T^s_\theta}(x) + (1-\sigma(x)) KL_{S_\theta,T^w_\theta}(x) $$ > $T^s_\theta$ : Strong Teacher Model > $T^w_\theta$ : Weak Teacher Model > $S_\theta$ : Binary Student Model > $\sigma(x)$ : Softmax, 對每個知識 $KL_{S_\theta, T_\theta^i}$ 進行加權。 > $CE$ : Cross Entropy > $KL$ : K-L Divergence, 計算每次前向傳播中學生和每個教師預測之間的距離。 **2. Knowledge-Boosting Strategy** * 為了進一步減少 BNext-M/L 優化中的知識差距,開發了一種知識提升策略。 * 如前所述,強教師 $T^s_\theta$ 在整個訓練過程中保持一致,但助教教師從預定義的候選組中選擇。 * 助教教師將按準確度和知識複雜度的遞增順序依次加入KD過程,且每個助教的活動時間相同。 * 通過在訓練的不同階段使用適應性助教來調整教師知識,可以獲得更好的多樣性,並有效解決強教師過擬合問題。 <figure class="half"> <img src="https://hackmd.io/_uploads/ByizlsMJJg.png"> </figure> <!--![image](https://hackmd.io/_uploads/ByizlsMJJg.png)--> > [!Tip] Analysis > > 用權重 $\sigma(x)$ 動態調整要偏好主要教師或助教,是個聰明的選擇,和一般人的思考模式很像。不是一次加入好幾個助教,而是一個階段加入一個助教,就好像一個助教負責一種任務,似乎是個可以增加模型表現的合理設計。 # 實驗 ### Setup > **Optimizar** : AdamW with $\beta_1$=0.99, $\beta_2$=0.999 > **Weight Decay** : $10^{-3}$ for non-binary params, $10^{-8}$ for binary params. > **Initial Learning Rate** : $10^{-3}$ > **Scheduler** : Cosine Annealing > 將 Straight Through Estimation(STE)的反向梯度裁剪範圍設置為 [-1.5, 1.5]。 > 對於激活,我們使用 hard binarization,並逐步根據 [BoolNet](https://arxiv.org/pdf/2106.06991) 的建議對權重進行二進制化。 > 使用兩種不同的骨幹網絡 [ResNet](https://arxiv.org/pdf/1512.03385) 和 [MobileNetV1](https://arxiv.org/pdf/1704.04861) 進行技術評估。 > 模型在 8 個 Nvidia DGX-A100 GPU 上進行訓練。 ### Dataset #### ILSVRC12 ImageNet ``` Resolution : 224 x 224 Batch size : 512 Epochs : 512 Data Augmentation : RandAugment (7, 0.5) ``` <figure class="half"> <img src="https://hackmd.io/_uploads/S1Homsf1kg.png"> </figure> * BNext 在 ImageNet 分類任務中創造了 BNNs 的新紀錄。BNext-XL 將 BNNs 的準確率提升到了 80.57%,超過了大多數現有工作 10% 的準確率,並達到了**接近現代 32 位設計的水準**。 * 相比之前的 SOTA 設計 PokeBNN,BNext-M† 在類似模型大小下準確率提高了 0.7%。PokeBNN 使用了 8192 的巨大批次大小進行 720 個 epoch 的訓練,並使用了 64 個 TPU-v3 芯片,而 BNext 僅使用 512 的批次大小進行 512 個 epoch 的訓練。 * 相比流行的 ReActNet,BNext-Tiny† 在操作數較少的情況下,準確率高出 2.6%。 * BNext-18 在 ImageNet 上的 Top-1 準確率達到 68.4%,僅比原始 ResNet-18 低 1.2%。 #### CIFAR ``` Resolution : 224 x 224 Batch size : 128 Epochs : 256 Data Augmentation : random crop, random horizontal flip, normalization ``` <figure class="half"> <img src="https://hackmd.io/_uploads/HkgSGOfJye.png"> <img src="https://hackmd.io/_uploads/HJRLOoMyJl.png"> </figure> * 進一步探索了 BNext 在較小數據集 CIFAR10 上的泛化能力,CIFAR10 數據集的結果是五次運行的平均值。 * 相比最近的設計,如 AdaBNN、ReCU 和 RBNN,BNext 取得了最佳性能。它比最新的 AdaBNN 提高了 0.5%,並將與 32 位 ResNet 的差距縮小至 0.8%。 ### Ablation Study 我們對本文提出的技術影響進行了消融研究,內容包括**模塊設計**、**優化方案**、**數據增強策略**和**訓練後量化的影響**。我們選擇了 BNext-Tiny 進行所有實驗,除非特別說明,所有實驗都使用標準數據增強和交叉熵損失進行模型訓練。 #### Module Designs 我們對所提出的 Info-RCP 和 ELM-Attention 模塊進行了消融研究。未使用兩個結構的 Baseline model 在 ImageNet上 僅獲得了 62.43% 的準確率。僅添加 ELM-Attention 到 BNext-Tiny 後,準確率提高到 64.91%。僅添加 Info-RCP 後,準確率提高到 64.61%。同時使用這兩個設計,達到了 65.02% 的最高準確率。因此,這兩個設計都提高了模型的表現能力,這與損失曲面比較中的預期一致。 <center class="half"> <img src="https://hackmd.io/_uploads/By4kXdGJyx.png" width="600"/> </center> #### Optimization Schemes 我們評估了實驗中使用的所有優化方案的有效性。以 ResNet-101 作為教師的傳統知識蒸餾策略被用作 baseline。用基於 KC(x) 的教師選擇(Efficient-B0)替代 baseline 教師後,準確率提升了 0.57%。這表明教師選擇在二進制網絡優化中至關重要。進一步使用 Efficient-B0 和 Efficient-B2 的差距敏感集成策略使準確率額外提高了 0.05%。再通過加入 RandAugment 提升準確率 0.08%。將訓練 epoch 延長至 512 後,準確率提升到 72.40%。 <center class="half"> <img src="https://hackmd.io/_uploads/SJYqG_M1kg.png" width="600"/> </center> #### Data Augmentations 我們驗證了 Mixup、Cutmix、Augment-Repeat 和 RandAugment 等流行數據增強策略的有效性。結果顯示,大多數流行的增強選擇對 BNext 模型優化有害。例如,Augment-Repeat 策略使 Top-1 準確率下降了 11.28%。Mixup 和 RandAugment 分別提高了泛化性能,但結合它們產生了次優結果。僅使用RandAugment帶來了 2.49% 的最佳增益。 <center class="half"> <img src="https://hackmd.io/_uploads/Bk9iGdGkkx.png" width="600"/> </center> #### Quantization Impacts 我們對輸入卷積層、輸出全連接層及 SE 分支中的層進行了訓練後量化。未進行量化時,BNext-L 的 Top-1 準確率達到了 80.57%。將所有層的權重和激活量化為 8 位時,準確率僅略微下降至 80.47%。進一步將SE分支的權重位元寬度減少到 4 位(激活仍為 8 位),最終得到的BNext-L模型的分類性能仍保持在 80.37%,高於 80% 的標準。 <center class="half"> <img src="https://hackmd.io/_uploads/H1V2zuM1Jg.png" width="600"/> </center> > [!Tip] Analysis > > 從表中觀察,把 SE 層的權重從 int8 掉到 int4 不會使模型掉太多,但是將激活層從 int8 掉到 int4 卻使結果下降許多。因此我們可以猜測或許激活層對模型表現較敏感,此一發現也可以運用在往後的實驗上。此外,作者並未秀出將輸入層和輸出層從 int8 掉到 int4 的結果,或許此兩層對於模型表現更加敏感,可能會使結果大幅下降,因此沒有秀出來。 # 結論 * 提出了 BNext,這是第一個能在 ImageNet 上達到 80.57% Top-1 準確率的二進制神經網絡架構。 * 引入全新的 Info-RCP 和 ELM-Attention 模塊來增強優化過程,更平滑的損失曲面和使模型能夠更好地擬合訓練資料,甚至出現了微弱的過擬合現象,這在以前的 BNN 架構中是不可能實現的。 * 為了增加泛化能力並減少過擬合,我們提出了多樣化的連續知識蒸餾技術,並在過程中發現了一些有趣的現象。 * 在 ImageNet 上取得的高準確度表明 BNext 足以成為一個強大的特徵提取器。 > [!Note] Future Directions > > - BNext 模型在 ImageNet 上展現出色表現,具有成為其他圖像領域輕量化骨幹網路的潛力。 > > - 在改良模型時,觀察先前的網路並萃取有用的設計至關重要。 > > - 若現有指標無法有效解釋問題,創建新的指標來應對也是一種可行策略。 > > - 除了傳統方法外,思考如何利用各種集成方法來提升模型性能,有助於解決過擬合問題。 > > - 許多論文中的消融實驗往往蘊含對現有研究有益的發現,深入分析並靈活運用這些發現,能有效提高問題解決的效率。 > [!Caution] Questions > > 1. 整個 Basic Block 是怎麼想到的?為什麼 Processor 後面還要加 BN? > > 2. 為什麼 Stage 3 的 Basic Block 數量和其他不一樣? > > 3. 為什麼最後輸出層前還要加 PReLU?