学習スループット = (処理件数/秒)
131 | 132 |もしくは, ステップごとの時間.
133 | 134 |ステップごとの時間 = (バッチサイズ) / (学習スループット)
135 | 136 | - アクセラレータがまだ飽和していない場合,バッチサイズが2倍になると,学習スループットも2倍(または少なくともほぼ2倍)になるはずです.同様に,バッチサイズが大きくなっても,1ステップあたりの時間は一定でなければなりません(少なくともほぼ一定). 137 | - もしそうでない場合は,計算ノード間のI/Oや同期など,学習パイプラインにボトルネックがあると考えられます.これは,先に進む前に診断し,修正する価値があるかもしれません. 138 | - もし,ある最大バッチサイズまでしか学習スループットが上がらないのであれば,より大きなバッチサイズがハードウェアによってサポートされていたとしても,その最大バッチサイズまでしか考慮しない方が良いでしょう. 139 | - バッチサイズを大きくすることで得られるメリットは,すべて学習スループットが向上することを前提としています.そうでない場合は,ボトルネックを修正するか,より小さなバッチサイズを使用します. 140 | - 勾配累積は,ハードウェアがサポートできるよりも大きなバッチサイズをシミュレートするため,スループット上の利点はありません.一般に,応用的な作業では避けるべきです. 141 | - これらの手順は,モデルやオプティマイザが変更されるたびに繰り返す必要があるかもしれません(たとえば,モデルのアーキテクチャが変われば,メモリに収まるバッチサイズが大きくなる可能性があります). 142 | 143 |学習時間 = (ステップごとの時間) x (総ステップ数)
155 | 156 | - 多くの場合,実行可能なすべてのバッチサイズにおいて,1ステップあたりの時間はほぼ一定であると考えることができます.これは,並列計算によるオーバーヘッドがなく,すべての学習ボトルネックが診断され修正されている場合に当てはまります(学習ボトルネックの特定方法については[前のセクション](#determining-the-feasible-batch-sizes-and-estimating-training-throughput)を参照してください).しかし,実際には,バッチサイズを大きくすることにより,少なくともいくつかのオーバーヘッドが発生します. 157 | - バッチサイズが増加すると,一定の性能目標に到達するために必要なステップの総数は,通常減少します(バッチサイズが変更されたときに,すべての関連するハイパーパラメータが再チューニングされる場合;[Shallue et al.2018](https://arxiv.org/abs/1811.03600)). 158 | - 例:バッチサイズを2倍にすると,必要な総ステップ数が半分になる場合がある.これを**パーフェクトスケーリング**と呼ぶ. 159 | - 完全スケーリングは,臨界バッチサイズまではすべてのバッチサイズで成立し,それを超えると収穫逓減(diminishing returns)となる. 160 | - 最終的には,バッチサイズを大きくしても学習ステップ数は減らない(増えることはない). 161 | - したがって,学習時間を最小化するバッチサイズは,通常,必要な学習ステップ数の削減を実現する最大のバッチサイズとなる. 162 | - このバッチサイズはデータセット,モデル,オプティマイザに依存し,新しい問題ごとに実験的に見つける以外に,どのように計算するかは未解決の問題である.🤖 163 | - バッチサイズを比較する際には,example budget/[epoch](https://developers.google.com/machine-learning/glossary#epoch) budget(学習例の提示数を固定して全ての実験を行う)とstep budget(学習ステップ数を固定して全ての実験を行う)の違いに注意する必要があります. 164 | - バッチサイズとエポックバジェットの比較は,バッチサイズを大きくしても,必要な学習ステップ数を減らすことで意味のある速度向上が得られる可能性があるにもかかわらず,完全なスケーリング領域を探るだけです. 165 | - 多くの場合,利用可能なハードウェアでサポートされる最大のバッチサイズは,クリティカルバッチサイズより小さくなる.したがって,経験則として(実験を行わずに),可能な限り大きなバッチサイズを使用するのがよい. 166 | - バッチサイズを大きくしても,学習時間が長くなっては意味がありません. 167 | 168 |リソース消費量 = (ステップごとのリソース消費量) x (総ステップ数)
184 | 185 | - 通常,バッチサイズを大きくすることで,[ステップの総数を減らす](#choosing-the-batch-size-to-minimize-training-time)ことができる.リソースの消費量が増えるのか減るのかは,1ステップあたりの消費量がどう変化するかによる. 186 | - バッチサイズを大きくすると,資源消費量が減少する場合がある.例えば,バッチサイズが大きい方が小さい方と同じハードウェアで各ステップを実行できる場合(1ステップあたりの時間が少し増えるだけ),ステップあたりのリソース消費量の増加は,ステップ数の減少に勝るかもしれない. 187 | - バッチサイズを大きくしても,資源消費量が変わらない場合がある.例えば,バッチサイズを 2 倍にすることで,必要なステップ数が半分になり,使用する GPU の数が 2 倍になる場合,GPU 時間で見た総消費量は変わりません. 188 | - バッチサイズを大きくすると,資源消費量が増加する場合があります.例えば,バッチサイズを大きくしてハードウェアのアップグレードが必要になった場合,1ステップあたりの消費量の増加がステップ数の減少を上回る可能性があります. 189 | 190 |
432 |
433 |
434 |
図1: 悪い探索空間の境界と許容される探索空間の境界の例.
437 | 438 | - [図1](#figure-1)のプロットは,初期学習率に対するエラー率(低いほど良い)を示している. 439 | - もし最良の点が探索空間の端(ある次元)に集まっている場合,最良の観測点が境界の近くになくなるまで探索空間の境界を拡張する必要があるかもしれない. 440 | - しばしば,発散したり,非常に悪い結果を出したりする「実行不可能な」試行が含まれる(上のプロットでは赤いX印で示されている). 441 | - もしすべての試行がある閾値より大きい学習率で実行不可能であり,かつ最も性能の良い試行の学習率がその領域の端にある場合,モデルはより高い学習率にアクセスするのを妨げる安定性の問題に悩まされるかもしれない. 442 | 443 |
498 |
500 |
図2: ImageNetで学習したResNet-50の重み減衰の最適値を調査した分離プロット
503 | 504 | - 多くの場合,一連の実験の目的は,科学的ハイパーパラメータの異なる値を比較することである. 505 | - 例えば,最高のバリデーション誤差をもたらす重み減衰の値を決定したい場合があります. 506 | - **分離プロット**は,基本的なハイパーパラメータ軸プロットの特別なケースです.分離プロット上の各ポイントは,迷惑ハイパーパラメータの一部(またはすべて)にわたって,*最良*のトライアルのパフォーマンスに対応します. 507 | - 言い換えれば,迷惑ハイパーパラメータを「最適化」した後のモデル性能をプロットしているのです. 508 | - 分離プロットにより,科学的ハイパーパラメータの異なる値間のリンゴ対リンゴの比較を簡単に行うことができます. 509 | - 例えば,[図2](#figure-2)は,ImageNetで学習したResNet-50の特定の構成で,最高のバリデーション性能を生み出す重み減衰の値を明らかにします. 510 | - もし我々の目的が Weight Decay を全く含まないかどうかを判断することであるなら,このプロットから最良の点を Weight Decay 無しのベースラインと比較することになる.公平に比較するためには,ベースラインの学習率も同様に調整する必要があります. 511 | - (擬似)ランダムサーチで生成されたデータがあり,分離プロットのための連続ハイパーパラメータを検討している場合,基本ハイパーパラメータ軸プロットのX軸の値をバケット化し,バケットで定義された各縦スライスで最良の試行を取ることにより分離プロットを近似することができます. 512 | 513 |
914 |
915 |
図3: ResNet-50はImageNet上で100回の試行を行い,チューニングを行った.ブートストラップにより,異なるチューニング予算がシミュレートされた.各試行予算における最適性能の箱ひげ図を上に示す. 918 | 919 | - この問いに一概に答えることはできないが,具体的な例を見ることはできる. 920 | - 図3が示すように,試行回数は結果に大きな影響を与える可能性があります. 921 | - 試行回数が6回の場合と20回の場合では,四分位範囲がいかに大きいかに注目してください. 922 | - 20回の試行でも,特に幸運な研究と不運な研究の差は,ハイパーパラメータを固定し,異なるランダムシードでこのモデルを再トレーニングした場合の一般的な変動よりも大きくなる可能性があります.(この作業負荷では,バリデーションエラー率約23%で約±0.1%) 923 | 924 |
936 |
937 |
図4: WideResnetの1つの残差ブロック(2x2 -> 1x1)の歩幅を変更すると,学習が不安定になる.これは,低い学習率では性能が低下しないが,高い学習率では不安定になり,うまく学習できない.1000ステップの学習率ウォームアップを行うことで,この不安定性を解消し,最大学習率0.1での安定した学習を可能にした.
941 | 942 | #### 不安定なワークロードの特定 943 | - 学習率が大きすぎると,どんなワークロードも不安定になる.不安定さが問題になるのは,小さすぎる学習率を使わざるを得なくなったときだけである. 944 | - 学習の不安定さには,少なくとも2つのタイプがあり,区別する価値がある. 945 | 1. 初期化時やトレーニングの初期に発生する不安定性 946 | 2. トレーニングの途中で突然不安定になること. 947 | - 作業負荷の安定性の問題を特定するために,系統的なアプローチを取ることができます. 948 | 1. 学習率スイープを行い,最適な学習率*を見つける. 949 | 2. 学習率*以上の学習率で学習ロスカーブをプロットする. 950 | 3. もし,学習率 > 学習率* が損失の不安定性を示すなら(学習期間中に損失が増加し,減少しない),その不安定性を修正することが,より良い学習をもたらすと思われる. 951 | - 学習中の全損失勾配のL2ノルムを記録すると,異常値によって学習中に不安定性が発生する可能性があります.これはgradientやupdate clippingをどのように選択するかという情報になります. 952 | **注意:**モデルによっては,初期に不安定な状態になり,その後,回復して,ゆっくりではあるが安定した学習ができるものもあります.**一般的な評価スケジュールは,十分な頻度で評価しないため,このような問題を見逃す可能性があります!** 953 | これを確認するために,`lr = 2 * current best`を使用して,\~500ステップの短縮されたトレーニングを行うことができますが,すべてのステップを評価します. 954 | 955 |
956 |
958 |
図5: トレーニング開始時の評価をより頻繁に行うことの価値を示す図.学習初期にモデルが不安定になる可能性がある場合に有効.
961 | 962 | #### よくある不安定なパターンに対する修正の可能性 963 | - 学習速度のウォームアップを適用 964 | - 初期の学習が不安定な場合に最適です. 965 | - 勾配クリッピングの適用 966 | - 初期・中期学習不安定に有効,warmupでは直せない悪いインプットも直せる可能性がある. 967 | - 新しいオプティマイザを試す 968 | - AdamはMomentumが扱えない不安定性を扱えることがある.これは活発な研究分野です. 969 | - モデルアーキテクチャのベストプラクティス/初期化を確実に行うことができる(以下の例). 970 | - モデルにまだ含まれていない場合は,残留接続(residual connections)と正規化を追加します. 971 | - 正規化は,残差の前の最後の操作であるべきです.例:x + Norm(f(x)). 972 | - Norm(x + f(x))は問題を引き起こすことが知られています. 973 | - 残差分岐を0に初期化してみてください(例:[ReZero init](https://arxiv.org/abs/2003.04887)). 974 | - 学習率を下げる 975 | - これは最後の手段です. 976 | 977 | #### 学習速度ウォームアップ 978 | 979 |
980 |
982 |
図6: ウォームアップ時の不安定さの一例(横軸の対数スケールに注意).この場合,トレーニングを成功させるためには40k歩のウォームアップが必要であった.
985 | 986 | #### 学習率ウォームアップを適用するタイミング 987 | 988 |
989 |
990 |
図7a: 学習が不安定なモデルのハイパーパラメータ軸プロットの一例.最適な学習率は,実行可能な範囲の端にある.「実現不可能」な試行とは,NaN を発生させるか,損失が異常に大きい試行と定義される.
993 | 994 |
995 |
996 |
図7b: 不安定さが見られる学習率で学習させたモデルの学習損失.
999 | 1000 | - 図7aは,最適化が不安定なモデルを示すハイパーパラメータ軸プロットで,最適な学習率が不安定になるぎりぎりのところにあることを示しています. 1001 | - 図7bは,このピークよりも5倍または10倍大きな学習率で学習させたモデルの学習損失を調べることで,これをダブルチェックする方法を示しています.もしこのプロットが,一定の減少の後に損失が急激に増加している場合(例えば上の図の\~10kのステップ),そのモデルは最適化の不安定性に悩まされている可能性があります. 1002 | 1003 | 1004 | 1005 | #### 学習率ウォームアップの適用方法 1006 | 1007 |
1008 |
1009 |
図8: 学習速度のウォームアップがトレーニングの不安定性に対処する上で有益な効果.
1012 | 1013 | - 上記のセクションを利用して,モデルが不安定になる学習率を既に特定したと仮定します.これが`unstable_base_learning_rate`である. 1014 | - ウォームアップには,学習率を0から,`unstable_base_learning_rate`より少なくとも1桁大きい安定した`base_learning_rate`に上昇させる学習率スケジュールを前置することが含まれます.デフォルトでは,不安定な基本学習速度の10倍の基本学習速度が試される.しかし,100倍の`unstable_base_learning_rate`でこの手順全体を再度実行することが可能であることに注意してください. 1015 | - 具体的なスケジュールは`warmup_steps`で0から`base_learning_rate`まで上昇させる. 1016 | - `post_warmup_steps`は一定の速度で学習する. 1017 | - 我々の目標は,`unstable_base_learning_rate`よりもはるかに高いピーク学習レートにアクセスできる,最短の`warmup_steps`の数を見つけることです. 1018 | - そのため,それぞれの`base_learning_rate`に対して,`warmup_steps`と`post_warmup_steps`を調整する必要があります.通常,`post_warmup_steps` は `2*warmup_steps`に設定すれば問題ないでしょう. 1019 | - Warmupは既存の減衰スケジュールと独立して調整することができる.`warmup_steps`は,いくつかの異なるオーダーで掃引する必要がある.例えば,研究例では,[10, 103, 104,105]を試すことができる.最大の実行可能ポイントは,`max_train_steps`の10%以上であってはならない. 1020 | - `base_learning_rate`での学習を吹き飛ばさない`warmup_steps`が確立されたら,それをベースラインモデルに適用する必要があります.基本的に,このスケジュールを既存のスケジュールの上に追加し,この実験とベースラインを比較するために,上述の最適なチェックポイントの選択を使用します.例えば,元々10,000 max_train_stepsで,warmup_stepsを1000ステップ行った場合,新しい学習手順は合計11,000ステップで実行されるはずです. 1021 | - 安定したトレーニングのために長い`warmup_steps`が必要な場合(`max_train_steps`の5%以上),これを考慮して`max_train_steps`を増加させる必要があるかもしれません. 1022 | - ワークロードの全範囲にわたって「典型的な」値があるわけではありません.100ステップで済むモデルもあれば,40k以上のステップが必要なモデル(特に変換器)もあります. 1023 | 1024 | #### 勾配のクリッピング(Gradient clipping) 1025 |
1026 |
1027 |
図9: 学習初期の不安定さを修正する勾配クリッピングの説明図.
1030 | 1031 | - 勾配クリッピングは,大きな勾配や異常な勾配の問題が発生した場合に最も有効です. 1032 | - クリッピングはトレーニング初期の不安定さ(初期の大きな勾配ノルム),またはトレーニング中期の不安定さ(トレーニング中の突然の勾配スパイク)のいずれかを修正することができます. 1033 | - ウォームアップ期間を長くすることで,クリッピングでは修正できない不安定さを修正できる場合があります.([上記のこのセクション](#How-to-apply-learning-rate-warmup)を参照してください.) 1034 | - 🤖ウォームアップ中のクリッピングはどうするのですか? 1035 | - 理想的なクリップのしきい値は「典型的な」勾配ノルムのすぐ上にあります. 1036 | - 以下は,勾配クリッピングの例です. 1037 | - もし勾配ノルム $\left | g \right |$が勾配クリッピングのしきい値 $\lambda$より大きければ,${g}'$を新たな勾配として${g}'= \lambda \times \frac{g}{\left | g \right |}$のようにします. 1038 | - 学習中のクリップされていない勾配ノルムを記録します.デフォルトでは,生成します. 1039 | - 勾配ノルム vs ステップのプロット 1040 | - 全ステップにわたって集計された勾配ノルムのヒストグラム 1041 | - 勾配ノルムの90パーセンタイルに基づいて,勾配クリッピングの閾値を選択します. 1042 | - 閾値は作業負荷に依存しますが,90%は良い出発点です.うまくいかない場合は,この閾値を調整することができる. 1043 | - 🤖 ある種の適応的な戦略はどうでしょうか? 1044 | - 勾配クリッピングを試してみて,不安定性の問題が残るようなら,より強く試すことができます(つまり,閾値を小さくする). 1045 | - 極端に攻撃的な勾配クリッピングは,要するに学習率を下げるための奇妙な方法です.もし極端にアグレッシブなクリッピングを使用していることに気づいたら,おそらく代わりに学習率を下げるべきでしょう. 1046 | - 通常,更新の50%以上が何らかの形でクリッピングされることを「極めて積極的」と見なします. 1047 | - 不安定性の問題に対処するために極めて積極的な勾配クリッピングを行う必要があるのなら,学習率を下げたほうがよいでしょう. 1048 | 1049 |