Deep Learningモデルのトレーニングをスーパーチャージ
「ディープラーニングモデルのトレーニングを超速化する方法」
ワンサイクル学習率での超収束
初めの内は簡単に精度を上げることができるが、90%に達すると改善がほとんど見られなくなりますか?モデルのトレーニングに時間がかかりすぎませんか?
この記事では、トレーニング設定を強化して、求めていたパフォーマンスの追加と高速なトレーニングを実現する興味深いテクニックについて説明します。基本的には、ワンサイクル学習率と呼ばれるポリシーを使用して、エポックごとに学習率を動的に変更していく方法に取り組みます。
Leslie Smithによる論文で最初に言及されたワンサイクル学習率スケジュール[1], [2}]は、トレーニングプロセス中に学習率を動的に更新する一意の戦略に焦点を当てています。専門用語がわかりづらいかもしれませんが、まずは典型的なトレーニング設定から始め、徐々にワンサイクル学習率を使用してどのように結果を改善できるかを理解していきましょう。
画像分類器のトレーニング
パフォーマンスを向上させるための便利なテクニック(サイクル率)を学ぶ際に、クラシックなじゃんけんゲームを楽しんでみませんか。
問題の設定
じゃんけんは、2人のプレーヤーが手のジェスチャー(グー、パー、チョキ)を使って互いに勝負する典型的な子供のゲームです。例えば、グーのジェスチャーはチョキに勝ちますが、パーのジェスチャーはグーに勝ちます。面白いですね。
ここでは、3つのジェスチャーのうちの1つを検出できる画像分類モデルをトレーニングすることが目標です。そのようなトレーニングされたモデルを活用してエンドツーエンドのゲームを開発することもできますが、この記事では分類器のトレーニングに焦点を当てます。
データセット
分類モデルのトレーニングに活用するために、すでにラベル付きのデータセットがあります。このデータセットはTensorFlowデータセットカタログで提供され、Laurence Moroney(CC BY 2.0)によって公開されています。以下はこのデータセットの詳細です:
- データポイントの数: 2800
- クラスの数: 3
- 利用可能なトレインテストスプリット: あり
- データセットのサイズ: 220 MiB
TensorFlowはこのようなデータセットにアクセスするための使いやすいAPIを提供しており、以下のスニペットではトレインおよびバリデーションスプリットをダウンロードできます。
import tensorflow_datasets as tfdsDATASET_NAME = 'rock_paper_scissors'(dataset_train_raw, dataset_test_raw), dataset_info = tfds.load( name=DATASET_NAME, data_dir='tmp', with_info=True, as_supervised=True, split=[tfds.Split.TRAIN, tfds.Split.TEST],)# データセットからのサンプルのプロットfig = tfds.show_examples(dataset_train_raw, dataset_info)
以下は、このデータセットからのいくつかのサンプル画像です:
学習率
学習率は、セットアップの成功を左右する重要なハイパーパラメータの一つですが、一般的には見過ごされがちです。見過ごされる理由は、ほとんどのライブラリ/パッケージが十分に良いデフォルト値を持っているためです。しかし、これらのデフォルト値は限界があります。
私たちのような独自のユースケースに適した正しい学習率を見つけることは非常に重要です。最適な値を見つけるためのトレードオフは難しいです。学習率があまりにも遅い(または小さい)と、モデルはほとんど何も学びません。逆に、速すぎる(または大きすぎる)と、ニューラルネットワークが見つけようとする最小値をオーバーシュートしてしまいます。以下のイラストでより理解しやすく示しています。
勾配降下法と最適化アルゴリズム
勾配降下法は、ニューラルネットワークのトレーニング/最適化のための標準的な方法です。勾配の逆方向にネットワークのパラメータを更新することで、目的関数を最小化することができます。詳細には触れませんが、勾配降下法は目的関数の勾配の斜面沿いに下りることを助けます。勾配降下法の詳細な紹介は、こちらで参照できます。
深層学習コミュニティは、最初のモデルがバニラ勾配降下法で訓練されて以来、長い道のりを歩んできました。数年を経て、いくつかの改良が早く学習し、明らかな落とし穴を回避するのに役立ちました。簡単に言えば、注目すべきものの中でも最も人気のあるものは次のとおりです:
AdaGrad適応的勾配アルゴリズムは、各パラメータの過去の勾配に基づいて個別の学習率を適応させる最適化アルゴリズムであり、稀なパラメータには大きな更新を、頻繁なパラメータには小さな更新を許可します。スパースデータの処理に適しています。
RMSProp平均二乗誤差逆伝播法は、各パラメータに対して学習率を個別に調整することで学習を最適化します。AdaGradにおける学習率の減衰問題を解決するために、二乗勾配の移動平均を使用します。これにより、最近の勾配の大きさに基づいて学習率を適応的にスケーリングすることができます。
ADAM適応的モーメント推定は、RMSPropとモーメント法のアイデアを組み合わせた最適化アルゴリズムです。過去の勾配と二乗勾配の指数的に減衰する平均を保持し、これらを使用してパラメータを適応的に更新します。ADAMは、効率と効果を持ち、深層ニューラルネットワークの訓練で知られています。
ワンサイクル学習率とスーパーコンバージェンス
ワンサイクル学習率は、学習が進むにつれて学習率とモメンタムを改善するためのシンプルな2ステッププロセスです。以下のように機能します:
- ステップ1: 最初に学習率を低い値から高い値に線形に増加させる
- ステップ2: いくつかのエポック間で最も高い学習率を維持する
- ステップ3: 時間の経過とともに学習率を低下させる
これらの3つのステップの間において、モメンタムはまさに逆の方向に更新されます。つまり、学習率が上がるとモメンタムは下がり、逆も同様です。
ワンサイクル学習率の実践
まず、ワンサイクル学習率の簡単な実装を見て、それをモデルのトレーニングに使用します。Listing 2に示されている、マーティン・ゴーナー氏の2019年のTensorFlow Worldでの講演からのワンサイクルLRスケジュールの使用済みの実装を活用します。
def lr_function(epoch): # 学習率の初期値、最小値、最大値を設定 start_lr = 1e-3; min_lr = 1e-3; max_lr = 2e-3 # 学習率を直線的に増加させるエポック数と減衰率を定義 rampup_epochs = 6; sustain_epochs = 0; exp_decay = .5 # 現在のエポックに基づいて学習率を更新するメソッド def lr(epoch, start_lr, min_lr, max_lr, rampup_epochs, sustain_epochs, exp_decay): if epoch < rampup_epochs: lr = ((max_lr - start_lr) / rampup_epochs * epoch + start_lr) elif epoch < rampup_epochs + sustain_epochs: lr = max_lr else: lr = ((max_lr - min_lr) * exp_decay**(epoch - rampup_epochs - sustain_epochs) + min_lr) return lr return lr(epoch, start_lr, min_lr, max_lr, rampup_epochs, sustain_epochs, exp_decay)
この関数(リスト2を参照)を一定のエポック数で実行し、前述した2つの手順に応じて学習率がどのように変化するかを示すために使用します。ここでは、初期学習率は1e-3から始まり、最初の数エポックで2e-3まで増加します。その後、残りのエポックで再び1e-3に減少します。この動的な学習率曲線は、以下の図に示す通り、24エポックのサンプル実行で描かれています。
今度は、現在のロックペーパーシザーズの場合に、MobileNetV2モデルを特徴抽出器として使用し、分類ヘッドをトレーニングする際にワンサイクル学習率スケジューラをテストにかけます。また、単純なCNNおよびMobileNetV2 + 標準のAdamオプティマイザを使用した分類ヘッドと比較します。完全なノートブックはgithubで参照できます。簡単な概要のために、以下のスニペットでは、TensorFlowのコールバックを使用して1サイクルレートユーティリティをプラグインする方法を説明しています。
# Set Image Shape INPUT_IMG_SHAPE= (128, 128, 3)# Get Pretrained MobileNetV2base_model = tf.keras.applications.MobileNetV2( input_shape=INPUT_IMG_SHAPE, include_top=False, weights='imagenet', pooling='avg')# Attach a classification headmodel_lr = tf.keras.models.Sequential()model_lr.add(base_model)model_lr.add(tf.keras.layers.Dropout(0.5))model_lr.add(tf.keras.layers.Dense( units=NUM_CLASSES, activation=tf.keras.activations.softmax, kernel_regularizer=tf.keras.regularizers.l2(l=0.01)))# compile the modelmodel_lr.compile( optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'])# set number of epochsinitial_epochs = 24# Set the model for training# The LearningRateScheduler callback is where we# plug our custom 1-cycle rate functiontraining_history_lr = model_lr.fit( x=dataset_train_augmented_shuffled.repeat(), validation_data=dataset_test_shuffled.repeat(), epochs=initial_epochs, steps_per_epoch=steps_per_epoch, validation_steps=validation_steps, callbacks=[ tf.keras.callbacks.LearningRateScheduler(lambda epoch: \ lr_function(epoch), verbose=True) ], verbose=1)
3つのモデルをバッチサイズ64で24エポック分トレーニングします。次の図は、1サイクル学習率の影響を示しています。他の2つのモデルと比較して、このモデルはわずか5エポックで収束を達成することができます。スーパーコンバージェンスの現象は、検証データセットでも観察できます。
10エポック以内で90〜92%の一貫した検証精度を達成しましたが、これはこれまでのモデルの中でも最も良い結果です。テストデータセットでのモデルパフォーマンスの評価でも、MobileNetV2_lrが他の2つのモデルを簡単に上回っています。
# Simple CNNTest loss: 0.7511898279190063Test accuracy: 0.7768816947937012# MobileNetV2Test loss: 0.24527719616889954Test accuracy: 0.9220430254936218# MobileNetV2_LRTest loss: 0.27864792943000793Test accuracy: 0.9166666865348816
結論
ワンサイクル学習率の導入により、モデルの性能を90%以上の精度で向上させ、トレーニング時間を最適化することができます。この技術は、Leslie Smithとそのチームによって導入されたもので、トレーニング中に学習率を動的に調整することで、モデルのパフォーマンスを飛躍的に向上させる戦略的なアプローチを提供します。この方法を取り入れることで、トレーニングの複雑さを効率的に乗り越え、より迅速かつ効果的な深層学習モデルの可能性を引き出すことができます。ワンサイクル学習率の力を活用して、トレーニングの経験を高め、優れた結果を達成しましょう!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles