Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / Keybase
TOP >

Group Normalizationの論文を読んだ

Feb. 20, 2019機械学習論文

Yuxin Wu, Kaiming He. “Group Normalization” https://arxiv.org/abs/1803.08494

group normalization(GN)とは、batch normalization(BN)の進化版みたいな層。BNはbatch sizeが小さいときに効果が薄くなるという問題があった。GNはbatch軸によらずnormalizeするので、batch sizeの影響をほとんど受けない。かつ、多くのvisual recognition tasksでBNと殆ど変わらないlossに持ち込める。画像タスクなどはbatch sizeを簡単には増やせないので結構便利かもしれない。

他の normalization

実はBN以外にもnormalization layerはいくつか提案されている。例えば、layer normalization(LN)やinstance normalization(IN)など。下の図がとても分かりやすい。(原論文より引用)

H,Wは画像の縦と横をまとめた軸(spatial axes)のこと、Cはchannel軸、Nはbatch軸。LNは1つのサンプルの全てのpixelsを同一分布に従うとみなしている。INはさらにチャネルも同じとき、同一分布に従うと仮定している。どちらもbatch sizeに影響されないので、良さげに見えるが、実際はBNの制度に近づけることはできなかった。

ちなみに、GNはLNとINの間みたいな立ち位置とみなせて、後述するがグループ数G=1のGNはLNだし、G=CのGNはINとなる。G=32が推奨されている。

数式

上の図でだいたいやっていることは分かるので、ここはサラッと。GNではSiという集合に属するpixelsの平均や標準偏差を計算してnormalizeする、ここでSiは次の式。

(原論文より引用)

Cはチャネル数、Gは画像1枚あたりのグループ数」みたいなのは床関数。つまり、S_iとは、同じ画像のうち、チャネルをG等分したpixelsという感じ。端数が出ないかみたいなのは、G=32を使えば、チャネル数は2の倍数が多いので大丈夫そう。

ちなみに、normalizeした後、BNとかと同じように線形変換を加える。

Experiments

batch sizeが2とか4でもほぼ変わらず動いてくれる。
BNより少し劣る。これは、stochastic batch samplingによるuncertaintyがBNにはあってGNにはないので、GNのregularizationが弱いためだと考えられている。適切なregularizerを与えることでもっと良くなるかもと言っている。

具体的なデータは原論文を読んでください。

使い方

シンプルなtensorflowのコードが論文に載っているのでチェック!

ちなみに、Kerasだとhttps://github.com/titu1994/Keras-Group-Normalization  というのがあります。少し読んだだけですが、良さそうです。

感想

visual tasksではVRAMの制約によりbatch sizeを十分に増やせないのでこういうのはありがたいですね。


最後まで読んでいただきありがとうございます。コメントフォームは設置していません。訂正・意見・感想などはTwitter(@cosnomi)などへお願いします。
記事一覧へ