MegEngine 使用小技巧:使用 Optimizer 優(yōu)化參數(shù)
神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)的目的是找到使損失函數(shù)的值盡可能小的參數(shù)。這是尋找最優(yōu)參數(shù)的問題,解決這個問題的過程稱為優(yōu)化(optimization)。而由于參數(shù)空間復(fù)雜、參數(shù)數(shù)量龐大等原因,使得神經(jīng)網(wǎng)絡(luò)的優(yōu)化問題非常難。
MegEngine 的 optimizer 模塊中實現(xiàn)了大量的優(yōu)化算法, 其中?Optimizer (https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Optimizer.html#megengine.optimizer.Optimizer)是所有優(yōu)化器的抽象基類,規(guī)定了必須提供的接口。 同時為用戶提供了包括?SGD(https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.SGD.html#megengine.optimizer.SGD),?Adam?(https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Adam.html#megengine.optimizer.Adam)在內(nèi)的常見優(yōu)化器實現(xiàn)。 這些優(yōu)化器能夠基于參數(shù)的梯度信息,按照算法所定義的策略對參數(shù)執(zhí)行更新。
以 SGD 優(yōu)化器為例,優(yōu)化神經(jīng)網(wǎng)絡(luò)模型參數(shù)的基本流程如下:
我們需要構(gòu)造一個優(yōu)化器,并且傳入需要被優(yōu)化的參數(shù) Parameter;
在反向傳播,計算出梯度后執(zhí)行?step?(https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Optimizer.html#megengine.optimizer.Optimizer.step)方法,參數(shù)將基于梯度信息進行一次優(yōu)化;
通過執(zhí)行?clear_grad (https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Optimizer.html#megengine.optimizer.Optimizer.clear_gradx)方法,清空參數(shù)的梯度。
為何需要手動清空梯度?
梯度管理器執(zhí)行?backward (https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.autodiff.GradManager.html#megengine.autodiff.GradManager.backward)方法時, 會將當前計算所得到的梯度以累加的形式積累到原有梯度上,而不是直接做替換。 因此對于新一輪的梯度計算,通常需要將上一輪計算得到的梯度信息清空。 何時進行梯度清空是由人為控制的,這樣可允許靈活進行梯度的累積。
Optimizer 構(gòu)造函數(shù)中還可接受一個含有優(yōu)化器默認參數(shù)的字典(如含有學(xué)習(xí)率、動量、權(quán)重衰減系數(shù)等等), 這些信息可以通過?state_dict (https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Optimizer.html#megengine.optimizer.Optimizer.state_dict)和?load_state_dict (https://www.megengine.org.cn/doc/stable/zh/reference/api/megengine.optimizer.Optimizer.html#megengine.optimizer.Optimizer.load_state_dict)獲取和加載。更多詳細內(nèi)容見:Optimizer 狀態(tài)字典
附:
「MegEngine 使用小技巧」系列文章,重點輸出 MegEngine 及周邊工具的使用技巧,如有催更或投稿,歡迎聯(lián)系我們哦~
技術(shù)交流 QQ 群:1029741705;Bot 微信:megengine-bot
更多 MegEngine 信息獲取,您可以:查看文檔:https://www.megengine.org.cn/doc/stable/zh/
GitHub 項目: https://github.com/MegEngine
歡迎參與 MegEngine 社區(qū)貢獻,成為?Awesome MegEngineer:https://www.megengine.org.cn/community-AMGE,榮譽證書、定制禮品享不停。