高速化出来る、Pruning手法まとめ

# 概要
PruningにはUnstractured PruningとStructured Pruningがある。

前者はPruningの仕方に制限が無いため精度は保ちやすいが、並列化が難しく高速化が難しい。

一方、後者は規則的にPruningする為精度は落ちやすいが、並列化しやすくGPUなどでも比較的高速化しやすい。

今回は[Structured Pruning for Deep Convolutional Neural Networks: A survey](https://arxiv.org/pdf/2303.00566.pdf)を元に高速化されやすいStructured Pruningについて大まかにまとめる。

以下の図はPruningの分類である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/4d136199-fc86-0b1b-2737-2a96e11668b5.png)

# 2.1 Weight-Dependent
convolutionのweightの値によってfilterの重要度を推定

## 2.1.1 Filter Norm
#### [PFEC(2017)](https://arxiv.org/pdf/1608.08710.pdf)

filterのL1 distanceが小さい順にPruningする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2b181b11-d510-5da7-992b-f2bbb74eba17.png)


## 2.1.2 Filter Correlation
#### [FPGM](https://arxiv.org/pdf/1811.00250.pdf)

必ずしもnormが小さいfilterの重要度が低いという訳ではなく、似たようなnormが冗長的でという事に気づいた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/4afd8aa5-c09c-9efa-7ddf-82923eb84c19.png)


# 2.2 Activation-Based
Activation(layerの出力)によってfilterの重要度を推定

## 2.2.1 Current Layer
現在のlayerのみでfilterの重要度を推定

#### [CP(2017)](https://arxiv.org/pdf/1707.06168v2.pdf)
channelをPruneした場合の出力と元の出力の差を計算する。小さい物からPruningしていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9f73d263-e7ca-0477-17f5-cf0ddf49306c.png)

## 2.2.2 Adjacent Layers
前後のlayerでfilterの重要度を推定

#### [ThiNet(2017)](https://arxiv.org/pdf/1707.06342.pdf)
(l+1)番目のlayerの重要度が低いChannelを見つけて、そのChannelを出力する為に寄与したfilterをl番目のlayerから削除する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/5275cb8b-3e2c-03b9-8b24-e0023f873c43.png)


## 2.2.3 All Layer
モデル最終的な出力な変化によってfilterの重要度を推定

#### [NISP](https://arxiv.org/pdf/1711.05908.pdf)
最後のlayer(Final Response Layer)の値のReconstruction Errorを最小化するようにpruniningする。そのぞれのChannelに対してReconstruction Errorを計算するのはコストが高い為、後方のlayerから一つ前のlayerにimportance scoreを伝播させていく事で計算コストをさげる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c91e2b7d-b0c0-4441-f812-6e78e052cc1e.png)


# 2.3 Regularization
## 2.3.1 on BN Parameters
BatchNormのParamterでfilterの重要度を推定

#### [NS(2017)](https://arxiv.org/pdf/1708.06519.pdf)
BatchNormのr(channel毎のscaling factor)がZeroに近いChannelを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/19152c92-a832-470e-3240-e2283fbeadcb.png)

#### [GBN(2019)](https://arxiv.org/pdf/1909.08174.pdf)
scaling factor Φ(Trainable Parameter)を追加する事によってBatch Normのβも含めた出力がzeroになるように学習出来る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/7d14fe5d-06d7-6921-87d7-2f5f04f8f606.png)

## 2.3.2 on Extra Parameter
Learnable Parameterを追加してfilterの重要度を推定

#### [SSS(2018)](https://arxiv.org/pdf/1707.01213.pdf)
Trainable Paramter θを追加して、Threshold以下であれば、Channelを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/92c21dee-d5ac-3978-b029-76ba99e2946c.png)

## 2.3.3 on Filters
#### [GREG(2021)](https://arxiv.org/pdf/2012.09243.pdf)
記載予定

# Layer Grouping
residual connectionなどの複雑な構造はlayer毎にPruningするとchannelの数が一致しない場合がある。layerとlayerとのDependencyを考慮する事でこの問題を解決出来る。

#### [GFP(2021)](https://arxiv.org/pdf/2108.00708.pdf)
residual connectionやgroup convolutionを関連するlayerをgroupingして、一緒にPruningすることで、構造のChannelの数を一致させることが出来る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6c22d6ed-cb02-2c4e-d4c1-3f50bab93648.png)


# その他
深い層の方がPruneしても精度が落ちにくい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/994323c9-54fb-157b-4d9d-d7b6dad54507.png)