簡要介紹下tensorflow的計算圖 | 深度學(xué)習(xí)

文 | 七月在線
編 | 小七
解析一:
@陳運文:cnn的調(diào)參主要是在優(yōu)化函數(shù)、embedding的維度還要殘差網(wǎng)絡(luò)的層數(shù)幾個方面。
優(yōu)化函數(shù)方面有兩個選擇:sgd、adam,相對來說adam要簡單很多,不需要設(shè)置參數(shù),效果也還不錯。
embedding隨著維度的增大會出現(xiàn)一個最大值點,也就是開始時是隨維度的增加效果逐漸變好,到達(dá)一個點后,而后隨維度的增加,效果會變差。
殘差網(wǎng)絡(luò)的層數(shù)與embedding的維度有關(guān)系,隨層數(shù)的增加,效果變化也是一個凸函數(shù)。
另外還有激活函數(shù),dropout層和batchnormalize層的使用。激活函數(shù)推薦使用relu,dropout層數(shù)不易設(shè)置過大,過大會導(dǎo)致不收斂,調(diào)節(jié)步長可以是0.05,一般調(diào)整到0.4或者0.5就可找到最佳值。
以上是個人調(diào)參的一些經(jīng)驗,可供參考。
解析二
一、參數(shù)初始化
下面幾種方式,隨便選一個,結(jié)果基本都差不多。但是一定要做。否則可能會減慢收斂速度,影響收斂結(jié)果,甚至造成Nan等一系列問題。
下面的n_in為網(wǎng)絡(luò)的輸入大小,n_out為網(wǎng)絡(luò)的輸出大小,n為n_in或(n_in+n_out)*0.5
Xavier初始法論文:http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
He初始化論文:https://arxiv.org/abs/1502.01852
A)uniform均勻分布初始化:w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
①Xavier初始法,適用于普通激活函數(shù)(tanh,sigmoid):scale = np.sqrt(3/n)
②He初始化,適用于ReLU:scale = np.sqrt(6/n)
B)normal高斯分布初始化:w = np.random.randn(n_in,n_out) * stdev # stdev為高斯分布的標(biāo)準(zhǔn)差,均值設(shè)為0
①Xavier初始法,適用于普通激活函數(shù) (tanh,sigmoid):stdev = np.sqrt(n)
②He初始化,適用于ReLU:stdev = np.sqrt(2/n)
C)svd初始化:對RNN有比較好的效果。參考論文:https://arxiv.org/abs/1312.6120
二、數(shù)據(jù)預(yù)處理方式
zero-center ,這個挺常用的.X -= np.mean(X, axis = 0) # zero-centerX /= np.std(X, axis = 0) # normalize
PCA whitening,這個用的比較少.
三、訓(xùn)練技巧
要做梯度歸一化,即算出來的梯度除以minibatch size
clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減系系數(shù),讓value的值等于閾值: 5,10,15
dropout對小數(shù)據(jù)防止過擬合有很好的效果,值一般設(shè)為0.5,小數(shù)據(jù)上dropout+sgd在我的大部分實驗中,效果提升都非常明顯.因此可能的話,建議一定要嘗試一下。dropout的位置比較有講究, 對于RNN,建議放到輸入->RNN與RNN->輸出的位置.關(guān)于RNN如何用dropout,可以參考這篇論文:http://arxiv.org/abs/1409.2329
adam,adadelta等,在小數(shù)據(jù)上,我這里實驗的效果不如sgd, sgd收斂速度會慢一些,但是最終收斂后的結(jié)果,一般都比較好。如果使用sgd的話,可以選擇從1.0或者0.1的學(xué)習(xí)率開始,隔一段時間,在驗證集上檢查一下,如果cost沒有下降,就對學(xué)習(xí)率減半. 我看過很多論文都這么搞,我自己實驗的結(jié)果也很好. 當(dāng)然,也可以先用ada系列先跑,最后快收斂的時候,更換成sgd繼續(xù)訓(xùn)練.同樣也會有提升.據(jù)說adadelta一般在分類問題上效果比較好,adam在生成問題上效果比較好。
除了gate之類的地方,需要把輸出限制成0-1之外,盡量不要用sigmoid,可以用tanh或者relu之類的激活函數(shù).1. sigmoid函數(shù)在-4到4的區(qū)間里,才有較大的梯度。之外的區(qū)間,梯度接近0,很容易造成梯度消失問題。2. 輸入0均值,sigmoid函數(shù)的輸出不是0均值的。
rnn的dim和embdding size,一般從128上下開始調(diào)整. batch size,一般從128左右開始調(diào)整.batch size合適最重要,并不是越大越好.
word2vec初始化,在小數(shù)據(jù)上,不僅可以有效提高收斂速度,也可以可以提高結(jié)果.
四、盡量對數(shù)據(jù)做shuffle
LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的結(jié)果,來自這篇論文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我這里實驗設(shè)成1.0,可以提高收斂速度.實際使用中,不同的任務(wù),可能需要嘗試不同的值.
Batch Normalization據(jù)說可以提升效果,不過我沒有嘗試過,建議作為最后提升模型的手段,參考論文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
如果你的模型包含全連接層(MLP),并且輸入和輸出大小一樣,可以考慮將MLP替換成Highway Network,我嘗試對結(jié)果有一點提升,建議作為最后提升模型的手段,原理很簡單,就是給輸出加了一個gate來控制信息的流動,詳細(xì)介紹請參考論文: http://arxiv.org/abs/1505.00387
來自@張馨宇的技巧:一輪加正則,一輪不加正則,反復(fù)進(jìn)行。
五、Ensemble
Ensemble是論文刷結(jié)果的終極核武器,深度學(xué)習(xí)中一般有以下幾種方式
同樣的參數(shù),不同的初始化方式
不同的參數(shù),通過cross-validation,選取最好的幾組
同樣的參數(shù),模型訓(xùn)練的不同階段,即不同迭代次數(shù)的模型。
不同的模型,進(jìn)行線性融合. 例如RNN和傳統(tǒng)模型.
更多深度學(xué)習(xí)技巧,請參見專欄:煉丹實驗室 - 知乎專欄(鏈接:https://zhuanlan.zhihu.com/easyml)
本解析一來源@蕭瑟,鏈接:https://www.zhihu.com/question/41631631/answer/94816420
解析三
@羅浩.ZJU:其實我發(fā)現(xiàn)現(xiàn)在深度學(xué)習(xí)越來越成熟,調(diào)參工作比以前少了很多,絕大多數(shù)情況自己設(shè)計的參數(shù)都不如教程和框架的默認(rèn)參數(shù)好,不過有一些技巧我一直都在用的
(1)relu+bn。這套好基友組合是萬精油,可以滿足95%的情況,除非有些特殊情況會用identity,比如回歸問題,比如resnet的shortcut支路,sigmoid什么的都快從我世界里消失了
(2)dropout 。分類問題用dropout ,只需要最后一層softmax 前用基本就可以了,能夠防止過擬合,可能對accuracy提高不大,但是dropout 前面的那層如果是之后要使用的feature的話,性能會大大提升
(3)數(shù)據(jù)的shuffle 和augmentation 。這個沒啥好說的,aug也不是瞎加,比如行人識別一般就不會加上下翻轉(zhuǎn)的,因為不會碰到頭朝下的異型種
(4)降學(xué)習(xí)率。隨著網(wǎng)絡(luò)訓(xùn)練的進(jìn)行,學(xué)習(xí)率要逐漸降下來,如果你有tensorboard,你有可能發(fā)現(xiàn),在學(xué)習(xí)率下降的一瞬間,網(wǎng)絡(luò)會有個巨大的性能提升,同樣的fine-tuning也要根據(jù)模型的性能設(shè)置合適的學(xué)習(xí)率,比如一個訓(xùn)練的已經(jīng)非常好的模型你上來就1e-3的學(xué)習(xí)率,那之前就白訓(xùn)練了,就是說網(wǎng)絡(luò)性能越好,學(xué)習(xí)率要越小
(5)tensorboard。以前不怎么用,用了之后發(fā)現(xiàn)太有幫助,幫助你監(jiān)視網(wǎng)絡(luò)的狀態(tài),來調(diào)整網(wǎng)絡(luò)參數(shù)
(6)隨時存檔模型,要有validation 。這就跟打游戲一樣存檔,把每個epoch和其對應(yīng)的validation 結(jié)果存下來,可以分析出開始o(jì)verfitting的時間點,方便下次加載fine-tuning
(7)網(wǎng)絡(luò)層數(shù),參數(shù)量什么的都不是大問題,在性能不丟的情況下,減到最小
(8)batchsize通常影響沒那么大,塞滿卡就行,除了特殊的算法需要batch大一點
(9)輸入減不減mean歸一化在有了bn之后已經(jīng)不那么重要了
上面那些都是大家所知道的常識,也是外行人覺得深度學(xué)習(xí)一直在做的就是這些很low的東西,其實網(wǎng)絡(luò)設(shè)計上博大精深,這也遠(yuǎn)超過我的水平范疇,只說一些很簡單的
(10)卷積核的分解。從最初的5×5分解為兩個3×3,到后來的3×3分解為1×3和3×1,再到resnet的1×1,3×3,1×1,再xception的3×3 channel-wise conv+1×1,網(wǎng)絡(luò)的計算量越來越小,層數(shù)越來越多,性能越來越好,這些都是設(shè)計網(wǎng)絡(luò)時可以借鑒的
(11)不同尺寸的feature maps的concat,只用一層的feature map一把梭可能不如concat好,pspnet就是這種思想,這個思想很常用
(12)resnet的shortcut確實會很有用,重點在于shortcut支路一定要是identity,主路是什么conv都無所謂,這是我親耳聽resnet作者所述
(13)針對于metric learning,對feature加個classification 的約束通常可以提高性能加快收斂
回顧精品內(nèi)容
推薦系統(tǒng)
1、干貨 | 基于用戶的協(xié)同過濾推薦算法原理和實現(xiàn)
2、超詳細(xì)丨推薦系統(tǒng)架構(gòu)與算法流程詳解
機器學(xué)習(xí)
自然語言處理(NLP)
1、AI自動評審論文,CMU這個工具可行嗎?我們用它評審了下Transformer論文
2、Transformer強勢闖入CV界秒殺CNN,靠的到底是什么"基因"
計算機視覺(CV)
1、9個小技巧讓您的PyTorch模型訓(xùn)練裝上“渦輪增壓”...
GitHub開源項目:
1、火爆GitHub!3.6k Star,中文版可視化神器現(xiàn)身
2、兩次霸榜GitHub!這個神器不寫代碼也可以完成AI算法訓(xùn)練
3、登頂GitHub大熱項目 | 非監(jiān)督GAN算法U-GAT-IT大幅改進(jìn)圖像轉(zhuǎn)換
每周推薦:
1、本周優(yōu)秀開源項目分享:無腦套用格式、開源模板最高10萬贊
2、本周優(yōu)秀開源項目分享:YOLOv4的Pytorch存儲庫、用pytorch增強圖像數(shù)據(jù)等7大項目
七月在線學(xué)員面經(jīng)分享:
1、 雙非應(yīng)屆生拿下大廠NLP崗40萬offer:面試經(jīng)驗與路線圖分享
2、轉(zhuǎn)行NLP拿下40萬offer:分享我面試中遇到的54道面試題(含參考答案)
3、NLP面試干貨分享:從自考本科 在職碩士到BAT年薪80萬
評論
圖片
表情
