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ではS_iという集合に属するpixelsの平均や標準偏差を計算してnormalizeする、ここでS_iは次の式。
(原論文より引用)
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を十分に増やせないのでこういうのはありがたいですね。