配置优化算法和超参
配置優化算法和超參
當搭建好神經網絡模型后,需要經過訓練才能用來做預測。而訓練的過程就是網絡模型中的參數被優化的過程,通常采用反向傳播算法和指定的 Optimizer 更新參數,本文重點介紹在 OneFlow 中如何設置 Optimizer 和 超參(Hyperparameters) 。
文章主要內容如下:
? 用于訓練的作業函數和用于預測的作業函數的配置示例;
? optimizer 及 學習策略的使用;
? 由于錯誤配置導致的常見錯誤及解決方法
可以在不了解 OneFlow 設計和概念的情況下,直接采用 配置示例 部分的訓練或預測配置;更詳細的說明請參考optimizer API 文檔
作業函數配置的基本概念
在 識別 MNIST 手寫體數字 一文中,已經了解了 oneflow.global_function 裝飾器及作業函數的概念,本文的配置,建立在此基礎上。
可以通過向該裝飾器傳遞 function_config 參數達到配置作業函數的目的。
如果對于 oneflow.global_function 還不了解,請先參閱 識別 MNIST 手寫體數字 及 作業函數的定義與調用。
配置示例
預測配置
以下代碼中定義了一個用于預測的作業函數:eval_job。
通過 get_eval_config() 定義了 eval_job() 的配置,并將 get_eval_config() 作為 @flow.global_function 的參數,應用到 eval_job() 函數。同時,通過設置參數 type=“predict” 來表明該作業函數用于預測,這樣,OneFlow 不會在這個作業函數中進行反向傳播。
def get_eval_config():
config = flow.function_config()
config.default_data_type(flow.float)
return config
@flow.global_function(type=“predict”, get_eval_config())
def eval_job() -> tp.Numpy:
build up neural network here
訓練配置
如果指定 @flow.global_function 的 type 參數為 train,就能夠得到一個用于訓練的作業函數。
以下代碼中,train_job 為用于訓練的作業函數,采用默認的 function_config 配置(因此沒有向 function_config 傳參)。
因為 OneFlow 會為 train 類型的作業函數進行反向傳播,因此需要在作業函數中指定 optimizer、學習率等超參數的設定:
@flow.global_function(type=“train”)
def train_job(
images: tp.Numpy.Placeholder((BATCH_SIZE, 1, 28, 28), dtype=flow.float),
labels: tp.Numpy.Placeholder((BATCH_SIZE,), dtype=flow.int32),
) -> tp.Numpy:
with flow.scope.placement(“gpu”, “0:0”):
logits = lenet(images, train=True)
loss = flow.nn.sparse_softmax_cross_entropy_with_logits(
labels, logits, name=“softmax_loss”
)
lr_scheduler = flow.optimizer.PiecewiseConstantScheduler([], [0.1])
flow.optimizer.SGD(lr_scheduler, momentum=0).minimize(loss)
return loss
以上代碼中:
- flow.optimizer.PiecewiseConstantScheduler 設置了學習率(0.1)及學習策略(PiecewiseConstantScheduler,分段縮放策略),OneFlow 中還內置了其它學習策略,如:CosineScheduler、CustomScheduler、InverseTimeScheduler 等。
- 在 flow.optimizer.SGD(lr_scheduler, momentum=0).minimize(loss) 設置 optimizer 為 SGD,并指定優化目標為 loss。OneFlow 中內置了多種 optimizer,它們分別是:SGD、Adam、AdamW、LazyAdam、LARS、RMSProp,可參閱 API 文檔獲取使用方法及算法細節。
FAQ
? 報錯 Check failed: job().job_conf().train_conf().has_model_update_conf()
如果作業函數的 type 為 “train”,但是沒有設置 optimizer 及優化目標,那么在反向傳播時,OneFlow 會因為不知道如何更新參數而報錯。解決方法:為訓練作業函數配置 optimizer并指定優化目標。
? 報錯 Check failed: NeedBackwardOp
如果作業函數的 type 為 “predict”,卻(錯誤地)配置了 optimizer 時,因為 OneFlow 不會為 predict 類型的作業函數生成反向圖,所以此時 optimizer 無法拿到反向的數據。解決方法:去掉 predict 類型的作業函數中的 optimizer 相關語句。
總結
- 上一篇: 使用OneFlow搭建神经网络
- 下一篇: 获取作业函数的结果