SENet論文読み

#はじめに

論文名：’Squeeze-and-Excitation Networks’(https://arxiv.org/pdf/1709.01507v3.pdf)
著者：Jie Hu,Li Shen,Samuel Albanie,Gang Sun,Enhua Wu
公開日：25 Oct 2018


参考：
1.https://towardsdatascience.com/squeeze-and-excitation-networks-9ef5e71eacd7
2.https://qiita.com/daisukelab/items/0ec936744d1b0fd8d523


###そもそもSENetとは
SEブロックと他のネットワークを組み合わせたもの

###モチベーション
畳み込み層に手を加え、パラメータ数と計算量の削減・表現力の向上を目指す
（軽量化によってさらに層を重ねることが可能になり、精度向上にも繋がる）



#論旨

###何をするのか？

CNNは空間情報とチャンネル情報の2つを合わせて特徴を捉えている
そのうちのチャンネル情報に焦点をあて、CNNの特徴マップのチャンネルを重みづけする
**通常の畳み込み層では各チャンネルが均等に出力されるが、それを重み付けすることで情報価値の高いものを強調して比較的価値の低いものを抑える**（=表現の質を上げる！）

※空間・チャンネル情報の畳み込みについては「補足：depthwise/pointwise convolution」を参照


###従来の手法との違い

従来の手法は空間情報に着目したものが多く、計算も複雑で計算量が大きいものが多い（らしい）
SEブロックは非常に単純で、既存のモデルに追加するだけで性能を大幅に改善できるうえ、
追加計算も非常に少ない（計算量の増加は1%以下！）


#提案手法
SEブロックの実装からその働きを見てみます
![スクリーンショット 2019-05-07 17.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/7b83da8f-aab0-c0c8-4221-e793bbf59649.png)
####①input_blockの各チャンネルを単一の数値に絞り込む
（空間方向に）画像全体の画素値の平均をとり、各チャンネルを単一の数値に変換
　チャンネル方向について、局所的な情報だけでなくグローバルな情報を捉えるため

####②複雑さ回避のためEncodeする
Encodeすることで複雑化を制限（=一般化）

####③Decodeして元のチャンネル数に復元,sigmoid（0~1にするゲート機能）
チャンネル間の相関を捉えるための基準として
　1.非線形な相互作用を表現できる
　2.one-hotのような排他的な重み付けではなく、複数のチャンネルを重み付けできる
この２つを満たすsigmoidをゲートに利用

####④入力の各チャンネルに今計算した重みxをかける
①~③で計算した重みとinput_blockをかける（=input_blockのチャンネルを重み付けする）
![スクリーンショット 2019-05-07 9.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/42ec1166-5496-2078-3f0f-5a76b95e80ec.png)

#SENetの例
###Inceptionとの組み合わせ
![スクリーンショット 2019-05-07 16.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/1f693d4d-e5da-34b0-64a5-e7a6880fef8e.png)
左図（Inceptionモジュール）を元としてSEブロック（赤枠部分）を加えたものが右図

###ResNetとの組み合わせ
![スクリーンショット 2019-05-07 16.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/b3f1830b-ef45-5cf1-1ea0-35f79982cdf0.png)
残差接続があってもSEブロックを付け加えるだけで実装可能


#実験結果
ImageNetのデータセットを利用した実験結果
![スクリーンショット 2019-05-07 17.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/7f5d6e74-9b00-c555-8e6a-c8d94eda2fdc.png)
original：元の論文で報告された結果
re-implementation：originalを再訓練したもの（比較で公平性を保つため）
SENet：SEブロックを追加したモデル

ここでは代表例としてSEブロックを追加したResNet-50（青枠部分）を見てみます
**計算量（GFLOPsは計算コストの単位）はResNet-50とほぼ変わりませんが（0.26%の増加）
性能はResNet-101を超える精度を持っていることが分かります**


#補足：depthwise/pointwise convolution

参考：
3.http://deeplearning.hatenablog.com/entry/slicenet
4.https://qiita.com/yu4u/items/34cd33b944d8bdca142d

SENetのチャンネル情報の抽出やそれによる計算量の削減について、特にpointwise畳み込みの考え方が似ていて分かりやすかったので補足として挙げます


###depthwise畳み込み
![スクリーンショット 2019-05-07 13.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/8f9ea072-9058-6455-2cf3-5a6c64c3b4c1.png)
チャンネルに対して独立で、空間情報のみを抽出
入力：（F,F,N）
フィルタ：(K,K,1)
出力：(F,F,N)


###pointwise畳み込み
![スクリーンショット 2019-05-07 13.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/8b7cfdcf-2722-8ac1-8703-9f4de3656498.png)

空間に対して独立で、チャンネル情報のみを抽出
入力：(F,F,N)
フィルタ：(1,1,N）
出力：(F,F,M)


###計算量の違い
（計算量ついては参考4がとても分かりやすいです）

通常の畳み込みをpw・dw畳み込みの2つで置き換えるとどのくらい計算量を削減できるのか
![スクリーンショット 2019-05-07 20.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374063/ff0e87e9-42ce-9b2b-a9e8-366c5e783a88.png)
左から通常の畳み込み・dw畳み込み・pw畳み込み（dwとpwは再掲）

通常の畳み込み
→フィルタ１つにつき、コスト$NK^2$の計算を$F^2$箇所で計算
→計算量：$F^2NK^2M$　パラメータ：$NK^2M$

dw畳み込み
→フィルタ１つにつき、コスト$1*(K^2)$の計算を$F^2$箇所で計算
→計算量：$F^2NK^2$　パラメータ：$NK^2$

pw畳み込み
→フィルタ１つにつき、コスト $N*(1^2)$ の計算を $F^2$ 箇所で計算
→計算量：$F^2NM$　パラメータ：$NM$


通常の畳み込みをdwとpwに置き換えることで
計算量：$F^2NK^2M$ → $F^2N(K^2+M)$　
パラメータ：$NK^2M$ → $N(K^2+M)$　
に削減することが出来る

計算比率は $F^2N(K^2+M)/$$F^2NK^2M$　=　$1/M + 1/K^2$

Kはフィルタのサイズなので通常$K=3$または$K=5$　
Mはフィルタの数（出力のチャンネル数）なので通常$M>=32$

以上から多くの場合$M>>K^2$　→　$1/K^2>>1/M$となるので、
計算量を$1/K^2$と近似して考えると概ね$1/9$から$1/25$程度に削減できるとわかる


#ちなみに
SE = Squeeze（圧搾）& Excitation（励起）
圧搾→各チャンネルを単一の数値に変換〔ぎゅっと絞る〕
励起→各チャンネル〔基底状態〕を
　　　相関関係に基づく重み付け〔外場〕によって
　　　重要度を高める〔励起状態にする〕
の意かなと