# [論文筆記]: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

> BNext Family
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>
<!---->
> [!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?