當前位置:
首頁 > 科技 > 漲姿勢!「手動」調試神經網路,可以這樣做

漲姿勢!「手動」調試神經網路,可以這樣做

圖:pixabay

原文來源:hackernoon

作者:AndreyNikishaev

「機器人圈」編譯:嗯~阿童木呀、多啦A亮

在計算機領域,即使是對業界專家來說,調試神經網路也是一項艱巨的任務。數百萬個參數混雜在一起,即使是一個小小的變化卻可以將你所有的努力付之一炬。如果沒有調試和可視化,你的所有行動都只不過是將一個硬幣彈出,卻沒有入罐,更糟糕的是它會浪費你的時間。在本文中我收集了一些方法,以幫助你能夠儘快找到問題所在並將其加以解決。

數據集問題

嘗試用小型數據集對你的模型進行過度擬合

一般來說,神經網路應該在數百次迭代中使你的數據過度擬合。如果在這過程中你的損失沒有降低,那你的問題就更嚴重了。

使用迭代邏輯來解決問題

嘗試構建最簡單的網路,以解決你的主要問題,然後逐步延伸到全局問題。例如,如果你正在創建風格遷移網路,請嘗試首先訓練你的腳本以便在一個圖像上進行風格遷移。如果它表現良好的話,接下來你要做的就是創建可以將風格遷移到任何圖像的模型。

使用適度失真數據集

例如,如果你想訓練網路以對數據進行分類,那麼你的訓練數據應該在每個類中都具有相同數量的輸入。而在其他情況下,就有可能會出現類中過度擬合的問題。神經網路並不是對於所有的失真都是不變的,而你需要基於此專門對它們進行訓練。因此,輸入失真會提高網路的精確度。

網路容量VS數據集大小

你的數據集應該足以讓網路學習。如果你具有小數據集和大網路,那麼它將停止學習(在某些情況下,這將導致大量不同輸入的結果相同)。如果你具有大數據集和小網路,那麼你會看到損失跳躍的情況,導致網路容量不能存儲如此多的信息。

使用平均中心化

這將從你的網路中移除噪音數據,提高訓練效果,並且在某些情況下還有助於解決NaN(無窮與非數值)問題。但請記住,如果你有時間序列數據,那麼你應該使用批處理中心化而不是全局。

神經網路問題

首先嘗試更為簡單的模型

我看到很多種情況,比如有很多人在第一次嘗試使用網路時便使用諸如ResNet-50,VGG19等這樣的標準大型網路,但是到後來發現,其實他們的問題使用僅有幾層的網路便可以解決。所以如果你沒有標準的大問題,你可以首先從小型網路開始。你添加的東西越多,就越難以訓練模型以解決你的問題,所以從小型網路開始也往往會節省很多時間。不過你還應該記住,大型網路會消耗大量內存、增添大量操作。

可視化是必須的

如果你現在使用的是Tensorflow,那麼一定要開始使用Tensorboard。如果沒有的話,請嘗試為你的框架找到一些可視化工具,或者自己動手編寫。因為這將有助於你在早期訓練階段就找到所存在的問題。你應該明確看到的事情包括以下幾種:損失、權重直方圖、變數和梯度。如果你處理的是計算機視覺(CV),那麼你需要始終可視化過濾器以了解網路正在看到的內容。

權重初始化

如果你不正確地設置權重,那麼你的網路很有可能因為零梯度或對所有神經元的類似更新而變得不可訓練。此外,你還應該記住,權重是與學習率相結合的,因此大的學習率和大的權重可能導致NaN問題。

對於小型網路來說,使用一些高斯分布initializer就足夠了。

對於深度網路來說,這些就沒那麼有效了,因為你的權重可能會多次相乘,從而導致產生一個非常小的數字,而這幾乎可以消除反向傳播過程中的梯度。而現在,得益於Ioffe和Szegedy,我們擁有了批量歸一化(,從而減輕了許多不必要的麻煩。

標準問題使用標準網路

有很多預訓練模型(1)(https://github.com/tensorflow/models)(2)(https://github.com/tensorflow/models/tree/master/slim#Pretrained),你可以馬上使用。在某些情況下,你可以立即使用它們,也可以使用微調技術,節省訓練時間。主要思想是,大多數網路容量對於不同的問題是一樣的。例如,如果我們談論的計算機視覺相比第一層網路將包括簡單的過濾器,如線條、點、角度與所有圖像相同,那麼你不需要重新訓練它。

使用學習率衰減

這幾乎總是會給你一個極大的推動力。Tensorflow有很多不同的衰減調度器。

使用Grid Search 、Random Search 或 Config file調整超參數

不要手動檢查所有參數,這是非常耗時且無效的。我通常對所有參數使用全局配置,運行檢查結果後,我將明確在哪個方向再做進一步調查。如果這種方法對你沒有幫助,那麼你可以使用Random Search或 Grid Search。

激活函數

1、梯度消失的問題

2、非零中心激活

例如Sigmoid、ReLU函數不以零為中心。這意味著在訓練期間,所有的梯度都將是正數或負數,將導致學習過程中的問題。這也是為什麼我們使用以零為中心輸入數據的原因。

3、ReLU失效

標準的ReLU函數也不是完美的。對於負數ReLU給0的問題,這意味著它們不會被激活,因此你的神經元的一部分將會失效,再也不會被使用。這可能發生的原因是學習率大和權重初始化錯誤。如果參數調整不能幫助你,你嘗試沒有這些問題的Leaky ReLU、PReLU、ELU或Maxout。

4、梯度爆炸

除了每一步梯度變得越來越大,爆炸問題與消失問題是一樣的。其中一個主要修復辦法是使用梯度剪裁,基本決定了梯度的硬性限制。

深層網路的精度退化

從一些點開始,真正深度的網路開始表現得像一部壞手機。因此,增加更多的層會降低網路精度。為了解決這個問題,我們使用通過所有圖層輸入的一部分輸入的殘差層——圖像瓶頸殘差層(bottleneck residual layer)。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

從線性回歸到神經網路,機器學習工程師的進階之路
用Python實現CNN長短期記憶網路!你也行
詳解徑向基函數神經網路RBNN,它和多層感知器MLP有何區別
K-NN聚類演算法的良好泛化,可用於數據簡化

TAG:機器人圈 |

您可能感興趣

奶咖新手必看,這才是手動打奶的正確姿勢!
你平時練核心力量嗎?這幾個徒手動作可以做做
肩背痛手動不起來?跪姿手掌伸展緩解肩周不適,讓你出拳如風
喵星人對著小刺蝟「動手動腳」,看到一身的刺卻又有點不敢下手!
在家如何練出粗壯三頭肌?三個徒手動作,都很簡單你來試試吧!
手感超好的小玩意,擼起來賊帶勁!爽得我不想手動!
來這裡動手動腳,保證你畫人物會有所進步!
這3種女人最好撩,隨意動手動腳,不會拒絕!
半自動狙擊槍如增加手動開拴,能否高精度?那就非半自動了,只能2選1
開手動檔的幾個壞習慣,看看你有沒有,毀車很危險!
孕期胎動的時候,寶寶是手動還是腳動呢?看完你就一清二楚了
自從穿了這件毛褲,再也沒有色狼對我動手動腳了
原來做家務也能這麼輕鬆!全程不用彎腰,也不用手動清潔的黑科技拖把,讓你愛上拖地!
手動建造一架魚鷹直升機?其實並不難,只需要懂得這些操作
怎麼辦,我想對你「動手動腳」
飛機那麼貴,為什麼艙門還是手動的?說出來你可能不信
手動對焦模式,原來這麼用
這樣「動手動腳」會讓妹子上癮
胎動一跳一跳的,是寶寶的手動還是腳動呢?有人說,寶寶是在打嗝
熊貓熱得不行了,已經開始手動降溫 網友:不如讓我來幫你!