如果你是人工神經(jīng)網(wǎng)絡(luò) (ANN) 的初學(xué)者,你可能會問一些問題。 比如要使用的隱藏層數(shù)量是多少? 每個隱藏層有多少個隱藏神經(jīng)元? 使用隱藏層/神經(jīng)元的目的是什么? 增加隱藏層/神經(jīng)元的數(shù)量總是能帶來更好的結(jié)果嗎? 使用什么損失函數(shù)? 使用多少個epoch? 使用什么權(quán)重初始化方法?
回答這些問題構(gòu)成了設(shè)計基于神經(jīng)網(wǎng)絡(luò)的項目架構(gòu)的基礎(chǔ)。 因此,明智地選擇這些參數(shù)當(dāng)然非常重要。
我很高興地告訴你我們可以回答此類問題。 需要明確的是,如果要解決的問題很復(fù)雜,那么回答這些問題可能會太復(fù)雜。 讀完本文后,你至少可以了解如何回答這些問題,并能夠根據(jù)簡單的示例自己進行測試。
推薦:用 NSDT設(shè)計器 快速搭建可編程3D場景。
1、基本的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
基于自然,神經(jīng)網(wǎng)絡(luò)是我們對大腦的通常表示:神經(jīng)元與其他神經(jīng)元互連形成網(wǎng)絡(luò)。 一條簡單的信息在成為實際事物之前會在許多人中傳遞,例如“移動手拿起這支鉛筆”。
完整的神經(jīng)網(wǎng)絡(luò)的操作很簡單:輸入變量作為輸入(例如,如果神經(jīng)網(wǎng)絡(luò)應(yīng)該告訴圖像上的內(nèi)容,則輸入圖像),經(jīng)過一些計算后,返回輸出(按照第一個示例, 給出貓的圖像應(yīng)該返回單詞“cat”)。
2、輸入神經(jīng)元
這是神經(jīng)網(wǎng)絡(luò)用于進行預(yù)測的特征數(shù)量。
輸入向量的每個特征需要一個輸入神經(jīng)元。 對于表格數(shù)據(jù),這是數(shù)據(jù)集中相關(guān)要素的數(shù)量。 您需要仔細選擇這些特征,并刪除任何可能包含無法泛化到訓(xùn)練集之外(并導(dǎo)致過度擬合)的模式的特征。 對于圖像,這些是圖像的尺寸(對于 MNIST,為 28*28=784)。
3、輸出神經(jīng)元
這是你想要做出的預(yù)測數(shù)量。
回歸:對于回歸任務(wù),這可以是一個值(例如房價)。 對于多變量回歸,每個預(yù)測值有一個神經(jīng)元(例如,對于邊界框,它可以是 4 個神經(jīng)元 - 邊界框高度、寬度、x 坐標(biāo)、y 坐標(biāo)各一個)。
分類:對于二元分類(垃圾郵件-非垃圾郵件),我們?yōu)槊總€正類使用一個輸出神經(jīng)元,其中輸出表示正類的概率。 對于多類分類(例如,在對象檢測中,一個實例可以被分類為汽車、狗、房子等),我們每個類有一個輸出神經(jīng)元,并在輸出層使用 softmax 激活函數(shù)來確保 最終概率總和為 1。
4、隱層神經(jīng)元
隱藏層的數(shù)量很大程度上取決于問題和神經(jīng)網(wǎng)絡(luò)的架構(gòu)。 你本質(zhì)上是在嘗試進入完美的神經(jīng)網(wǎng)絡(luò)架構(gòu)——不太大,也不太小,恰到好處。
一般來說,1-5 個隱藏層就可以很好地解決大多數(shù)問題。 在處理圖像或語音數(shù)據(jù)時,你希望網(wǎng)絡(luò)具有數(shù)百層,但并非所有層都完全連接。 對于這些用例,有預(yù)先訓(xùn)練的模型(YOLO、ResNet、VGG),它們允許你使用其網(wǎng)絡(luò)的大部分,并在這些網(wǎng)絡(luò)之上訓(xùn)練你的模型以僅學(xué)習(xí)高階特征。 在這種情況下,你的模型仍然只有幾層需要訓(xùn)練。
一般來說,所有隱藏層使用相同數(shù)量的神經(jīng)元就足夠了。 對于某些數(shù)據(jù)集,擁有較大的第一層并隨后使用較小的層將帶來更好的性能,因為第一層可以學(xué)習(xí)許多較低級別的特征,這些特征可以輸入后續(xù)層中的一些高階特征。
通常,添加更多層會比在每層中添加更多神經(jīng)元獲得更多的性能提升。
我建議從 1-5 層和 1-100 個神經(jīng)元開始,然后慢慢添加更多層和神經(jīng)元,直到開始過度擬合。 你可以在權(quán)重和偏差儀表板中跟蹤損失和準(zhǔn)確性,以查看哪些隱藏層+隱藏神經(jīng)元組合會帶來最佳損失。
選擇較少數(shù)量的層/神經(jīng)元時需要記住的是,如果這個數(shù)量太小,你的網(wǎng)絡(luò)將無法學(xué)習(xí)數(shù)據(jù)中的底層模式,從而變得毫無用處。 解決這個問題的方法是從大量隱藏層 + 隱藏神經(jīng)元開始,然后使用 dropout 和提前停止來讓神經(jīng)網(wǎng)絡(luò)為你縮小自身規(guī)模。 再次,我建議嘗試一些組合并跟蹤權(quán)重和偏差儀表板中的性能,以確定適合你的問題的完美網(wǎng)絡(luò)大小。
著名研究員 Andrej Karpathy 也推薦過擬合然后正則化的方法——“首先獲得一個足夠大的模型,使其能夠過擬合(即關(guān)注訓(xùn)練損失),然后對其進行適當(dāng)?shù)恼齽t化(放棄一些訓(xùn)練損失以改善驗證損失)。”
5、損失函數(shù)
損失函數(shù)用于衡量預(yù)測輸出與提供的目標(biāo)值之間的誤差。 損失函數(shù)告訴我們算法模型距離實現(xiàn)預(yù)期結(jié)果還有多遠。 “損失”一詞是指模型因未能產(chǎn)生預(yù)期結(jié)果而受到的懲罰。
- 回歸
均方誤差是最常見的優(yōu)化損失函數(shù),除非存在大量異常值。 在這種情況下,使用平均絕對誤差 (MAE) 或 Huber 損失。
- 分類
在大多數(shù)情況下,交叉熵會很好地為您服務(wù)。
你可以從這篇文章中更深入地了解神經(jīng)網(wǎng)絡(luò)中的損失函數(shù)。
6、批大小
批大小是指一次迭代中使用的訓(xùn)練示例的數(shù)量。
大的批可能會很棒,因為它們可以利用 GPU 的強大功能每次處理更多訓(xùn)練實例。 OpenAI 發(fā)現(xiàn)較大的批量大?。▓D像分類和語言建模為數(shù)萬個,強化學(xué)習(xí)代理為數(shù)百萬個)非常適合擴展和并行化。
然而,也有適合較小批量的情況。 根據(jù) Masters 和 Luschi 的這篇論文,通過運行大批量提高并行性所獲得的優(yōu)勢被小批量提高的性能通用性和更小的內(nèi)存占用所抵消。 他們表明,增加批量大小會降低提供穩(wěn)定收斂的可接受的學(xué)習(xí)率范圍。 他們的結(jié)論是,事實上,越小越好; 并且最佳性能是通過 2 到 32 之間的小批量大小獲得的。
如果你沒有進行大規(guī)模操作,我建議你從較小的批大小開始,然后慢慢增加大小并在權(quán)重和偏差儀表板中監(jiān)控性能以確定最適合的。
7、輪次數(shù)
我建議人們應(yīng)該從大量的 epoch 開始,并在每個 epoch 的性能停止改善時使用 Early Stopping 來停止訓(xùn)練。
8、學(xué)習(xí)率
選擇學(xué)習(xí)率非常重要,你要確保正確選擇! 理想情況下,當(dāng)你調(diào)整網(wǎng)絡(luò)的其他超參數(shù)時,希望重新調(diào)整學(xué)習(xí)率。
要找到最佳學(xué)習(xí)率,請從非常低的值 (10^-6) 開始,然后慢慢地將其乘以常數(shù),直到達到非常高的值(例如 10)。 在權(quán)重和偏差儀表板中測量模型性能(相對于學(xué)習(xí)率的對數(shù)),以確定哪個速率可以很好地解決你的問題。 然后,你可以使用此最佳學(xué)習(xí)率重新訓(xùn)練你的模型。
最佳學(xué)習(xí)率通常是導(dǎo)致模型發(fā)散的學(xué)習(xí)率的一半。 請隨意在隨附的代碼中為 learn_rate 設(shè)置不同的值,并查看它如何影響模型性能,以培養(yǎng)你對學(xué)習(xí)率的直覺。
我還建議使用 Leslie Smith 提出的學(xué)習(xí)率查找方法。 這是為大多數(shù)梯度優(yōu)化器(SGD 的大多數(shù)變體)找到良好學(xué)習(xí)率的絕佳方法,并且適用于大多數(shù)網(wǎng)絡(luò)架構(gòu)。
另請參閱下面有關(guān)學(xué)習(xí)率表的部分。
9、動量
比較有動量和沒有動量的 SGD 算法的學(xué)習(xí)路徑
梯度下降采取微小、一致的步驟接近局部最小值,當(dāng)梯度很小時,可能需要很長時間才能收斂。 另一方面,動量考慮了之前的梯度,并通過更快地越過山谷并避免局部最小值來加速收斂。
一般來說,你希望動量值非常接近 1。 對于較小的數(shù)據(jù)集來說,0.9 是一個不錯的起點,數(shù)據(jù)集越大,你希望逐漸接近 1 (0.999)。 (設(shè)置nesterov=True可以讓動量考慮到當(dāng)前點之前幾步的成本函數(shù)的梯度,這使得它稍微更準(zhǔn)確和更快。)
10、梯度消失和爆炸
就像人一樣,并非所有神經(jīng)網(wǎng)絡(luò)層都以相同的速度學(xué)習(xí)。 因此,當(dāng)反向傳播算法將誤差梯度從輸出層傳播到第一層時,梯度會變得越來越小,直到到達第一層時幾乎可以忽略不計。 這意味著第一層的權(quán)重在每一步都不會顯著更新。
這就是梯度消失的問題。 (當(dāng)某些層的梯度逐漸變大時,就會出現(xiàn)類似的梯度爆炸問題,導(dǎo)致某些層而不是其他層的權(quán)重大量更新。)
有幾種方法可以抵消梯度消失。 現(xiàn)在讓我們來看看它們吧!
11、隱層激活函數(shù)
一般來說,使用不同激活函數(shù)的性能按以下順序提高(從最低→最高性能):
logistic → tanh → ReLU → Leaky ReLU → ELU → SELU
ReLU 是最流行的激活函數(shù),如果您不想調(diào)整激活函數(shù),ReLU 是一個很好的起點。 但是,請記住,ReLU 的吸引力越來越不如 ELU 或 GELU。
如果你感覺很熱鬧,可以嘗試以下操作:
- 對抗神經(jīng)網(wǎng)絡(luò)過度擬合:RReLU
- 減少運行時延遲:leaky ReLU
- 對于大規(guī)模訓(xùn)練集:PReLU
- 快速推理:leaky ReLU
- 如果你的網(wǎng)絡(luò)沒有自我規(guī)范化:ELU
- 對于整體穩(wěn)健的激活函數(shù):SELU
與往常一樣,不要害怕嘗試不同的激活功能,并轉(zhuǎn)向你的權(quán)重和偏差儀表板來幫助您選擇最適合你的激活函數(shù)!
可以參考這篇研究論文,該論文深入探討了神經(jīng)網(wǎng)絡(luò)中使用的不同激活函數(shù)的比較。
12、輸出層激活函數(shù)
回歸:回歸問題的輸出神經(jīng)元不需要激活函數(shù),因為我們希望輸出具有任何值。 如果我們希望輸出值限制在某個范圍內(nèi),我們可以對 -1→1 值使用 tanh,對 0→1 值使用logistic函數(shù)。 如果我們只尋找正輸出,我們可以使用 softplus 激活(ReLU 激活函數(shù)的平滑逼近)。
分類:使用sigmoid激活函數(shù)進行二分類,保證輸出被擠壓在0和1之間。使用softmax進行多類分類,保證輸出概率加起來為1。
13、權(quán)重初始化方法
正確的權(quán)重初始化方法可以大大加快收斂時間。 初始化方法的選擇取決于你的激活函數(shù)。 一些值得嘗試的事情:
- 當(dāng)使用ReLU或leaky RELU時,使用He初始化
- 當(dāng)使用SELU或ELU時,使用LeCun初始化
- 當(dāng)使用softmax、logistic或tanh時,使用Glorot初始化
- 大多數(shù)初始化方法都是均勻分布和正態(tài)分布的。
14、批歸一化
批歸一化學(xué)習(xí)每層輸入的最佳均值和尺度。 它通過零中心化和標(biāo)準(zhǔn)化其輸入向量,然后縮放和移動它們來實現(xiàn)這一點。 它也像一個正則化器,這意味著我們不需要 dropout 或 L2 reg。
使用批歸一化可以讓我們使用更大的學(xué)習(xí)率(這會導(dǎo)致更快的收斂),并通過減少梯度消失問題在大多數(shù)神經(jīng)網(wǎng)絡(luò)中帶來巨大的進步。 唯一的缺點是它幾乎不會增加訓(xùn)練時間,因為每層都需要額外的計算。
15、梯度剪裁
減少梯度爆炸的好方法之一,特別是在訓(xùn)練 RNN 時,就是在梯度超過某個值時簡單地對其進行裁剪。 我建議嘗試剪輯標(biāo)準(zhǔn)化而不是剪輯值,這使我們能夠保持梯度向量的方向一致。 剪輯歸一化包含 l2 范數(shù)大于特定閾值的任何梯度。
嘗試幾個不同的閾值以找到最適合你的閾值。
16、提前停止
提前停止可以讓你通過訓(xùn)練具有更多隱藏層、隱藏神經(jīng)元和比你需要的更多時期的模型來實現(xiàn)它,并且當(dāng)性能在 n 個時期連續(xù)停止改善時停止訓(xùn)練。 它還為你保存性能最佳的模型。 可以通過在適合模型時設(shè)置回調(diào)并設(shè)置 save_best_only=True 來啟用提前停止。
17、Dropout
Dropout 是一種出色的正則化技術(shù),它為我們帶來了巨大的性能提升(對于最先進的模型來說約為 2%),而該技術(shù)實際上是多么簡單。 Dropout 所做的就是在每個訓(xùn)練步驟中隨機關(guān)閉每一層的一定比例的神經(jīng)元。 這使得網(wǎng)絡(luò)更加穩(wěn)健,因為它不能依賴任何特定的輸入神經(jīng)元集來進行預(yù)測。 知識分布在整個網(wǎng)絡(luò)中。 在訓(xùn)練過程中會生成大約 2^n(其中 n 是架構(gòu)中神經(jīng)元的數(shù)量)稍微獨特的神經(jīng)網(wǎng)絡(luò),并將其集成在一起以進行預(yù)測。
良好的dropout率在 0.1 到 0.5 之間; RNN 為 0.3,CNN 為 0.5。 對于更大的層使用更大的速率。 增加 dropout 率可以減少過擬合,而降低 dropout 率則有助于對抗欠擬合。
你想要在網(wǎng)絡(luò)的早期層中試驗不同的丟失率值,并檢查權(quán)重和偏差儀表板以選擇性能最佳的一個。 你絕對不想在輸出層中使用 dropout。
在將 Dropout 與 BatchNorm 結(jié)合使用之前,請閱讀本文。
在此內(nèi)核中,我使用了 AlphaDropout,這是一種普通 dropout,通過保留輸入的均值和標(biāo)準(zhǔn)差,可以與 SELU 激活函數(shù)很好地配合。
18、優(yōu)化器
梯度下降并不是神經(jīng)網(wǎng)絡(luò)中使用的唯一優(yōu)化器。 我們可以選擇幾種不同的。 在本文中,我只是描述一些你可以選擇的優(yōu)化器。 可以查看這篇文章,其中我詳細討論了所有優(yōu)化器。
如果你非常關(guān)心收斂的質(zhì)量并且時間不是最重要的,我建議使用隨機梯度下降(SGD)。
如果你關(guān)心收斂時間并且接近最佳收斂的點就足夠了,請嘗試使用 Adam、Nadam、RMSProp 和 Adamax 優(yōu)化器。 你的權(quán)重和偏差儀表板將引導(dǎo)你找到最適合的優(yōu)化器!
Adam/Nadam 通常是很好的起點,并且往往對學(xué)習(xí)遲緩和其他非最佳超參數(shù)相當(dāng)寬容。
根據(jù) Andrej Karpathy 的說法,就 ConvNet 而言,“經(jīng)過良好調(diào)整的 SGD 幾乎總是會稍微優(yōu)于 Adam”。
在此內(nèi)核中,我從 Nadam 獲得了最佳性能,這只是帶有 Nesterov 技巧的常規(guī) Adam 優(yōu)化器,因此比 Adam 收斂得更快。
19、學(xué)習(xí)率調(diào)度
我們已經(jīng)討論過良好學(xué)習(xí)率的重要性 - 我們不希望它太高,以免成本函數(shù)圍繞最佳值跳舞并發(fā)散。 我們也不希望它太低,因為這意味著收斂將需要很長時間。
照顧學(xué)習(xí)率可能很困難,因為較高和較低的學(xué)習(xí)率都有其優(yōu)點。 好消息是我們不必承諾一個學(xué)習(xí)率! 通過學(xué)習(xí)速率調(diào)度,我們可以從較高的速率開始,以更快地通過梯度斜率,并在我們到達超參數(shù)空間中的梯度谷時放慢速度,這需要采取更小的步長。
調(diào)度學(xué)習(xí)率的方法有很多,包括以指數(shù)方式降低學(xué)習(xí)率、使用階躍函數(shù)、在性能開始下降時調(diào)整學(xué)習(xí)率或使用 1cycle 調(diào)度。 在此內(nèi)核中,我向你展示了如何使用ReduceLROnPlateau回調(diào)在n個時期內(nèi)性能下降時將學(xué)習(xí)率降低一個常數(shù)因子。
我強烈建議也嘗試 1cycle 調(diào)度。
使用恒定的學(xué)習(xí)率,直到訓(xùn)練完所有其他超參數(shù)。 并在最后實施學(xué)習(xí)率衰減調(diào)度。
與大多數(shù)事情一樣,我建議使用不同的調(diào)度策略運行一些不同的實驗,并使用權(quán)重和偏差儀表板來選擇能夠產(chǎn)生最佳模型的模型。文章來源:http://www.zghlxwxcb.cn/news/detail-561187.html
原文鏈接:神經(jīng)網(wǎng)絡(luò)設(shè)計FAQ — BimAnt文章來源地址http://www.zghlxwxcb.cn/news/detail-561187.html
到了這里,關(guān)于神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計常見問題及解答的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!