Google Researchの神資料を読み解いてみる②【Deep Learning Tuning Playbook】

# はじめに
Google Researchの研究者によって公開された [Deep Learning Tuning Playbook]( https://github.com/google-research/tuning_playbook) を勉強のために読んでいくついでに和訳してみようの記事パート2です。
パート1は[こちら](https://qiita.com/iykuetboo/items/d2975feb46627060b9a1)

【注意】
翻訳アプリはバリバリ使っていますが、訳文そのままではなく一応多少自分なりに解釈して理解したいということで、一部抜けてたり言い回しが違ったり、そのまんま和訳になっているとは限りません（要約してるわけでもない）。また、深層学習も英語もナンモワカランなので訳や解釈が間違っている可能性も十分あります。正確に知りたい方はどうぞ原文をお読みください。
つよつよな皆様におかれましては、なんかココおかしいだろ等あれば教えていただければ幸いです。

# 目次

コチラが本家のTable of Contentsですが、この記事では「A scientific approach to improving model paformance」の節を読んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310255/0493872c-4dcf-f6af-ce03-feade7d98f1c.png)

# 4. A scientific approach to improving model performance

- 機械学習分野の発展の究極のゴールは、モデルの利便性を最大化すること
- アプリケーションによって開発プロセスの多くの面が異なるが、どのような問題に対しても、基本となるステップと原則は共通している。
- 本節では、以下のような状況を前提として述べる。
    - 完全なトレーニングパイプラインと、意味のある結果を得られるようなパラメータ設定が既に存在していること
    - 有意義なチューニングのための実験をするための計算資源と、少なくともいくつかのジョブを並行して実行できるような環境が存在すること。

## The incremental tuning strategy

**はじめは単純な設定で、考察を深めながら段々と改善していくべし**
**全ての変更は強力な根拠に基づいて行い、無駄に複雑化させてはならない**

- 究極の目標は、モデルの性能を最大化するパラメータ設定を見つけること
    - あるときは、決められた期限や〆切までに出来る限り改善し、（コンペなど）
    - またあるときは、いつまでも継続的に改善し続ける。（プロトタイプの継続的な改善など）
- 原理的には、取りうるパラメタ空間を自動的に全探索する方法で性能を最大化させることが出来るが、それは実用的ではない。
    - パラメタ空間は膨大で、人による手引きなしで効率的に全空間を探索するような洗練されたアルゴリズムは存在しない。
- 自動探索アルゴリズムの多くは、人間が手作業でデザインした探索空間に依存しており、その探索空間の選び方が非常に大きく影響する。
- 性能を最大化するのに最も効率的な方法は、まず単純な設定からはじめて、問題への洞察を深めながら、段階的に機能を追加して改善していくことである。
    - チューニングの各段階で自動探索アルゴリズムを用い、問題への理解が深まるとともにその探索空間を更新していく。
- 探索を続けるうちに、よりよい設定が自然と見つかり、「ベスト」なモデルが改善されていくことになる。
    - 新たなベストが見つかって更新することを「ローンチ」と呼ぶことにする（実際の製品モデルのローンチに対応することもあればそうでないこともある）
    - 全てのローンチで、その変更が強力な根拠に基づいていることを確かにする必要がある。
        - ただの偶然によるラッキーな構成ではダメ
        - パイプラインに余計な複雑さを与えないため。

-----
- 段階的なチューニングの大まかな流れは、次の4つのステップの繰り返しである。
    1. 次の段階として適切な規模の目標を明確にする。
    2. その目標に近づく一連の実験を設計し、実行する。
    3. 結果を分析する。
    4. 新しいベストモデルをローンチするか考える。
 - 以降では、これらの戦略についてより詳細に検討する。



## Exploration vs exploitation

**第一の目標は、問題に対する洞察を得ること**

- バリデーションセットで検証される性能を高めるために多くの時間を費やすと思われているかもしれないが、実際には、使える時間の大部分を問題への洞察を深めることに費やし、バリデーションエラーに貪欲に集中する時間は比較的少ない。
    - 言い換えると、Exploration（探索）によりほとんどの時間を費やし、Exploitation（活用、性能を最大限引き出すこと）に充てる時間は少ない。
- 長期的にみると、最終的なパフォーマンスを最大化させるためには、問題を理解することが重要。
- 短期的な利益よりも洞察を優先することで、以下のような利点がある。
    - たまたま上手くいった実行に存在していただけの不要な変更をローンチすることがなくなる。
    - 検証精度に繊細に作用するパラメータはどれなのか、互いに影響していて同時にチューニングすべきパラメータはどれなのか、他の変更に影響しにくく固定しても問題ないパラメータはどれなのか、など、それぞれのハイパーパラメータの性質を特定することが出来る。
    - 試してみたい新機能の候補を提案することが出来る。
        - オーバーフィッティングが問題なら、新しい正則化など
    - 役に立たず取り除いても問題ない特徴量や機能を特定し、今後の実験を複雑さを軽減できる。
    - ハイパラチューニングにおける改善が飽和したことに気付ける。
    - 探索空間を最適値の周りに狭めることができ、チューニングが効率化する。
- 洞察を十分に得て検証精度に貪欲になる準備が出来さえすれば、実験がチューニング問題の構造についての情報を十分に持っているかに関わらず、純粋に検証精度に焦点を当てることが出来る。

## Choosing the goal for the next round of experiments

**各段階での実験には明確な目標を定め、その目標に向かうために十分に小さいスコープで行うべし**

- 各段階での実験は明確な目標のもとで行い、実験範囲は十分に狭く、目標に向かって確実に前進できるものでなければならない
    - 一度に複数の機能を追加したり、複数の疑問に答えようとすると、変更が結果に与える影響を正しく分離することが出来ない。
- 目標設定の例
    - パイプラインの改善の可能性を試す
        - 新たな正則化手法、前処理の選択、など
    - 特定のハイパーパラメータの影響力を理解する
        - 活性化関数、など
    - 貪欲に検証誤差を最小化する

## Designing the next round of experiments

**scientific / nuisance / fixed の3種のハイパーパラメータを見分け、nuisance hyperparameter を最適化しながら、scientific hyperparameter を比較するような実験を設計する**

**資源コストと科学的価値のバランスを取りながら、パラメータの探索空間を適切に選択すべし**

### Identifying scientific, nuisance, and fixed hyperparameters
   
- 与えられた目標に対し、すべてのハイパーパラメータはいずれかに分類できる。
    - **scientific hyperparameter**（科学的パラメータ）
        - 測定したいモデルの性能に影響を与えるパラメータ
        - 考察したい対象。独立変数。
    - **nuisance hyperparameter**（局外パラメータ）
        - scientific hyperparameter の異なる値を公平に比較するために最適化する必要があるパラメータ
        - 統計学でいう局外パラメータの概念に似ている
    - **fixed hyperparameter**（固定パラメータ）
        - 実験の段階中固定され、scientific hyperparameter を比較するときに変更する必要がない、あるいは変更させたくないパラメータ
            - 一連の実験を通して固定のパラメータを用いるとき、その実験の結果が別の固定パラメータに対しては有効ではない可能性を受け入れなければならない。実験から得られる全ての結果において注意する必要がある。
- 例えば、「隠れ層のが多いモデルほど検証誤差が小さくなることを示す」が目標なら、隠れ層のの層数が scientific hyperparameter となる。
    - この時、学習率は nuisance parameter となる。
        - 一般に最適な学習率はモデルアーキテクチャに依存するため、各層数のモデルを公平に比較するには、学習率をそれぞれの層数のモデルに対して最適化しておく必要がある。
    - 最適な活性化関数がモデルの層数に影響されないと事前に判断した場合や、特定の活性化関数の場合に限定して最適な隠れ層の結論を出そうと考えている場合は、活性化関数を fixed hyperparameter とすることが出来る。
        - 各隠れ層の層数に応じて最適な活性化関数を個別に調整する場合には、活性化関数は nuisance hyperparameter になる。
- どれが scientific / nuisance / fixed hyperparameter なのかは、ハイパーパラメータの種類のみならず、実験における目標や問題設定によって変わってくる。
    - 例えば、活性化関数の選択は
        - 問題設定が「ReLU と tanh のどちらが適しているか」であれば scientific
        - 問題設定が「活性化関数を変えた時、最良の5層モデルと最良の6層モデルのどちらが性能が良いか」なら nuisance
        - 問題設定が「ReLUを用いたモデルで、特定の位置でバッチ正則化を行うことは有効か」なら fixed
- 次の段階における実験を設計するとき、まずは実験目標とする scientific hyperparameter を特定する。
    - この段階では、その他のパラメータはすべて nuisance hyperparameter として扱う。
- 次に、nuisance hyperparameter のうちいくつかを fixed hyperparameter として固定する。
    - リソースの制限さえなければ、全てのパラメータをnuisanceとして最適化してしまえば、固定されたパラメータ下に限定された結論ではなくなり、先述の注意事項から解放される。
    - しかし、チューニングすべき nuisance hyperparameter が増えるほど、それらを各 scientific hyperparameter の値に対して十分にチューニングしきれない危険性が高まり、scientific hyperparameter に関する誤った結論を導く可能性が高まる。
        - 後述（Todo:link）する通り、このリスクには使用する計算資源を増やすことである程度対応できるが、多くの場合、全てのパラメータをnuisanceとして最適化できるほどの予算は確保できない。
    - あるパラメータをnuisanceからfixedに変えるときは、そのパラメータを固定することによる注意点の厄介さと、そのパラメータを調整する厄介さを天秤にかける。
        - そのパラメータが scientific hyperparameter に大きな影響を与えるほど、それを固定してしまうことによるダメージは大きくなる。
            - 例えば、weight decay の最適値は一般にモデルサイズに依存するので、最適なモデルサイズを調べたいときに weight decay を固定して様々なモデルサイズを比較するのは、あまり洞察的でないといえる。
- 各ハイパーパラメータがどの分類に属するかは目標設定によりますが、以下のような経験則があげられる。
    - optimizerの様々なハイパーパラメータ（学習率、momentum、スケジューラのパラメータ、Adamのbeta値など）のうち少なくともいずれかは、他の変化と強く相互作用する nuisance hyperparameter となる。
        - これらが scientific hyperparameter として扱われることはほとんどない。
        - リソースの制約や、scientific hyperparameter と相互作用がないという強い根拠がある場合には、fixed として扱うこともあるが、一般に、scientific hyperparameterの各条件における比較を公正に行うためには、**optimizerのパラメータは条件ごとに個別に最適化する必要がある**と仮定すべき。
            - さらにいうと、optimizerのハイパラの値に優劣をつける先験的な理由はない（例えば、optimizerのパラメータは計算コストにほぼ関わらない）
    - 一方で、optimizerの種類の選択は、scientific または fixed hyperparameter となる場合が多い。
        - 複数のoptimizer間の性能の比較を目標とする場合にはscientific hyperparameterとなる
        - そうでない場合には、以下のような理由から、fixed hyperparameterとする場合が多い
            - 以前の実験ですでに、今の問題設定に最適なoptimizerが各scientific hyperparameterの値によらないと分かっている。
            - scientific hyperparameterの値を比較するのに、あるoptimizerを使用することで学習曲線を理由付けしやすくなる。
            - あるoptimizerが、他のoptimizerよりもメモリ消費が少ない。
    - 正則化手法を導入するかどうかはscientificまたはfixed hyperparameterとして扱われ、その正則化のパラメータはnuisanceであることが多い。
        - 例えば、dropoutの導入はコードの複雑さを増加させるため、dropoutを「使う」「使わない」をscientific hyperparameter として扱い導入すべきか判断する一方で、dropout rate は nuisance として扱う。
            - dropoutの有無を対象とした検証でdropoutの導入を決めた場合、以降の実験ではそのdropout rate は nuisance hyperparameter となる。
    - アーキテクチャのパラメータは多くの場合 scientific または fixed なパラメータとなる。
        - モデルアーキテクチャの変更はコスト、時間、メモリ使用量などに影響するため。
            - 例えばモデルの層数は、学習のスピードやメモリ使用量に劇的な影響を与える。
- nuisance hyperparameter と fixed hyperparameter の種類は、各scientific hyperparameter によって異なることもある。
    - 例えば、最適な optimizer の種類を実験の対象（＝scientific hyperparameter）として、Adam と Nesterov-momentum を比較する場合、optimizerがNesterov-momentum の時には「学習率」と「momentum」の値が nuisance/fixed hyperparameter となるが、Adamの時には「学習率」「β_1」「β_2」「epsilon」が nuisance/fixed hyperparameter となる。
    - このようにscientific hyperparameter が特定の値を取るときのみ現れるパラメータを conditional hyperparameters と呼ぶ
    - このときに、2つの conditional hyperparameters の名称が同じでも、それらが全く同じものだと仮定してはならない。
        - 上記の例なら、「Nesterov-momentum における学習率」と「Adamにおける学習率」は、役割は似ているものの、機能する値の範囲は数桁のオーダーで異なる可能性が高く、異なるハイパーパラメータとして考えるべき。


### Creating a set of studies

- 最適化すべきパラメータを特定したら、目標に向かうための "study" を設計する。
    - study は分析のためにいくつかのハイパラ設定の組を指定する
        - これらの各設定での試行を"trial" と呼ぶ
    - study の作成には、通常、以下のプロセスが含まれる
        - trial ごとに変化させるハイパーパラメータの選定
        - これらハイパーパラメータの取りうる値（探索空間）の選定
        - trial の回数
        - 各trialで、探索空間からハイパラの値をサンプリングする自動探索アルゴリズムの選定
        - または手動での各trialごとのハイパラ設定の組の決定
- study の目的は、scientific hyperparameter の異なる値を用いてパイプラインを実行し、同時に、nuisance hyperparameter を最適化によって排除することで、それぞれのscientific hyperparameterの値における結果を公正に比較すること。
- 最も単純なケースでは、scientific hyperparameterの値ごとに study を作成し、各 study 内で、nuisance hyperparameter をチューニングしていくための複数の trial を実行する。
    - 最適な optimizer が Adam なのか Nesterov-momentum なのか知りたければ、Adam と Nesterov-momentum の2つの study を作成し、それぞれにおいて nuisance hyperparameter をチューニングし、各 study の中で最も高性能を発揮した trial 同士を比較すればよい。
    - nuisance hyperparameter のチューニングには、ベイズ最適化や進化的アルゴリズムなどの、勾配を用いない最適化手法が使えるが、Exploration の段階では、疑似乱数的な探索を行う方が良い。
        - Exploration が十分に完了したら、SoTAのベイズ最適化手法を用いて Exploitation を行うと良い。
- より複雑なケース、つまり、多くの scientific hyperparameter の値を比較する必要があって個々の値で study を作成することが現実的でないような場合においては、1つの study において、scientific hyperparameter を nuisance hyperparameter と同様に、探索アルゴリズムによって探索させることも出来る。
    - この手法では、scientific hyperparameter によって異なる conditional hyperparameter が存在する場合、探索空間の指定が難しく、問題を生じる可能性がある。
    - この場合は、scientific hyperparameter に対しては、ブラックボックス的な探索アルゴリズムではなく、探索空間を一様にサンプリングすることのできる疑似乱数的な手法を強く推奨する。
        - 探索アルゴリズムに関わらず、scientific hyperparameter は一様に探索できるようにする必要がある。


### Striking a balance between informative and affordable experiments

- 一連の study をデザインする際、以下の3つの要望を十分に実現するために限られたリソースを割り当てる必要があり、これらを実現できればできるほど、実験からより多くの知見を得ることが出来る。
    - scientific hyperparameter の様々な値を十分に比較する。
        - 出来るだけ多くの値で比較することで、得られる知見の幅が広がる
    - 十分に大きな探索空間で nuisance hyperparameter をチューニングする
        - その探索空間内に「良い」nuisance hyperparameterの値が存在するという確信が得られる
        - そうしなくては、よりよい設定があるにも関わらず不公平な状態で scientific hyperparameter の比較を行うことになってしまう。
    - nuisance hyperparameter を十分に密にサンプリングする
        - 「良い」nuisance hyperparameter の値を探索によって見つけられるという信頼性が高まる。
- 残念ながら、これらの3つの点のどれかを改善するには、コストをかけて試行回数を増やすか、どれかの点でのリソースを削減してトレードオフするしかない。
    - どの問題にも、特有の性質や計算上の制約があり、これら3つのどの要望に多くのリソースを割くべきかを判断して配分するには、ある程度のドメイン知識が必要。
    - study の実行後、その study で nuisance hyperparameter が十分にチューニングされたかどうかを出来るだけ把握するといい。
        - 詳細は[後述](#extracting_insight_from_experimental_results)


## Extracting insight from experimental results

**実験の本来の目標だけでなく、チェックリストを確認し、問題が発見されたら実験設定を見直すべし**

- 最終的には、各実験グループには特定の目標があり、その目標に向かって実験が提供する結果を評価したい。
    - しかし、正しい問題設定をすれば、実験が本来の目標に向かって大きく前進する前に修正しなくてはならない問題が見つかることがしばしばある。
    - このような問いに向き合わなければ、誤った結論を導きかねない。
- 実験の実行にもコストがかかるため、各実験グループから直接目標に関係しないものも含めて、有用な洞察を得られる機会をなるべく得たい。
- 実験結果の分析の前に、次のような追加の質問を投げかけるべきである。
    - [探索空間は十分に広い？](#identifying-bad-search-space-boundaries)
        - 得られた最適な値が探索空間の境界付近にある場合、探索の幅が十分でない可能性がある。
        - この場合、探索空間を広げて別のstudyを行う必要がある。
    - [探索空間から十分な点をサンプリングしている？](#not-sampling-enough-points-in-the-search-space)
        - そうでない場合、より多くの点で実験を行うべきで、あまりチューニングの目標に野心的になりすぎない方が良い。
    - それぞれの実験のうち何割が**実行不可能**なものなのか
        - 実行不可能とは：発散する試行、圧倒的に悪い損失を得る試行、暗黙的な制約に違反するために全く実行できないような試行。
        - 実行不可能な点が多い場合には、そのような点のサンプリングを避けるために探索空間の調整を試みるべきである。それは探索空間の再パラメータ化を含む場合もある。
        - ときには、実行不可能な点が多いことは、学習コードにバグがあることを示唆していることもある。
    - [モデルに最適化の失敗などの問題はない？](#how-can-optimization-failures-be-debugged-and-mitigated)
    - [結果が最もよかった試行の学習曲線からわかることは？](#examining-the-training-curves)
        - 例えば、問題のあるオーバーフィッティングの学習曲線と共通するかどうか、など。
- 必要であれば、上記のような質問への回答に基づいて、最新のstudyを改良し、探索空間の改善やより多くの試行回数をとるなどといった是正措置をとる必要がある。
- これらの質問に答えたのちに、本来の目標に対して実験が提供する証拠の評価に移ることができる。

### Identifying bad search space boundaries

- 探索空間からサンプリングされた最良の点がその境界の近くにある場合、その探索空間は疑わしい。その方向に探索範囲を広げれば、さらに良い点が見つかるかもしれない。
- 探索空間の境界を確認するために、我々は**basic hyperparameter axis plots**と呼ぶグラフ上に全ての試行をプロットする。
    - ハイパーパラメータのひとつと検証の目標関数値を軸に取り、各試行を点としてプロットする。
    - <img src="https://github.com/google-research/tuning_playbook/raw/main/assets/bad_search_space.png" width=50%><img src="https://github.com/google-research/tuning_playbook/raw/main/assets/good_search_space.png" width=50%>
    - 上図は、ハイパーパラメータのひとつである学習率をx軸に、検証データに対するエラー率をy軸に取ったグラフであり。緑の点が精度Top3の試行を、赤い✕点が発散したり悪い結果となる"実行不可能"な試行を示している。
    - 左のグラフのように、探索空間の端に最適な点が集まっている場合、最適な観測点が境界から離れるまで探索空間を広げる必要があるかもしれない。
    - もし全ての試行がある閾値より大きな学習率で実行不可能であり、性能の良い試行がその閾値の境界付近にある場合、モデルは安定性の問題でより高い学習率にアクセスできていない可能性がある。

### Not sampling enough points in the search space

- 一般に、探索空間が十分に密にサンプリングされているかどうか判断するのは難しい。🤖 [→FAQsも参照](https://github.com/google-research/tuning_playbook#how-many-trials-are-needed-to-get-good-results-with-quasi-random-search)
- 当然、多くの試行を行うのはいいことだが、明らかにコストがかかる。
- どれだけのサンプル数で十分なのか把握するのは難しいので、普通はある程度の数のサンプリングを行い、様々なハイパーパラメータのプロットを繰り返し確認し、探索空間の"良い"領域にどれだけの点があるかを把握することで、自分たちの直感的な信頼感を較正しようとするのである。

### Examining the training curves

**学習曲線を調べることは、一般的な故障モードを特定する簡単な方法であり、次に取るべきアクションの優先順位を決めるのに役立つ**

- 多くの場合、実験の主目的は各試行の検証誤差を考えることだけですが、各試行を1つの値に集約してしまうと、水面下で起こっていることについての重要な詳細が隠されてしまうので注意が必要。
- 全てのstudyにおいて、少なくとも結果の良かったいくつかの試行において、**学習曲線**を見るようにする。
    - 学習曲線とは、学習時と検証時の誤差を学習のステップ数に対してプロットした曲線。
- たとえそれが実験の主目的の達成に必要ないとしても、学習曲線を調べることは、一般的な故障モードを特定する簡単な方法であり、次に取るべき措置の優先順位を決めるのに役立つ。
- 学習曲線を調べるとき、以下のような観点に着目するべき。
    - 過学習の問題を示す試行はある？
        - 過学習の問題は、学習中のある時点から検証誤差が大きくなり始めることで現れる。
        - 各scientific hyperparametersの設定に対して"最良"の試行を選択することによってnuisance hyperparameterを排除していくような実験設定では、少なくとも比較する各設定における最良の試行に対してだけでも、問題のある過学習を確認する必要がある。
            - もし、最良の試行が過学習の傾向を示した場合、scientific hyperparameterの値を比較する前に、追加の正則化を用いて実験をやり直すか、既存の正則化パラメータをさらにチューニングすることを勧める。
                - 検証の対象であるscientific hyperparameterが正則化パラメータを含む場合はその限りではない。正則化パラメータの強度を下げると過学習が起こるのは不思議ではないため。
        - 過学習の低減は、複雑なコードや余分な計算が少ない一般的な正則化技術（ドロップアウトやウエイト減衰、ラベルスムージングなど）によって簡単に行えることが多いため、次の実験に加えても大きな問題にはなりにくい。
        - 例えば、「隠れ層の数」をscientific hyperparameterとして最適化したい場合、最も多くの隠れ層を使用したモデルが過学習を示した場合、普通、少ない隠れ層のモデルをすぐに選択するのではなく、追加の正則化を行って再試行することを好むだろう。
        - "最良"の試行が過学習を示さなかった場合も、いずれかの試行で過学習が発生していた場合には問題になる可能性はある。
            - 最良の試行のみを選択するということは、過学習が起こった設定を抑制し過学習していないものを優先することであり、言い換えれば、より正則化された設定の試行が有利になる。
            - しかし、学習結果を悪化させるものは、それが意図されたものでなくとも、正則化として作用することがある。例えば、学習率を小さくすると最適化プロセスを阻害することによって学習率を正則化することが出来るが、そのような学習率の選択はふさわしくない。
            - したがって、選択された"最良"の試行は、一部の悪い値を優先しうる方法で選択されているかもしれないということに注意しなければならない。
    - 学習の終盤で、各ステップ間の誤差の分散は小さくなっている？
        - そうでなければ、各scientific hyperparameterの値の公正な比較や、実用化時の再現性を妨害する可能性がある。
            - 各試行がたまたま性能の良いステップで終了する可能性があるため。
        - 分散が大きくなる原因としてよくあるのが、バッチ間分散、過小な検証セット、高すぎる学習率などである。
            - バッチサイズを大きくする、検証データをより多く取る、学習率の減衰を用いる、Polyak-Ruppert Averaging（最適なパラメータをいくつかのパラメータの平均値によって決める手法）を用いる、などが対策となる。
    - 学習終了時にも性能は向上し続けていない？
        - 向上し続けている場合、["compute bound"](https://github.com/google-research/tuning_playbook#determining-the-number-of-steps-for-each-training-run)の領域にあることを意味し、[学習ステップ数を増やす](https://github.com/google-research/tuning_playbook#Deciding-how-long-to-train-when-training-is-compute-bound)か、学習率のスケジューリングを調整することで、結果が良くなる可能性がある。
    - 学習完了のはるかに前に性能が飽和していない？
        - もし飽和しているのであれば、["not compute bound"](https://github.com/google-research/tuning_playbook#determining-the-number-of-steps-for-each-training-run)な領域にあることを意味し、学習のステップ数を削減できるかもしれない。
    - 他にも、学習曲線を調べることによって明らかになる挙動が、ここに挙げきれないほどたくさん存在する。
        - 学習セットに対する損失が学習中に増加する場合、パイプラインにバグがある可能性がある。等。

### Detecting whether a change is useful with isolation plots

<img src="https://github.com/google-research/tuning_playbook/raw/main/assets/isolation_plot.png" width=50%>

- 多くの場合、一連の実験の目的は、scientific hyperparameterの異なる値を比較すること。
    - 例えば、最適なweight decayの値を決定したい、等。
- **isolation plot** は 先述のbasic hyperparameter axis plot の特殊なケースで、各点は、各scientific hyperparameterの値ごとにnuisance hyperparametersを最適化しきった後の、それぞれの最良試行の結果を示している。
- isolation plotにより、scientific hyperparameterの各値ごとの比較が容易になる。
- 例えば、上の図は、ResNet-50をImageNetで学習させたときのをweight decayの最適な値を明らかにするためのものであり、weight decayの値が検証誤差にどう影響しているかが直感的に見やすくなっている。
    - もし目的が、weight decayを行うか判断することであれば、weight decayが無い場合のベースラインとも比較する必要がある。公平を期すため、ベースラインでも学習率などのnuisance hyperparameterは同様に最適化されている必要がある。
- 疑似乱数的な手法で生成されたデータに対し、連続的なハイパーパラメータに対する isolation plot を考える場合、basic hyperparameter axis plot をx軸で分割し、それぞれの範囲で最良の試行を取り出すことで、isolation plot を近似することが出来る。


### Automate generically useful plots

- プロットの生成に手間がかかると、最小限にしか見なくなってしまうため、有用なプロットが出来る限り自動的に生成されるようなインフラを整えておくのが得策である。
- 最低でも、実験で変化させる全てのハイパーパラメータに対し、basic hyperparameter axis plot を自動的に生成できるようにしておく。
- さらに、すべての試行に対して学習曲線を自動的に作成し、各studyにおけるいくつかの最良の試行を見つけてそれらの学習曲線を簡単に調べられるようにしている。
- 他にも有用なプロットや可視化を追加できる可能性は沢山ある。上記の2種は良い出発点だが、ジェフリー・ヒントンの言葉を借りれば、"Every time you plot something new, you learn something new." （新しいことをグラフにプロットする度に、新しい何かを学ぶことが出来る）である。


# おわりに

【各種リンク】
本家 Deep Learning Tuning Playbook
https://github.com/google-research/tuning_playbook

パート①：Who is this document for?からGuide for starting a new projectまで
https://qiita.com/iykuetboo/items/d2975feb46627060b9a1

パート②：A scientific approach to improving model performance の章
このページ。

パート③以降：
いつか書きます。