鍵.png)
使用這些基本 REST API 最佳實(shí)踐構(gòu)建出色的 API
那如果GC失敗,可能網(wǎng)絡(luò)某些部分有問題,也有可能整個(gè)網(wǎng)絡(luò)都有問題了!你也不知道哪出錯(cuò)了,那怎么辦呢?構(gòu)建一個(gè)可視化過程監(jiān)控每一個(gè)環(huán)節(jié),這可以讓你清楚知道你的網(wǎng)絡(luò)的每一地方是否有問題!!這里還有一個(gè)trick,先構(gòu)建一個(gè)簡單的任務(wù)(比如你做MNIST數(shù)字識(shí)別,你可以先識(shí)別0和1,如果成功可以再加入更多識(shí)別數(shù)字);然后從簡單到復(fù)雜逐步來檢測你的model,看哪里有問題。舉個(gè)例子吧,先用固定的data通過單層softmax看feedforward效果,然后BP效果,然后增加單層單個(gè)neuron unit看效果;增加一層多個(gè);增加bias。。。。。直到構(gòu)建出最終的樣子,系統(tǒng)化的檢測每一步!
更放心一點(diǎn),可視化每一層feedforward輸出的取值范圍,梯度范圍,通過修改使其落入激活函數(shù)的中間區(qū)域范圍(梯度類似線性);如果是ReLU則保證不要輸出大多為負(fù)數(shù)就好,可以給bias一點(diǎn)正直的噪聲等。當(dāng)然還有一點(diǎn)就是不能讓神經(jīng)元輸出一樣,原因很簡單
mini-batch好處主要有:可以用矩陣計(jì)算加速并行;引入的隨機(jī)性可以避免困在局部最優(yōu)值;并行化計(jì)算多個(gè)梯度等。在此基礎(chǔ)上一些改進(jìn)也是很有效的(因?yàn)镾GD真的敏感),比如Momentum,他的意圖就是在原先的跟新基礎(chǔ)上增加一點(diǎn)摩擦力,有點(diǎn)向加速度對速度的作用,如果多次更新梯度都往一個(gè)方向,說明這個(gè)方向是對的,這時(shí)候增加跟新的步長,突然有一個(gè)方向,只會(huì)較少影響原來的方向,因?yàn)榭梢暂^少的數(shù)據(jù)帶來的誤差。當(dāng)你使用momentum時(shí)可以適當(dāng)減小global learning rate
momentum
方案一:當(dāng)驗(yàn)證誤差不再下降時(shí),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)重更新非常大,讓它們遠(yuǎn)離常規(guī)詞,學(xué)習(xí)到向量空間中距離度量的意義,出現(xiàn)非常多的詞(the,very,often)每次更新比較小。
adagrad
按照上面式子,如果進(jìn)入一個(gè)local optimum,參數(shù)可能無法更新時(shí),可以考慮每隔一段epoch,reset sum項(xiàng)
如果沒有,想辦法讓它過擬合!(r u kidding?! 哈哈),一般而言,當(dāng)參數(shù)多于training數(shù)據(jù)時(shí),模型是有能力記住數(shù)據(jù)的,總歸先保證模型的能力么
如果過擬合了,那么就可以進(jìn)一步優(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í)數(shù)據(jù)不夠時(shí)也可以找類似任務(wù)做遷移學(xué)習(xí),fine-tuning等。
最后,可以看到一個(gè)網(wǎng)絡(luò)那么多的超參數(shù),怎么去選這些超參數(shù)呢?文章也說了:
Random hyperparameter search!
以上提的多是supervised learning,對于unsupervised learning可以做fine tuning
接下來按一些模塊具體列舉下,歡迎補(bǔ)充?。?/p>
論文鏈接:
https://link.springer.com/chapter/10.1007/978-3-642-35289-8_26
很多machine learning模型都需要,在此不多論述,神經(jīng)網(wǎng)絡(luò)假設(shè)inputs/outputs服從近似均值為0方差為1分布。主要為了公平對待每個(gè)特征;使優(yōu)化過程變得平穩(wěn);消除量綱影響等
z-score; min-max; decimal scaling等
有點(diǎn)類似于在模型中按一個(gè)監(jiān)控系統(tǒng)(預(yù)處理,訓(xùn)練,預(yù)測過程中都要),這個(gè)步驟可以幫助你發(fā)現(xiàn)你的模型在哪里出了問題,最好可以找到可視化的方法,一目了然,比如圖像方面就很直觀了。
現(xiàn)實(shí)中同樣的數(shù)據(jù)可以有不同的表達(dá)方式,比如移動(dòng)的汽車,你從不同角度位置去觀察,它做的都是同樣的事情。你應(yīng)該確保從南面觀察和從西面觀察的同樣的數(shù)據(jù),應(yīng)該是相似的!
增加Dropout,隨機(jī)過程,噪聲,data augumentation等。就算數(shù)據(jù)足夠多,你認(rèn)為不可能over-fitting,那么最好還是有正則,如dropout(0.99)
太大的batch size會(huì)減gradient descend的隨機(jī)性,對模型的精度產(chǎn)生負(fù)面影響。
如果可以容忍訓(xùn)練時(shí)間過長,最好開始使用盡量小的batch size(16,8,1)
去掉gradient clipping(一般默認(rèn)有),訓(xùn)練過程中,找到最大的,使模型error不會(huì)爆掉的lr,然后用稍微小一點(diǎn)的lr訓(xùn)練
限制輸出的范圍,一般不用任何激活
需要仔細(xì)考慮輸入是什么,標(biāo)準(zhǔn)化之后的輸出的取值范圍,如果輸出有正有負(fù),你用ReLU,sigmoid明顯不行;多分類任務(wù)一般用softmax(相當(dāng)于對輸出歸一化為概率分布)
使用ReLU激活函數(shù),由于其在小于零范圍梯度為0,可能會(huì)影響模型性能,甚至模型不會(huì)在更新
當(dāng)發(fā)現(xiàn)模型隨著epoch進(jìn)行,訓(xùn)練error不變化,可能所以神經(jīng)元都“死”了。這時(shí)嘗試更換激活函數(shù)如leaky ReLU,ELU,再看訓(xùn)練error變化
一般說隨機(jī)初始化為一些小的數(shù),沒那么簡單,一些網(wǎng)絡(luò)結(jié)構(gòu)需要一些特定的初始化方法,初始化不好很可能得不到文章上的效果!可以去嘗試一些流行的找到有用的初始化
都說深度網(wǎng)絡(luò)精度更高,但深度不是盲目堆起來的,一定要在淺層網(wǎng)絡(luò)有一定效果的基礎(chǔ)上,增加深度。深度增加是為了增加模型的準(zhǔn)確率,如果淺層都學(xué)不到東西,深了也沒效果。
開始一般用3-8層,當(dāng)效果不錯(cuò)時(shí),為了得到更高的準(zhǔn)確率,再嘗試加深網(wǎng)絡(luò)
最好參考researcher在相似的任務(wù)上結(jié)構(gòu),一般256-1024
太多:訓(xùn)練慢,難去除噪聲(over-fitting)
太少:擬合能力下降
多分類任務(wù)一般用cross-entropy不用MSE
對中間隱層使用L1正則,通過懲罰系數(shù)控制隱含節(jié)點(diǎn)稀疏程度
不穩(wěn)定算法,設(shè)定不同的學(xué)習(xí)速率,結(jié)果差距大,需要仔細(xì)調(diào)節(jié)
一般希望開始大,加速收斂,后期小,穩(wěn)定落入局部最優(yōu)解。
也可采用自適應(yīng)的算法,Adam,Adagrad,Adadelta等減輕調(diào)參負(fù)擔(dān)(一般使用默認(rèn)值就可以)
神經(jīng)網(wǎng)絡(luò)是特征學(xué)習(xí)方法,其能力取決隱層,更多的連接意味著參數(shù)爆炸的增長,模型復(fù)雜直接導(dǎo)致很多問題。比如嚴(yán)重過擬合,過高的計(jì)算復(fù)雜度。
CNN其優(yōu)越的性能十分值得使用,參數(shù)數(shù)量只和卷積核大小,數(shù)量有關(guān),保證隱含節(jié)點(diǎn)數(shù)量(與卷積步長相關(guān))的同時(shí),大量降低了參數(shù)的數(shù)量!當(dāng)然CNN更多用于圖像,其他任務(wù)靠你自己抽象啦,多多嘗試!
這里簡單介紹一些CNN的trick
小的細(xì)節(jié)和其他很像,簡單說兩句個(gè)人感覺的其他方面吧,其實(shí)RNN也是shortcut結(jié)構(gòu)
文章轉(zhuǎn)自微信公眾號(hào)@算法進(jìn)階