CNN の BatchNorm を 1 つの記事で理解する

1 はじめに

このペーパーでは、BatchNormの定義と関連する特性に焦点を当て、その詳細な実装と具体的なアプリケーションを紹介します。それをよりよく理解するのに役立つことを願っています。

さて、さっそく始めましょう!

2. BatchNorm とは何ですか?

BatchNorm は 2015 年に提案されたネットワーク層です。この層には次のような特徴があります。

  • トレーニングの容易さ: この層ではネットワークの重みの分布の変化がはるかに小さいため、より高い学習率を使用できます。トレーニング中の収束方向のばらつきが少なくなり、損失の収束に向けてより速く進むことができます。

  • ブースト正則化: ネットワークはエポックごとに同じトレーニング サンプルに遭遇しますが、正規化はミニバッチごとに異なるため、その値は毎回わずかに変化します。

  • 精度の向上: おそらく前の 2 つの点の組み合わせにより、論文では当時の最先端の結果よりも優れた精度を達成したと述べられています。

3. BatchNorm はどのように機能しますか?

BatchNormこれは、受け取る入力の平均が 0 で標準偏差が 1 であることを保証することです。
この記事で紹介するアルゴリズムは次のとおりです。
ここに画像の説明を挿入
以下は、pytorch を使用した私自身の実装です。

import numpy as np
import torch
from torch import nn
from torch.nn import Parameter

class BatchNorm(nn.Module):
    def __init__(self, num_features, eps=1e-5, momentum=0.1):
        super().__init__()
        self.gamma = Parameter(torch.Tensor(num_features))
        self.beta = Parameter(torch.Tensor(num_features))
        self.register_buffer("moving_avg", torch.zeros(num_features))
        self.register_buffer("moving_var", torch.ones(num_features))
        self.register_buffer("eps", torch.tensor(eps))
        self.register_buffer("momentum", torch.tensor(momentum))
        self._reset()
    
    def _reset(self):
        self.gamma.data.fill_(1)
        self.beta.data.fill_(0)
    
    def forward(self, x):
        if self.training:
            mean = x.mean(dim=0)
            var = x.var(dim=0)
            self.moving_avg = self.moving_avg * momentum + mean * (1 - momentum)
            self.moving_var = self.moving_var * momentum + var * (1 - momentum)
        else:
            mean = self.moving_avg
            var = self.moving_var
            
        x_norm = (x - mean) / (torch.sqrt(var + self.eps))
        return x_norm * self.gamma + self.beta

ここで次のように補足します。

  • トレーニング中と推論中に BatchNorm の動作が異なります。トレーニング中に、後の推論時に使用できるように、平均と分散の指数移動平均を記録します。その理由は、トレーニング中にバッチを処理すると、時間の経過に伴う入力の平均と分散のより正確な推定値を取得でき、それを推論に使用できるためです。推論中に入力バッチの平均と分散を使用すると、そのサイズがトレーニングで使用されるものよりもはるかに小さい可能性があるため、精度が低くなります。ここでは大数の法則が作用します。

4. バッチノームをいつ使用するか?

これは常に役立つと思われるため、使用しない理由はありません。通常、これは全結合層/畳み込み層と活性化関数の間で発生します。しかし、活性化層の後に置く方が良いという議論もありました。アクティベーション関数の後にそれを使用することに関する論文は見つかりません。そのため、最も安全な方法は、誰もがそうしているように、アクティベーション関数の前にそれを使用することです。

5. いくつかのスキルの概要

実際のアプリケーションにおける BatchNorm のスキルを列挙し、次のように要約します。

  • トレーニングされたネットワークには、トレーニングに使用されたデータセットの移動平均と分散が含まれており、これが問題になる可能性があることがわかっています。転移学習中は通常、ほとんどの層がフリーズされますが、注意しないと BatchNorm 層もフリーズされてしまいます。これは、適用された移動平均が新しいデータセットではなく元のデータセットに属することを意味します。BatchNorm レイヤーのフリーズを解除することは良いアイデアであり、ネットワークが独自のデータセットの移動平均と分散を再計算できるようになります。

おすすめ

転載: blog.csdn.net/sgzqc/article/details/127952552