Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

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 が小さいときに効果が薄くなるという問題があった。(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 では 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 を十分に増やせないのでこういうのはありがたいですね。VRAM の制約を回避するには、以前ご紹介した TFLMSもありですが、trainable parameters はやっぱり逃がせないので無限にメモリを使えるわけでもないため、少ない batch size でも動いてくれる normalization layer は面白いです。ぜひ使ってみたいと思います。


コメントフォームは設置していませんので、ご意見・ご感想などはTwitter(@cosnomi)などへお願いします。