Group Normalizationの論文を読んだ

シェアする

読んだので紹介します。あくまで自分の理解に基づいて書いているので、間違っている点などがあるかもしれません。実際に論文を利用する場合は必ず原著を参照してください。(また、コメントやTwitterなどで指摘いただけるとありがたいです)

スポンサーリンク

リンク

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

概要

group normalization(GN)とは、batch normalization(BN)の進化版みたいな層。BNはbatch sizeが小さいときに効果が薄くなるという問題があった。(32以上は必要?) 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が推奨されている。

数式

上の図でだいたいやっていることは分かる。いろいろ最適化とかがあるかもしれないけど、少なくともbatch normalizationとの違いはわかった。ということで、ここはサラッと。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を十分に増やせないのでこういうのはありがたいですね。VRAMの制約を回避するには、以前ご紹介したTFLMSもありですが、trainable parametersはやっぱり逃がせないので無限にメモリを使えるわけでもないため、少ないbatch sizeでも動いてくれるnormalization layerは面白いです。ぜひ使ってみたいと思います。

スポンサーリンク

シェアする

フォローする