那如果GC失敗,可能網(wǎng)絡(luò)某些部分有問題,也有可能整個網(wǎng)絡(luò)都有問題了!你也不知道哪出錯了,那怎么辦呢?構(gòu)建一個可視化過程監(jiān)控每一個環(huán)節(jié),這可以讓你清楚知道你的網(wǎng)絡(luò)的每一地方是否有問題! ! 這里還有一個trick,先構(gòu)建一個簡單的任務(wù) (比如你做MNIST數(shù)字識別,你可以先識別0和1,如果成功可以再加入更多識別數(shù)字);然后從簡單到復(fù)雜逐步來檢測你的model,看哪里有問題。 舉個例子吧,先用固定的data通過單層softmax看feedforward效果,然后BP效果,然后增加單層單個neuron unit看效果;增加一層多個;增加bias。。。。。直到構(gòu)建出最終的樣子,系統(tǒng)化的檢測每一步!
參數(shù)初始化也是重要滴! 其主要考慮點在于你的激活函數(shù)的取值范圍和梯度較大的范圍! 隱層的bias一般初始化為0就可以;輸出層的bias可以考慮用reverse activation of mean targets或者mean targets(很直觀對不對) weights初始化一般較小的隨機數(shù),比如Uniform,Gaussion
更放心一點,可視化每一層feedforward輸出的取值范圍,梯度范圍,通過修改使其落入激活函數(shù)的中間區(qū)域范圍(梯度類似線性);如果是ReLU則保證不要輸出大多為負數(shù)就好,可以給bias一點正直的噪聲等 。當然還有一點就是不能讓神經(jīng)元輸出一樣,原因很簡單
優(yōu)化算法, 一般用mini-batch SGD,絕對不要用full batch gradient(慢)。一般情況下,大數(shù)據(jù)集用2nd order batch method比如L-BFGS較好 ,但是會有大量額外計算2nd過程; 小數(shù)據(jù)集,L-BFGS或共軛梯度較好。 (Large-batch L-BFGS extends the reach of L-BFGSLe et al. ICML 2001)
mini-batch好處主要有: 可以用矩陣計算加速并行;引入的隨機性可以避免困在局部最優(yōu)值;并行化計算多個梯度等 。在此基礎(chǔ)上一些改進也是很有效的(因為SGD真的敏感),比如Momentum,他的意圖就是在原先的跟新基礎(chǔ)上增加一點摩擦力,有點向加速度對速度的作用, 如果多次更新梯度都往一個方向,說明這個方向是對的,這時候增加跟新的步長,突然有一個方向,只會較少影響原來的方向,因為可以較少的數(shù)據(jù)帶來的誤差。當你使用momentum時可以適當減小global learning rate
momentum
方案一:當驗證誤差不再下降時,lr減小為原來的0.5
方案二:采用理論上可以保證收斂的減小比例,O(1/t),t是迭代次數(shù)
方案三:最好用自適應(yīng)的學(xué)習(xí)率,比如Adagrad(Duchi et al. 2010)等
簡要說明一下,Adagrad非常適合數(shù)據(jù)出現(xiàn)頻度不一樣的模型,比如word2vec ,你肯定希望出現(xiàn)非常少的詞語權(quán)重更新非常大,讓它們遠離常規(guī)詞,學(xué)習(xí)到向量空間中距離度量的意義,出現(xiàn)非常多的詞(the,very,often)每次更新比較小。
adagrad
按照上面式子,如果進入一個local optimum,參數(shù)可能無法更新時,可以考慮每隔一段epoch,reset sum項
看看你的模型有沒有能力過擬合! (training error vs. validation error)
如果沒有,想辦法讓它過擬合 !(r u kidding?! 哈哈),一般而言,當參數(shù)多于training數(shù)據(jù)時,模型是有能力記住數(shù)據(jù)的, 總歸先保證模型的能力么
如果過擬合了,那么就可以進一步優(yōu)化啦,一般深度學(xué)習(xí) breakthrough的方法都是來自于更好的regularization?method ,解決過擬合很多方法在此就不多論述了。比如減小模型(layers, units);L1,L2正則(weight decay);early stop(按照數(shù)據(jù)集大小,每隔一段epoch(比如小數(shù)據(jù)集每隔5epoch,大的每隔(1/3epoch))保存模型,最后選擇validation error 最小的模型);sparsity constraints on hidden activation;Dropout;data
augumentation (CNN 一些變化不變性要注意)等
======================================================
大體流程如上,再引一篇大神之作,Practical Recommendations for Gradient-Based Training of Deep Architectures Y. Bengio(2012) ,額外提到的有unsupervised預(yù)訓(xùn)練 。其實數(shù)據(jù)不夠時也可以找類似任務(wù)做遷移學(xué)習(xí),fine-tuning等。
最后,可以看到一個網(wǎng)絡(luò)那么多的超參數(shù),怎么去選這些超參數(shù)呢?文章也說了:
Random hyperparameter search!
以上提的多是supervised learning ,對于unsupervised learning 可以做fine tuning 接下來按一些模塊具體列舉下,歡迎補充?。?/p>
論文鏈接:
https://link.springer.com/chapter/10.1007/978-3-642-35289-8_26
標準化(Normalization)
很多machine learning模型都需要,在此不多論述,神經(jīng)網(wǎng)絡(luò)假設(shè)inputs/outputs服從近似均值為0方差為1分布。 主要為了公平對待每個特征; 使優(yōu)化過程變得平穩(wěn);消除量綱影響等 z-score; min-max; decimal scaling等
scale控制特征的重要性:大scale的output特征產(chǎn)生更大的error;大的scale的input的特征可以主導(dǎo)網(wǎng)絡(luò)對此特征更敏感,產(chǎn)生大的update
一些特征本來取值范圍很小需要格外注意,避免產(chǎn)生NaNs
就算沒有標準化你的網(wǎng)絡(luò)可以訓(xùn)練的話,那可能前幾層也是做類似的事情,無形增加了網(wǎng)絡(luò)的復(fù)雜程度
通常都是把所有inputs的特征獨立地按同樣的規(guī)則標準化,如果對任務(wù)有特殊需求,某些特征可以特別對待
檢查結(jié)果(Results Check)
有點類似于在模型中按一個監(jiān)控系統(tǒng)(預(yù)處理,訓(xùn)練,預(yù)測過程中都要),這個步驟可以幫助你發(fā)現(xiàn)你的模型在哪里出了問題,最好可以找到可視化的方法,一目了然,比如圖像方面就很直觀了。
需要注意的是,你需要理解你設(shè)定的error的意義,就算訓(xùn)練過程error在不斷減少,也需要來和真實的error比較,雖然training error減少了,但是可能還不夠,真實世界中需要更小的error,說明模型學(xué)習(xí)的還不夠
當在training過程中work后,再去看在validation集上的效果
再更新網(wǎng)絡(luò)結(jié)構(gòu)前,最好確保每一個環(huán)節(jié)都有“監(jiān)控”,不要盲目做無用功
預(yù)處理(Pre-Processing Data)
現(xiàn)實中同樣的數(shù)據(jù)可以有不同的表達方式,比如移動的汽車,你從不同角度位置去觀察,它做的都是同樣的事情。你應(yīng)該確保從南面觀察和從西面觀察的同樣的數(shù)據(jù),應(yīng)該是相似的!
神經(jīng)網(wǎng)絡(luò)假設(shè)數(shù)據(jù)的分布空間是連續(xù)的
減少數(shù)據(jù)表示多樣性帶來的誤差;間接減少了網(wǎng)絡(luò)前幾層做沒必要的“等同”映射帶來的復(fù)雜度
正則化(Regularization)
增加Dropout,隨機過程,噪聲,data augumentation等。就算數(shù)據(jù)足夠多,你認為不可能over-fitting,那么最好還是有正則,如dropout(0.99)
一方面緩解過擬合 ,另一方面引入的隨機性,可以平緩訓(xùn)練過程,加速訓(xùn)練過程,處理outliers
Dropout可以看做ensemble,特征采樣,相當于bagging很多子網(wǎng)絡(luò);訓(xùn)練過程中動態(tài)擴展擁有類似variation的輸入數(shù)據(jù)集。(在單層網(wǎng)絡(luò)中,類似折中Naiive bayes(所有特征權(quán)重獨立)和logistic regression(所有特征之間有關(guān)系);
一般對于越復(fù)雜的大規(guī)模網(wǎng)絡(luò),Dropout效果越好,是一個強regularizer!
最好的防止over-fitting就是有大量不重復(fù)數(shù)據(jù)
Batch Size太大
太大的batch size會減gradient descend的隨機性,對模型的精度產(chǎn)生負面影響。 如果可以容忍訓(xùn)練時間過長,最好開始使用盡量小的batch size(16,8,1)
大的batch size需要更多的epoch來達到較好的水平
原因1:幫助訓(xùn)練過程中跳出local minima
原因2:使訓(xùn)練進入較為平緩的local minima,提高泛化性
學(xué)習(xí)率lr
去掉gradient clipping(一般默認有),訓(xùn)練過程中,找到最大的,使模型error不會爆掉的lr,然后用稍微小一點的lr訓(xùn)練
一般數(shù)據(jù)中的outliers會產(chǎn)生大的error,進而大的gradient,得到大的weight update,會使最優(yōu)的lr比較難找
預(yù)處理好數(shù)據(jù)(去除outliers),lr設(shè)定好一般無需clipping
如果error explode,那么加gradient clipping只是暫時緩解,原因還是數(shù)據(jù)有問題
最后一層的激活函數(shù)
限制輸出的范圍,一般不用任何激活 需要仔細考慮輸入是什么,標準化之后的輸出的取值范圍,如果輸出有正有負,你用ReLU,sigmoid明顯不行;多分類任務(wù)一般用softmax(相當于對輸出歸一化為概率分布)
激活只是一個映射,理論上都可以
如果輸出沒有error明顯也不行,那就沒有g(shù)radient,模型也學(xué)不到什么
一般用tanh,產(chǎn)生一個問題就是梯度在-1或1附近非常小,神經(jīng)元飽和學(xué)習(xí)很慢,容易產(chǎn)生梯度消息,模型產(chǎn)生更多接近-1或1的值
Bad Gradient(Dead Neurons)
使用ReLU激活函數(shù),由于其在小于零范圍梯度為0,可能會影響模型性能,甚至模型不會在更新 當發(fā)現(xiàn)模型隨著epoch進行,訓(xùn)練error不變化,可能所以神經(jīng)元都“死”了。這時嘗試更換激活函數(shù)如leaky ReLU,ELU,再看訓(xùn)練error變化
使用ReLU時需要給參數(shù)加一點噪聲,打破完全對稱避免0梯度,甚至給biases加噪聲
相對而言對于sigmoid,因為其在0值附近最敏感,梯度最大,初始化全為0就可以啦
任何關(guān)于梯度的操作,比如clipping, rounding, max/min都可能產(chǎn)生類似的問題
ReLU相對Sigmoid優(yōu)點:單側(cè)抑制;寬闊的興奮邊界;稀疏激活性;解決梯度消失
初始化權(quán)重
一般說隨機初始化為一些小的數(shù),沒那么簡單,一些網(wǎng)絡(luò)結(jié)構(gòu)需要一些特定的初始化方法,初始化不好很可能得不到文章上的效果!可以去嘗試一些流行的找到有用的初始化
太?。盒盘杺鬟f逐漸縮小難以產(chǎn)生作用
太大:信號傳遞逐漸放大導(dǎo)致發(fā)散和失效
比較流行的有 ‘he’, ‘lecun’, ‘Xavier’(讓權(quán)重滿足0均值,2/(輸入節(jié)點數(shù)+輸出節(jié)點數(shù)))
biases一般初始化為0就可以
每一層初始化都很重要
網(wǎng)絡(luò)太深
都說深度網(wǎng)絡(luò)精度更高,但深度不是盲目堆起來的,一定要在淺層網(wǎng)絡(luò)有一定效果的基礎(chǔ)上,增加深度。深度增加是為了增加模型的準確率,如果淺層都學(xué)不到東西,深了也沒效果。 開始一般用3-8層,當效果不錯時,為了得到更高的準確率,再嘗試加深網(wǎng)絡(luò)
所以的優(yōu)化方法在淺層也有用,如果效果不好,絕對不是深度不夠
訓(xùn)練和預(yù)測過程隨著網(wǎng)絡(luò)加深變慢
Hidden neurons的數(shù)量
最好參考researcher在相似的任務(wù)上結(jié)構(gòu),一般256-1024 太多:訓(xùn)練慢,難去除噪聲(over-fitting) 太少:擬合能力下降
考慮真實變量有多少信息量需要傳遞,然后再稍微增加一點(考慮dropout;冗余表達;估計的余地)
分類任務(wù):初始嘗試5-10倍類別個數(shù)
回歸任務(wù):初始嘗試2-3倍輸入/輸出特征數(shù)
這里直覺很重要
最終影響其實不大,只是訓(xùn)練過程比較慢,多嘗試
loss function
多分類任務(wù)一般用cross-entropy不用MSE
多分類一般用softmax,在小于0范圍內(nèi)梯度很小,加一個log可以改善此問題
避免MSE導(dǎo)致的學(xué)習(xí)速率下降,學(xué)習(xí)速率受輸出誤差控制(自己推一下就知道了)
AE降維
對中間隱層使用L1正則,通過懲罰系數(shù)控制隱含節(jié)點稀疏程度
SGD
不穩(wěn)定算法,設(shè)定不同的學(xué)習(xí)速率,結(jié)果差距大,需要仔細調(diào)節(jié) 一般希望開始大,加速收斂,后期小,穩(wěn)定落入局部最優(yōu)解。 也可采用自適應(yīng)的算法,Adam,Adagrad,Adadelta等減輕調(diào)參負擔(一般使用默認值就可以)
對于SGD需要對學(xué)習(xí)率,Momentum,Nesterov等進行復(fù)雜調(diào)參
值得一提是神經(jīng)網(wǎng)絡(luò)很多局部最優(yōu)解都可能達到較好的效果,而全局最優(yōu)解反而是容易過擬合的解
CNN的使用
神經(jīng)網(wǎng)絡(luò) 是特征學(xué)習(xí)方法,其能力取決隱層,更多的連接意味著參數(shù)爆炸的增長,模型復(fù)雜直接導(dǎo)致很多問題。比如嚴重過擬合,過高的計算復(fù)雜度。 CNN其優(yōu)越的性能十分值得使用,參數(shù)數(shù)量只和卷積核大小,數(shù)量有關(guān),保證隱含節(jié)點數(shù)量(與卷積步長相關(guān))的同時,大量降低了參數(shù)的數(shù)量!當然CNN更多用于圖像,其他任務(wù)靠你自己抽象啦,多多嘗試!
這里簡單介紹一些CNN的trick
pooling或卷積尺寸和步長不一樣,增加數(shù)據(jù)多樣性
data augumentation,避免過擬合,提高泛化,加噪聲擾動
weight regularization
SGD使用decay的訓(xùn)練方法
最后使用pooling(avgpooling)代替全連接,減少參數(shù)量
maxpooling代替avgpooling,避免avgpooling帶來的模糊化效果
2個3×3代替一個5×5等,減少參數(shù),增加非線性映射,使CNN對特征學(xué)習(xí)能力強
3×3,2×2窗口
預(yù)訓(xùn)練方法等
數(shù)據(jù)預(yù)處理后(PCA,ZCA)喂給模型
輸出結(jié)果窗口ensemble
中間節(jié)點作為輔助輸出節(jié)點,相當于模型融合,同時增加反向傳播的梯度信號,提供了額外的正則化
1×1卷積,夸通道組織信息,提高網(wǎng)絡(luò)表達,可對輸出降維,低成本,性價比高,增加非線性映射,符合Hebbian原理
NIN增加網(wǎng)絡(luò)對不同尺度的適應(yīng)性,類似Multi-Scale思想
Factorization into small convolution,7×7用1×7和7×1代替,節(jié)約參數(shù),增加非線性映射
BN減少Internal Covariance Shift問題,提高學(xué)習(xí)速度,減少過擬合 ,可以取消dropout,增大學(xué)習(xí)率,減輕正則,減少光學(xué)畸變的數(shù)據(jù)增強
模型遇到退化問題考慮shortcut結(jié)構(gòu),增加深度
等等
RNN使用
小的細節(jié)和其他很像,簡單說兩句個人感覺的其他方面吧,其實RNN也是shortcut結(jié)構(gòu)
一般用LSTM結(jié)構(gòu)防止BPTT的梯度消失,GRU擁有更少的參數(shù),可以優(yōu)先考慮
預(yù)處理細節(jié),padding,序列長度設(shè)定,罕見詞語處理等
一般語言模型的數(shù)據(jù)量一定要非常大
Gradient Clipping
Seq2Seq結(jié)構(gòu)考慮attention,前提數(shù)據(jù)量大
序列模型考率性能優(yōu)良的CNN+gate結(jié)構(gòu)
一般生成模型可以參考GAN,VAE,產(chǎn)生隨機變量
RL的框架結(jié)合
數(shù)據(jù)量少考慮簡單的MLP
預(yù)測采用層級結(jié)構(gòu)降低訓(xùn)練復(fù)雜度
設(shè)計采樣方法,增加模型收斂速度
增加多級shortcut結(jié)構(gòu)
文章轉(zhuǎn)自微信公眾號@算法進階
我們有何不同?
API服務(wù)商零注冊
多API并行試用
數(shù)據(jù)驅(qū)動選型,提升決策效率
查看全部API→
??
熱門場景實測,選對API
#AI文本生成大模型API
對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對比試用API
限時免費