---
# System prepended metadata

title: Network Compression
tags: [DL]

---

Network Compression
===
###### tags: `DL`

{%hackmd theme-dark %}

![](https://i.imgur.com/L7mfh9N.png)

## Network Pruning
![](https://i.imgur.com/SUB7eUn.png)

讓一個已經學完的model中的neuron進行刪減，讓整個網路變得更瘦。

* weight和neuron pruning差別在於prune掉一個neuron就等於是把一個matrix的整個column全部砍掉。但如此一來速度就會比較快。因為neuron pruning後matrix整體變小，但weight pruning大小不變，只是有很多空洞。
* 在gpu加速上較為困難，因為每次訓練時都要檢查哪些是不需要的neuron，不容易平行。

* MorphNet

## Parameter Quantization
利用較少的bits來簡化原本的weight，進而減少計算量。

1. Using less bits to represent a value
2. Weight clustering
![](https://i.imgur.com/vva1kvJ.png)
3. Represent frequent clusters by less bits, represent rare clusters by more bits. ex: Huffman encoding

![](https://i.imgur.com/brptXjb.png)

* XNOR-Net

## Efficient Convolutional Filters and Matrix Factorization
改變CNN內layers組成，利用filter加上矩陣分解，像是MxN的矩陣拆成MxK、KxN，藉由減少參數進而減少計算量。

* MobileNet
1. DW(Depthwise Convolution Layer)像成一張feature map經過一個filter(KxK)處理後
2. PW(Pointwise Convolution Layer)把所有feature map的單個pixel資訊(1x1)合在一起(就是1個pixel的Fully Connected Layer)

![](https://i.imgur.com/KTjlNxv.png)

* ShuffleNet
1. GC(Group Convolution Layer)就是把feature map分組，讓他們自己過Convolution Layer後再重新Concat起來。算是一般的Convolution和Depthwise Convolution的折衷版。
2. Group Convolution的Group=Input Feautures數就會是Depthwise Convolution(因為每個Channel都各自獨立)，Group=1就會是一般的Convolution(因為就等於沒有Group)。
 
![](https://i.imgur.com/5A88FDX.png)

3. 由於分群的關係，feature只會在自己群傳遞，對模型的訓練不好，因此會需要shffle的方式來打亂讓各個group可以互相交流。

![](https://i.imgur.com/PdWPJGE.png)

## Neural Architecture Search
訓練一個很大的模型，找出合適各個裝置的子模型
* DARTS: Differentiable Architecture Search
* Once-for-all

![](https://i.imgur.com/LWK0tom.png)

## Knowledge Distillation
![](https://i.imgur.com/YTTVSyF.png)

讓已經做得很好的大model們去告訴小model"如何"學習。 而我們如何做到這件事情呢? 就是利用大model預測的logits給小model當作標準就可以了。

* Why work?
1. 例如當data不是很乾淨的時候，對一般的model來說他是個noise，只會干擾學習。透過去學習其他大model預測的logits會比較好。
2. label和label之間可能有關連，這可以引導小model去學習。例如數字8可能就和6,9,0有關係。
3. 弱化已經學習不錯的target(?)，避免讓其gradient干擾其他還沒學好的task。