本日要介紹的是透過Configuration的方式來管理Deep Learning中的超參數。
在前面的實作中,我們目前已經可以進行完整的資料前處理、模型訓練以及模型驗證。
在後續模型表現性的調教中,超參數的調整是一種很常見方式,也是十分多的學術論文在研究探討的議題。
那麼,什麼是超參數呢?既然有個超,是不是也有參數(parameters)?以下給一些簡要的介紹:
參數:指那些可以透過演算法的途中,能被更新、或說被學習出來的數值。例如Model weights就是很顯而易見的參數。或給一個最簡單的例子,下面線性回歸式子中的beta_0與beta_1就是個參數,而我們通常用Least Square或是Maximum likelihood去找到最接近符合資料模樣的參數估計。
超參數:通常泛指那些不同於可以從資料中被演算法學習出來的參數,需要透過人工設定的方式所指定的那些數值。
那我們先前的實作中,已經出現了哪些超參數呢?以下為大家簡介:
... 不勝枚舉。
上述這些都是超參數的一部分,也因此管理好超參數,事實上就是深度學習開發當中很重要的一項工作。
個人則習慣透過一個YAML的設定檔,來對整個開發工作管理。其中除了超參數以外,也會用來管理一些整套程式碼運行途中需要用到的變數。
yaml檔的設定可以設定成這樣,第一層是功能層,然後才是變數層:
base:
project: 'iThome2022'
make_dataset:
dataset_from: 'chestmnist'
tmp_folder: '/tmp'
save_folder: 'data'
img_subfilename: 'png'
dataset_file: 'data/dataset.csv'
train:
backbone: 'efficientnet-b0'
batch_size: 128
max_epochs: 25
steps_in_epoch: 50
data_loader:
num_workers: 8
prefetch_factor: 166
loss_function: 'BCEWithLogitsLoss'
optimizer: 'Adam'
learning_rate: 0.0001
具體變更可以參考這個commit。
接著只要在新的commit底下,加一行使用設定好的hparams.yaml,就可以開始train model了:
# python src/train.py --config=hparams.yaml
----------
epoch 1/25
Training Epoch 14/50 train_loss: 1.8244: 28%|█▋ | 14/50 [00:14<00:28, 1.28it/s]