Path: blob/master/site/ja/addons/tutorials/optimizers_cyclicallearningrate.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
TensorFlow Addons オプティマイザ: CyclicalLearningRate
概要
このチュートリアルでは、Addons パッケージの Cyclical Learning Rate(循環学習率)の使用方法を説明します。
循環学習率
トレーニングプロセスが進むにつれ、ニューラルネットワークの学習率を調整することにメリットがあることが証明されています。このメリットは、サドルポイントの回復から、逆伝播中に発生する可能性のある数値の不安定性の防止に至るまでさまざまですが、特定のトレーニングタイムスタンプに関してどの程度調整すべきかを知るにはどうすればよいのでしょうか。2015 年、Leslie Smith は、損失の状況をより速くトラバースするには学習率を上げ、収束に近づくときは学習率を下げることに気づきました。この考えを実現するため、Smith は関数の循環に関して学習率を調整する循環学習率(CLR)を提案しました。視覚的なデモについては、こちらのブログをご覧ください。CLR は現在、TensorFlow API として提供されています。詳細については、こちらにある元の論文をご覧ください。
MNIST モデルをビルドする
データセットを読み込んで準備する
ハイパーパラメータを定義する
モデル構築とモデルトレーニングのユーティリティを定義する
再現性を確保するために、初期モデルの重みはシリアル化されており、これを使用して実験を行います。
CLR を使用せずにモデルをトレーニングする
CLR スケジュールを定義する
tfa.optimizers.CyclicalLearningRate
モジュールは、オプティマイザに渡すことのできるダイレクトスケジュールを返します。このスケジュールはステップを入力として取り、論文で説明されているように CLR の公式を使用して計算された値を出力します。
ここでは、学習率の下限と上限を指定すると、スケジュールはその範囲(この場合は [1e-4, 1e-2])で振動します。scale_fn
は、特定のサイクル内の学習率を上げたり下げたりする関数を定義するために使用されます。step_size
は 1 つのサイクルの期間を定義します。step_size
が 2 の場合、1 つのサイクルを完了するには合計 4 つのイテレーションが必要となります。以下に、推奨される step_size
の値を示します。
factor * steps_per_epoch
、ここで factor は [2, 8] の範囲です。
CLR の効果をさらにうまく視覚化するには、ステップ数を増やしてスケジュールをプロットできます。
このチュートリアルで使用している関数は、CLR の論文の中では triangular2
メソッドと呼ばれています。このほかにも、triangular
と exp
(指数の略)という 2 つの関数についても説明されています。
CLR を使ってモデルをトレーニングする
期待どおり、損失は通常より高く開始し、サイクルが進むにつれて安定します。これは、以下のプロットで視覚的に確認できます。