建構深度學習模型時, 你需做出很多看似隨意的決定:要堆疊多少層?每一層中要有多少個單元或過濾器?要用 relu 激活函數還是另一種?應該在某個神經層的後面使用 BatchNormalization 層嗎?丟棄率要設多少呢?這些關乎模型架構的參數稱為超參數 (hyperparameter)。
經驗豐富的機器學習工程師和研究人員, 往往具備調整超參數的直覺或技能。不過為了讓流程標準化, 這個工作最好交給機器來做。你必須用一種合理的方式, 自動且系統性地探索決策空間, 並找出表現最好的架構。這就是自動超參數優化 (automatic hyperparameter), 這個重責大任可以交給 KerasTuner 來負責。
我們先來安裝 KerasTuner:
!pip install keras-tuner –q
為了指定搜尋空間, 我們要先定義一個模型建構函式。該函式會接收一個 hp 引數, 你可以從中取樣超參數範圍, 並傳回一個編譯好的 Keras 模型。
如果你想用更模組化的方式來建構模型, 也可以選擇繼承 HyperModel 的子類別, 並定義一個 build() 方法。下一步是定義一個「調校器 (tuner)」。概念上, 你可以把調校器視為一個會重複以下動作的 for 迴圈:
- 選擇一組超參數值。
- 使用這些值來呼叫模型建構函式, 進而創建一個模型。
- 訓練該模型, 並記錄其評量指標。
最後, 別忘了要傳遞驗證資料, 並確保沒有使用測試集作為驗證資料, 否則很快就會開始出現過度配適, 測試評量指標也就不可信了:
以上程式只需幾十分鐘的運行時間, 因為可能的選擇組合不算多, 而且是用 MNIST 進行訓練。但是, 在處理典型的搜尋空間和資料集時, 你會發現時常要讓搜尋程序運行一整晚, 甚至好幾天。如果搜尋程序崩潰了, 可以選擇重啟:只要在調校器中設定 overwrite=False, 就可以從保存在磁碟上的記錄檔繼續進行調
搜尋完成後, 就可以查詢最佳的超參數配置, 並用來創建相應的模型, 然後重新訓練它們。重新訓練這些模型時, 通常會使用驗證資料來一併訓練, 因為此時不會再做任何超參數的進一步調整, 因此也不用再保留驗證資料來評估模型表現。在我們的例子中, 會使用所有 MNIST 訓練資料來訓練最終的這些模型, 不會另外保留驗證集。
可以注意到,在使用所有訓練資料來訓練前, 還有最後一個參數要決定:最佳的訓練epoch 數。我們會用get_best_epoch()函式找出驗證損失最小的週期來做為最佳的 epoch 數。實際訓練的get_best_trained_model()函式,使用完整的訓練資料集進行訓練, 因為現在使用了更多資料來訓練, 訓練 epoch 數要比剛剛找到的最佳 epoch 數多 1.2 倍。最後找出的模型會存在best_models。
整體而言, 超參數優化是一種很強大的技術, 不論是要讓模型在任務上達到頂尖水準, 還是要贏得機器學習競賽, 超參數優化都是必不可缺的。
完整的程式與執行結果,小編已經整理好放在 Google Colab,請自行參閱:KerasTuner讓模型發揮最大效用。以上內容節錄自《Keras 大神歸位:深度學習全面進化!用 Python 實作CNN、RNN、GRU、LSTM、GAN、VAE、Transformer》一書。