最佳做法:使用 Hyperopt 進行超參數微調

最佳作法

  • 貝氏方法比格線搜尋和隨機搜尋更有效率。 因此,使用 Parzen 估算器 (TPE) 演算法的 Hyperopt 樹狀結構,您可以探索更多超參數和較大的範圍。 使用定義域知識來限制搜尋定義域可以優化微調並產生更好的結果。
  • 當您使用 hp.choice() 時,Hyperopt 會傳回挑選清單的索引。 因此,在 MLflow 中記錄的參數也是索引。 使用 hyperopt.space_eval() 來擷取參數值。
  • 對於定型時間很長的模型,請開始試驗小型資料集和許多超參數。 使用 MLflow 來識別效能最佳的模型,並判斷哪些超參數可以修正。 如此一來,您就可以在準備大規模微調時減少參數空間。
  • 利用條件式維度和超參數的 Hyperopt 支援。 例如,當您評估多個漸層下降的類別時,而不是將超參數空間限制為只限一般超參數,您可以讓 Hyperopt 包含條件式超參數,這些參數僅適用于類別子集。 如需使用條件式參數的詳細資訊,請參閱 定義搜尋空間
  • 使用 SparkTrials 時,請針對僅限 CPU 與已啟用 GPU 的叢集適當設定平行處理原則。 在 Azure Databricks 中,CPU 和 GPU 叢集會為每個背景工作節點使用不同的執行程式執行緒數目。 CPU 叢集會為每個節點使用多個執行程式執行緒。 GPU 叢集在每個節點只使用一個執行程式執行緒,以避免嘗試使用相同的 GPU 的多個 Spark 工作之間的衝突。 雖然這通常最適合針對 GPU 撰寫的程式庫,但表示 GPU 叢集上會減少最大平行處理原則,因此請注意,選取 GPU 實例類型時,每個試用版可以使用多少個 GPU。 如需詳細資訊, 請參閱 已啟用 GPU 的叢集。
  • 請勿 SparkTrials 在自動調整叢集上使用。 Hyperopt 會在執行開始時選取平行處理原則值。 如果叢集稍後自動調整,Hyperopt 將無法利用新的叢集大小。

疑難排解

  • 回報的 NaN 遺失(不是數位)通常表示傳遞至 fmin() 傳回 NaN 的目標函式。 這不會影響其他執行,而且您可以放心地忽略它。 若要防止此結果,請嘗試調整超參數空間或修改目標函式。
  • 因為 Hyperopt 使用隨機搜尋演算法,因此每次執行時,遺失通常不會單調減少。 不過,這些方法通常比其他方法更快找到最佳的超參數。
  • Hyperopt 和 Spark 都會產生額外負荷,可主宰短期試用回合的試用持續時間(低數十秒)。 您觀察到的加速可能很小,甚至為零。

範例筆記本:不同大小的資料集最佳做法

SparkTrials 在 Spark 背景工作節點上執行試用版。 此筆記本提供在使用 SparkTrials 時,如何將不同大小順序的資料集移至背景工作節點的指導方針。

處理不同大小筆記本順序的資料集

取得筆記本