很多情況下,研究人員會(huì)遇到一個(gè)問題:使用機(jī)器學(xué)習(xí)框架實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò)可能與理論模型相去甚遠(yuǎn)。驗(yàn)證這款模型是否可靠,直接方式就是不斷修正和調(diào)參。例如,在 2018 年 8 月,谷歌大腦的 Ian Goodfellow 等人,通過引入由覆蓋性引導(dǎo)的模糊方法(coverage-guided fuzzing,CGF),推出了一款自動(dòng)為神經(jīng)網(wǎng)絡(luò) debug 的開源庫 TensorFuzz。
想要調(diào)試機(jī)器學(xué)習(xí)模型其實(shí)并不容易,因?yàn)檎?bug 這個(gè)過程需要付出的代價(jià)實(shí)在太高了。即便是對于相對簡單的前饋神經(jīng)網(wǎng)絡(luò),研究人員也需要經(jīng)常討論網(wǎng)絡(luò)架構(gòu)、權(quán)重初始化和網(wǎng)絡(luò)優(yōu)化等問題。
正如 Chase Robert 此前在 “如何最小化測試機(jī)器學(xué)習(xí)代碼” 的一篇文章中曾描述了這類問題:“神經(jīng)網(wǎng)絡(luò)會(huì)繼續(xù)訓(xùn)練,損失會(huì)持續(xù)減少;訓(xùn)練幾小時(shí)后會(huì)收斂,但效果卻很差……”
對此,在單一的工具之外,Cecelia Shao 通過提供一種思路以表達(dá)她對調(diào)試神經(jīng)網(wǎng)絡(luò)所遵循的五項(xiàng)原則:
從繁就簡
確認(rèn)模型損失
檢查中間輸出和連接
診斷參數(shù)
追蹤工作
1. 從繁就簡
具有正規(guī)化和學(xué)習(xí)率(learning rate)調(diào)度器的復(fù)雜架構(gòu)的神經(jīng)網(wǎng)絡(luò),將單一神經(jīng)網(wǎng)絡(luò)更難調(diào)試。
首先,構(gòu)建一個(gè)相對簡單的模型:構(gòu)建一個(gè)具有單個(gè)隱藏層的小模型,并進(jìn)行驗(yàn)證;然后逐漸添加模型的復(fù)雜性,同時(shí)檢驗(yàn)?zāi)P徒Y(jié)構(gòu)的每個(gè)層面(附加層、參數(shù)等)是否有效。
其次,在單個(gè)數(shù)據(jù)節(jié)點(diǎn)上訓(xùn)練模型:可以使用一兩個(gè)訓(xùn)練數(shù)據(jù)點(diǎn)(data point)以確認(rèn)模型是否過度擬合。神經(jīng)網(wǎng)絡(luò)應(yīng)立即過度擬合,訓(xùn)練準(zhǔn)確率為 100%,這表明模型符合;如果模型無法過度擬合這些數(shù)據(jù)點(diǎn),就證明太小或存在 bug。
2. 確認(rèn)模型損失
模型損失是評估模型性能的主要方式,也是模型設(shè)置重要參數(shù)以進(jìn)行評估的依據(jù),因此需要確保:
模型損失適用于任務(wù)(使用分類交叉熵?fù)p失(cross-entropy los)進(jìn)行多分類問題或使用 focal loss 以解決不平衡問題);
正確衡量損失函數(shù)的重要性。如果你使用多種類型的損失函數(shù),如 MSE、對抗性、L1、feature loss,,那么請確保所有損失以正確的方式排序。
3. 檢查中間輸出和連接
為了調(diào)試神經(jīng)網(wǎng)絡(luò),你需要理解神經(jīng)網(wǎng)絡(luò)內(nèi)部的動(dòng)態(tài)、不同中間層所起的作用,以及層與層之間是如何連接起來的。不過,你可能遇到以下問題:
不正確的梯度更新表達(dá)式
權(quán)重未得到應(yīng)用
梯度消失或爆發(fā)
如果梯度值為 0,則意味著優(yōu)化器中的學(xué)習(xí)率可能太小,且梯度更新的表達(dá)式不正確。
除了關(guān)注梯度的絕對值之外,還要確保監(jiān)視每個(gè)層匹配的激活、權(quán)重的大小。例如,參數(shù)更新的大?。?quán)重和偏差)應(yīng)為 1-e3。
需要指出的是,一種稱為 “Dying ReLU” 或“梯度消失”的現(xiàn)象中,ReLU 神經(jīng)元在學(xué)習(xí)其權(quán)重的負(fù)偏差項(xiàng)后將輸出為 0。這些神經(jīng)元不會(huì)在任何數(shù)據(jù)點(diǎn)上得到激活。
你可以采用梯度檢驗(yàn)(gradient checking)通過數(shù)值方法逼近梯度以檢驗(yàn)這些錯(cuò)誤。如果它接近計(jì)算梯度,則正確實(shí)施反向傳播。
關(guān)于可視化神經(jīng)網(wǎng)絡(luò)的主要方法,F(xiàn)aizan Shaikh 舉出了三個(gè)例子:
初始方法:展現(xiàn)訓(xùn)練模型的整體結(jié)構(gòu),這些方法包括展示神經(jīng)網(wǎng)絡(luò)各個(gè)層的形狀或過濾器(filters)以及每個(gè)層中的參數(shù);
基于激活的方法:破譯單個(gè)神經(jīng)元或一組神經(jīng)元的激活函數(shù);
基于梯度的方法:在訓(xùn)練模型時(shí),操作由前向或后向通道形成的梯度。
還有有許多可用的工具可用于可視化各個(gè)層的激活和連接,例如 ConX 和 Tensorboard。
4. 診斷參數(shù)
神經(jīng)網(wǎng)絡(luò)具有大量彼此相互作用的參數(shù),使得優(yōu)化也變得非常困難。
Batch size:你希望 batch size 可大到足以準(zhǔn)確評估誤差梯度,小到足以使隨機(jī)梯度下降(SGD)可以規(guī)范網(wǎng)絡(luò)。batch size 將導(dǎo)致學(xué)習(xí)過程在訓(xùn)練過程中以噪聲成本快速瘦臉,并可能導(dǎo)致優(yōu)化困難。
學(xué)習(xí)率(Learning rate):太低會(huì)導(dǎo)致收斂緩慢或陷入局部最小值的風(fēng)險(xiǎn),太高則會(huì)導(dǎo)致優(yōu)化發(fā)散。
機(jī)器學(xué)習(xí)框架,如 Keras、Tensorflow、PyTorch、MXNet 現(xiàn)在都有關(guān)于使用學(xué)習(xí)率收斂緩慢文檔或示例:
Keras
https://keras.io/callbacks/#learningratescheduler
Tensorflow - https://www.tensorflow.org/api_docs/python/tf/train/exponential_decay
PyTorch - https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html
MXNet - https://mxnet.incubator.apache.org/versions/master/tutorials/gluon/learning_rate_schedules.html
梯度剪切(Gradient clipping?):在反向傳播中,用于剪切參數(shù)梯度的最大值或最大范數(shù)。
Batch 標(biāo)準(zhǔn)化(normalization ):用于標(biāo)準(zhǔn)化每層的輸入,以對抗內(nèi)部協(xié)變量移位問題。
隨機(jī)梯度下降(Stochastic Gradient Descent ,SGD):使用動(dòng)量、自適應(yīng)學(xué)習(xí)率、Nesterov 更新。
正則化:對于構(gòu)建可推廣模型至關(guān)重要,因?yàn)樗黾恿藢δP蛷?fù)雜性或極端參數(shù)值的懲罰。同時(shí),它顯著降低了模型的方差,并且不顯著增加偏差。
Dropout:是另一種規(guī)范網(wǎng)絡(luò)以防止過度擬合的技術(shù)。在訓(xùn)練時(shí),以某個(gè)概率 p(超參數(shù))保持神經(jīng)元活動(dòng)來實(shí)現(xiàn)丟失,否則將其設(shè)置為 0。結(jié)果,網(wǎng)絡(luò)必須在每個(gè)訓(xùn)練 batch 中使用不同的參數(shù)子集,這減少了特定參數(shù)的變化而變得優(yōu)于其他參數(shù)。
5. 全程跟蹤工作
通過對工作更好地跟蹤,可以輕松查看和重現(xiàn)之前的試驗(yàn),以減少重復(fù)工作。
不過,手動(dòng)記錄信息可能很難做到且進(jìn)行多次實(shí)驗(yàn),像 comet.ml 這樣的工具可以幫助自動(dòng)追蹤數(shù)據(jù)集、更改代碼、實(shí)驗(yàn)歷史和生產(chǎn)模型,包括關(guān)于模型的關(guān)鍵信息,如超參數(shù)、模型性能指標(biāo)和環(huán)境細(xì)節(jié)。
神經(jīng)網(wǎng)絡(luò)對數(shù)據(jù)、參數(shù),甚至 packages 的微小變化都非常敏感,這導(dǎo)致了模型的性能下降。工作跟蹤是標(biāo)準(zhǔn)化環(huán)境和建模工作流程的第一步。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4749瀏覽量
100434 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8357瀏覽量
132328 -
訓(xùn)練模型
+關(guān)注
關(guān)注
1文章
35瀏覽量
3796
原文標(biāo)題:Debug神經(jīng)網(wǎng)絡(luò)的五項(xiàng)基本原則
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論