yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2017] Squeeze-and-Excitation Networks #15

Open yoheikikuta opened 5 years ago

yoheikikuta commented 5 years ago

論文リンク

https://arxiv.org/abs/1709.01507

公開日(yyyy/mm/dd)

2017/09/05

概要

画像分析において、by-path を生やして GAP でチャンネルの大域的情報を集約(squeeze)してそれを 1*1 convolution と非線形変換した結果を元の結果に掛け合わせる(excitation)する、SE module を開発して画像分析の各タスクで高い性能を発揮。

ポイントは GAP で空間方向の大域的な情報を集約してそれを空間方向と掛け合わせる構造を浅い層から入れ込んでいるところで、チャンネル間の情報を組み合わせて、入力画像に対して適切にそれらを選んで recalibrate (論文中の言葉、入力に対してチャンネル毎の重みを変える構造になっているのでそう呼んでる)するというところ。 構造がシンプルなので色々なモデルに合わせることができるし、計算量やパラメタ数もそこまで大きくないのでコスパも良い。実際にどのモデルと合わせても性能が向上する。

ILSVRC の error rate で以下の結果

yoheikikuta commented 5 years ago

もう何度か読んでいる論文なのだが、やっぱり SENet 強いなと思うことが多いので、ここに来て読み直してみるかという気持ちになった。 今度はちゃんと issue に残しておく。

yoheikikuta commented 5 years ago

まずは SE module がどうなっているか確認する。 論文の最初に図が出てくるが、これは squeeze とか excitation が何をしてるかが一目でわからないのであまり良い図とは思わない。それよりは Figure 2 の方が良い。

これは Inception に入れ込む場合という意味で具体的な例の一つだけど、基本的にはどのモデルに入れるときも同じようにするから一般性は特に失わずに理解できる。

Global pooling の部分が squeeze でこれは単純に GAP で空間方向を潰してチャンネルの大域的情報を取得している。 その後 FC -> ReLU -> FC -> sigmoid という非線形変換と sigmoid による gating を経て、チャンネル毎の weight のようなものを算出する。このチャンネル毎の weight を元の path に戻してチャンネル毎の情報として掛け合わせるのが excitation になっている。 $ x_{i,j,c} $ があったときに、各チャンネル c 毎に $ sc $ という weight を掛ける( $ x{i,j,c} * s_c $ )というもの。

単純に好みの問題だが、個人的にはこの FC というのは 1×1 convolution として表現したい。演算自体は等価だけど、チャンネル方向であることが強く意識できるから混乱も少ないし。

まあ何にせよ構造はこれで以上、という感じでかなりシンプルである。

yoheikikuta commented 5 years ago

ちょっと脱線するが、この論文の notation は個人的には好きではない。 ベクトル表記を使ってるが、これが空間方向を表していたりチャンネル方向を表していたりする。 慣れてる人には難しくないと思うが、慣れてない人が見るとどの次元で演算をしているか混乱するかもしれない。

個人的には高々3~5個くらいで収まるなら成分表記して混乱が生じないように書いた方が良いと思うんですが、どうでしょう?

yoheikikuta commented 5 years ago

話を戻してこの構造の意味を考えてみる。

Squeeze は意味は明瞭で空間方向の大域的情報をうまく取り入れたいがために導入していると理解できる。 論文にも記載しているが、その意味では層が浅くて畳み込みが十分に繰り返されてない状況でその効果を発揮することが期待される。 その辺りの実験が欠けているが(ただし深いところの SE module を取り除いても性能はほぼ変わらない、ということは言及している)、この構造の特徴的なところは浅い層から深い層まで至る所に入れ込めるというところである。

Excitation はこのように構築する理由として以下の二つが挙げられると言っている(論文の通りでなく意図を翻訳しするとこうだろう)。

まあ言いたいことは分かるが、この辺をどう見つけるというか justify するかは結構難しいよな。 アイデアとしては「大域的情報をチャンネルの情報として押し込めて、それを空間方向の情報に掛け合わせて、二つの情報を効果的に活用する」ということでよいと思うが、具体的な構造はきっと直感的探索で調べたんじゃないかなという気はする。 Excitation での重みの計算は以下。δ が ReLU で σ は sigmoid になっていて、W が 1*1 convolution の kernel で learnable paramter である。

空間方向を潰して大域的情報を取得してそれを空間方向と merge した、というのがやはり肝だと思う。空間方向とチャンネル方向の取り扱いは色んな工夫がされてるけど、別個にではなくそれを組み合わせたという点はこの論文の偉いところだ。 入力に対して excitation の重みが変わる(その意味で gating という言葉を論文では使っている)ので、大域的情報を適応的に使うことができる、という点で直感的にも性能向上に寄与してくれる期待を持つのはまあまあ reasonable だと感じる。

yoheikikuta commented 5 years ago

これでほとんど本質的な議論は尽きている。 演算量とかパラメタ数がそこまで増えない、ということは真面目に考えなくてもこの構造から容易に想像できると思う。正確に言えば深い層でチャンネル数が増えることで 1*1 convolution のパラメタ数は増えるので、パラメタ数増加は無視できないレベル(10% 増加とか)なのだが、論文では一番深いところで SE module を除けばパラメタ数が 4% 増加で性能劣化は 0.1% 未満というコメントをしている。

実装面でも強いというのは SE module の特筆すべき点だと思う。 色んなモデルに組み込むことが容易だし、実装も大抵のライブラリですぐにできる内容だ。自分も keras でちょろっと実装( https://github.com/yoheikikuta/senet-keras )したりした。

yoheikikuta commented 5 years ago

実験の結果も貼っておく。 どのモデルに入れても確実に効果が出る、という点は素晴らしいと思う。

関係ないけど Inception-ResNet-v2 の先行研究で、これは non-blacklisted な subset で評価してるのでそのせいで結果がちょっと良くなってるかも、というコメントしてあってそうなんかと思った。SOTA 争いは大変ですね。

yoheikikuta commented 5 years ago

ちなみにこの SE module は Scene classification とか Object detection でも確かに効果を発揮していると実験している。 結果は別に貼らないけど、これは reasonable と思う。

yoheikikuta commented 5 years ago

一個そこそこ重要なポイントを忘れていた。 1×1 convolution ではチャンネル数を reduce して元に戻すということをやっている。基本的にはパラメタ数の削減という意図。

ただし意味としては単にパラメタチューニングの域は出ないというものなので、モデル構築上は重要だけど、何か特別な理解が必要なものではない。

こんな感じで reduction rate (C/r の r )を変えて実験して、 r=16 を選んでいる。

yoheikikuta commented 5 years ago

興味深い実験として、SE module の出力を各層で調べているというものがある。 チャンネル数だけの出力になるので、こういう可視化もしやすい。

本質的に重要な点は以下の三点である。

ちなみにこの結果は該当のカテゴリの画像を適当に 50 枚持ってきてその平均を取ったとのことである。

yoheikikuta commented 5 years ago

ということで読み直してみた。 以前に読んだことがある論文だったし、技術的には特に難しいところがないので読むのは大変ではなかったが、改めて読むところでかなり細かいところまで理解できた。

シンプルだし実装も楽だし強い、ということでモデル性能を競うという競争が激しい領域においてこういう発明ができるのは素直に凄いと思う。