このページは Cloud Translation API によって翻訳されました。
Switch to English

正規化

TensorFlow.orgで見る Google Colabで実行 GitHubでソースを表示する ノートブックをダウンロード

概観

このノートブックでは、TensorFlowの正規化レイヤーについて簡単に紹介しています。現在サポートされているレイヤーは次のとおりです。

  • グループの正規化 (TensorFlowアドオン)
  • インスタンスの正規化 (TensorFlowアドオン)
  • レイヤーの正規化 (TensorFlow Core)

これらのレイヤーの背後にある基本的なアイデアは、アクティベーションレイヤーの出力を正規化して、トレーニング中の収束を改善することです。 バッチ正規化とは対照的に、これらの正規化はバッチでは機能せず、単一サンプルのアクティブ化を正規化するため、反復ニューラルネットワークにも適しています。

通常、正規化は、入力テンソル内のサブグループの平均と標準偏差を計算することによって実行されます。これにスケールとオフセット係数を適用することもできます。

$ y_ {i} = \ frac {\ gamma(x_ {i}-\ mu)} {\ sigma} + \ beta $

$ y $:出力

$ x $:入力

$ \ gamma $:スケール係数

$ \ mu $:平均

$ \ sigma $:標準偏差

$ \ beta $:オフセット係数

次の画像は、これらの手法の違いを示しています。各サブプロットは入力テンソルを示します。Nはバッチ軸、Cはチャネル軸、(H、W)は空間軸(たとえば、画像の高さと幅)です。青色のピクセルは、これらのピクセルの値を集計することによって計算される同じ平均と分散によって正規化されます。

出典:( https://arxiv.org/pdf/1803.08494.pdf

ガンマとベータの重みは、表現能力の損失の可能性を補うために、すべての正規化層でトレーニングできます。これらの要素をアクティブにするには、 centerまたはscaleフラグをTrue設定しTrue 。もちろん、 betagamma beta initializersconstraintsregularizerを使用して、トレーニングプロセス中にこれらの値を調整できます。

セットアップ

Tensorflow 2.0とTensorflow-Addonsをインストールする

pip install -q -U tensorflow-addons
import tensorflow as tf
import tensorflow_addons as tfa

データセットの準備

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step

グループ正規化チュートリアル

前書き

グループ正規化(GN)は、入力のチャネルをより小さなサブグループに分割し、それらの平均と分散に基づいてこれらの値を正規化します。 GNは単一の例で動作するため、この手法はバッチサイズに依存しません。

GNは画像分類タスクのバッチ正規化に対して実験的にスコアを付けました。全体的なbatch_sizeが低い場合、バッチ正規化の代わりにGNを使用すると有益な場合があり、バッチ正規化のパフォーマンスが低下します。

Conv2Dレイヤーの後の10チャンネルを、標準の「最後のチャンネル」設定で5つのサブグループに分割します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # Groupnorm Layer
  tfa.layers.GroupNormalization(groups=5, axis=3),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.4634 - accuracy: 0.8625

<tensorflow.python.keras.callbacks.History at 0x7f2e8edfad68>

インスタンスの正規化のチュートリアル

前書き

インスタンスの正規化は、グループサイズがチャネルサイズ(または軸サイズ)と同じサイズであるグループ正規化の特殊なケースです。

実験結果は、インスタンスの正規化が、バッチの正規化を置き換えるときにスタイル転送でうまく機能することを示しています。最近、インスタンスの正規化は、GANのバッチ正規化の代わりとしても使用されています。

Conv2Dレイヤーの後にInstanceNormalizationを適用し、統一された初期化スケールとオフセット係数を使用します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tfa.layers.InstanceNormalization(axis=3, 
                                   center=True, 
                                   scale=True,
                                   beta_initializer="random_uniform",
                                   gamma_initializer="random_uniform"),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 2ms/step - loss: 0.5034 - accuracy: 0.8514

<tensorflow.python.keras.callbacks.History at 0x7f2ee220a588>

レイヤー正規化チュートリアル

前書き

層の正規化は、グループサイズが1のグループ正規化の特殊なケースです。平均と標準偏差は、単一のサンプルのすべてのアクティブ化から計算されます。

実験結果は、層の正規化はバッチサイズに依存せずに機能するため、リカレントニューラルネットワークに適していることを示しています。

Conv2Dレイヤーの後にレイヤー正規化を適用し、スケールとオフセット係数を使用します。

model = tf.keras.models.Sequential([
  # Reshape into "channels last" setup.
  tf.keras.layers.Reshape((28,28,1), input_shape=(28,28)),
  tf.keras.layers.Conv2D(filters=10, kernel_size=(3,3),data_format="channels_last"),
  # LayerNorm Layer
  tf.keras.layers.LayerNormalization(axis=1 , center=True , scale=True),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(x_test, y_test)
313/313 [==============================] - 1s 3ms/step - loss: 0.4377 - accuracy: 0.8718

<tensorflow.python.keras.callbacks.History at 0x7f2ee2048fd0>

文献

レイヤーノルム

インスタンス規範

グループ規範

完全な正規化の概要