深度神经网络DNN
深度網(wǎng)絡(luò)DNN的概念,是基于淺層網(wǎng)路——多層感知機MLP(或稱人工神經(jīng)網(wǎng)絡(luò)ANN)的基礎(chǔ)上發(fā)展而來。關(guān)于MLP或ANN的知識,此處不作贅述,網(wǎng)上有很多資料可以參考。
DNN是一個很廣的概念,大名鼎鼎的CNN、RNN、GAN等都屬于其范疇之內(nèi)。CNN多用于網(wǎng)絡(luò)結(jié)構(gòu)數(shù)據(jù)類型的任務(wù),如圖像、聲音、文本等;RNN多用于時間序列類型的任務(wù),如音頻、文本(NLP)、視頻等;GAN則主要用于“生成數(shù)據(jù)、以假亂真”,適用于創(chuàng)作類任務(wù)。但是本文亦不敘述CNN等知識,相關(guān)知識可參考本人相關(guān)博客卷積神經(jīng)網(wǎng)絡(luò)CNN。本文主要講述一般的DNN任務(wù),考慮如下問題:
有8000個變量,其中少數(shù)變量之間可能存在相關(guān)性;有20000個樣本,每個樣本都有這8000個變量的數(shù)據(jù);這20000個樣本可以被分為2類(label)。求如何用這些變量構(gòu)造一個分類器?
這個問題,是一個典型的高通量信息數(shù)據(jù)的問題(如基因組學(xué)、代謝組學(xué)等),首先考慮的方法是普通機器學(xué)習(xí)的模型,如PCA、PLS、LASSO等降維,單因素差異分析如Wilcoxon檢驗、Fold Change卡差異界值,甚至聚類分析,再建模弄個SVM、隨機森林、ANN等,最后回歸解釋性模型如Logistic等。機器學(xué)習(xí)進階一點的方法還有XGBoost也可以試試。
但是,如果拋開普通機器學(xué)習(xí)的方法,僅討論深度學(xué)習(xí)的方法,這個任務(wù)該如何解決?有兩個idea,第一是直接套用CNN,但是直觀感覺,卷積在此處的作用可能不大(也可能有用,將變量固定順序,將構(gòu)成一維圖像,雖然相鄰像素較難聯(lián)合構(gòu)成有效的局部特征),因此CNN的方法試試就行;第二是采用全連接的DNN(如FC的ResNet),由于是全連接,參數(shù)較多,容易過擬合,考驗煉丹的能力了(注意ReLU等非線性變換需要保留,否則就退化成線性分類器了)。
深度學(xué)習(xí)就是學(xué)習(xí)如何利用矩陣的線性變換加激活函數(shù)的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/回歸。增加節(jié)點數(shù):增加維度,即增加線性轉(zhuǎn)換能力。增加層數(shù):增加激活函數(shù)的次數(shù),即增加非線性轉(zhuǎn)換次數(shù)。
深度 vs. 淺層:淺層神經(jīng)網(wǎng)絡(luò)可以模擬任何函數(shù),但數(shù)據(jù)量的代價是無法接受的。深層解決了這個問題。相比淺層神經(jīng)網(wǎng)絡(luò),深層神經(jīng)網(wǎng)絡(luò)可以用更少的數(shù)據(jù)量來學(xué)到更好的擬合。深層的前提是:空間中的元素可以由迭代發(fā)展而來的。
有人總結(jié)了一下經(jīng)驗(看看就好,也不要全信):
1.如果數(shù)據(jù)已經(jīng)有了特征,比如性別、年齡、地點、訪問量等等特征,則直接使用DNN或者全連接進行判斷;
2.在有了特征的情況下使用CNN可能會導(dǎo)致模型的準確率不是特別高。
?
本文就這類問題,進行建模技巧講解。
?
從Neural Network到Deep Learning
本部分摘自:DNN與ANN的區(qū)別
傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中,采用的是BP算法的方式進行,簡單來講就是采用迭代的算法來訓(xùn)練整個網(wǎng)絡(luò),隨機設(shè)定初值,計算當(dāng)前網(wǎng)絡(luò)的輸出,然后根據(jù)當(dāng)前輸出和label之間的差去改變前面各層的參數(shù),直到收斂(整體是一個梯度下降法)。
大約二三十年前,Neural Network曾經(jīng)是ML領(lǐng)域特別火熱的一個方向,但是后來確慢慢淡出了,原因包括以下幾個方面:
1)比較容易過擬合,參數(shù)比較難tune,而且需要不少trick;
2)訓(xùn)練速度比較慢,在層次比較少(小于等于3)的情況下效果并不比其它方法更優(yōu);
同時BP算法存在的問題:
(1)梯度越來越稀疏:從頂層越往下,誤差校正信號越來越小;
(2)收斂到局部最小值:尤其是從遠離最優(yōu)區(qū)域開始的時候(隨機值初始化會導(dǎo)致這種情況的發(fā)生)。
直到2006年,Hinton等人提成了一個實際可行的Deep Learning框架。
為了克服神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的問題,DL采用了與神經(jīng)網(wǎng)絡(luò)很不同的訓(xùn)練機制。而deep learning整體上是一個layer-wise的訓(xùn)練機制。這樣做的原因是因為,如果采用back propagation的機制,對于一個deep network(7層以上),殘差傳播到最前面的層已經(jīng)變得太小,出現(xiàn)所謂的gradient diffusion(梯度消失或梯度彌散)。
Hinton等人提出,在非監(jiān)督數(shù)據(jù)上建立多層神經(jīng)網(wǎng)絡(luò)的一個有效方法,簡單的說,分為兩步,一是每次訓(xùn)練一層網(wǎng)絡(luò),二是調(diào)優(yōu),使原始表示x向上生成的高級表示r和該高級表示r向下生成的x'盡可能一致。方法是:
1)首先逐層構(gòu)建單層神經(jīng)元,這樣每次都是訓(xùn)練一個單層網(wǎng)絡(luò)。
2)當(dāng)所有層訓(xùn)練完后,Hinton使用wake-sleep算法進行調(diào)優(yōu)。
將除最頂層的其它層間的權(quán)重變?yōu)殡p向的,這樣最頂層仍然是一個單層神經(jīng)網(wǎng)絡(luò),而其它層則變?yōu)榱藞D模型。向上的權(quán)重用于“認知”,向下的權(quán)重用于“生成”。然后使用Wake-Sleep算法調(diào)整所有的權(quán)重。讓認知和生成達成一致,也就是保證生成的最頂層表示能夠盡可能正確的復(fù)原底層的結(jié)點。比如頂層的一個結(jié)點表示人臉,那么所有人臉的圖像應(yīng)該激活這個結(jié)點,并且這個結(jié)果向下生成的圖像應(yīng)該能夠表現(xiàn)為一個大概的人臉圖像。Wake-Sleep算法分為醒(wake)和睡(sleep)兩個部分。
1)wake階段:認知過程,通過外界的特征和向上的權(quán)重(認知權(quán)重)產(chǎn)生每一層的抽象表示(結(jié)點狀態(tài)),并且使用梯度下降修改層間的下行權(quán)重(生成權(quán)重)。也就是“如果現(xiàn)實跟我想象的不一樣,改變我的權(quán)重使得我想象的東西就是這樣的”。
2)sleep階段:生成過程,通過頂層表示(醒時學(xué)得的概念)和向下權(quán)重,生成底層的狀態(tài),同時修改層間向上的權(quán)重。也就是“如果夢中的景象不是我腦中的相應(yīng)概念,改變我的認知權(quán)重使得這種景象在我看來就是這個概念”。
?
Deep Learning訓(xùn)練過程具體如下:
1)使用自下上升非監(jiān)督學(xué)習(xí)(就是從底層開始,一層一層的往頂層訓(xùn)練):
???????采用無標定數(shù)據(jù)(有標定數(shù)據(jù)也可)分層訓(xùn)練各層參數(shù),這一步可以看作是一個無監(jiān)督訓(xùn)練過程,是和傳統(tǒng)神經(jīng)網(wǎng)絡(luò)區(qū)別最大的部分(這個過程可以看作是feature learning過程):
???????具體的,先用無標定數(shù)據(jù)訓(xùn)練第一層,訓(xùn)練時先學(xué)習(xí)第一層的參數(shù)(這一層可以看作是得到一個使得輸出和輸入差別最小的三層神經(jīng)網(wǎng)絡(luò)的隱層),由于模型capacity的限制以及稀疏性約束,使得得到的模型能夠?qū)W習(xí)到數(shù)據(jù)本身的結(jié)構(gòu),從而得到比輸入更具有表示能力的特征;在學(xué)習(xí)得到第n-1層后,將n-1層的輸出作為第n層的輸入,訓(xùn)練第n層,由此分別得到各層的參數(shù);
2)自頂向下的監(jiān)督學(xué)習(xí)(就是通過帶標簽的數(shù)據(jù)去訓(xùn)練,誤差自頂向下傳輸,對網(wǎng)絡(luò)進行微調(diào)):
???????基于第一步得到的各層參數(shù)進一步fine-tune整個多層模型的參數(shù),這一步是一個有監(jiān)督訓(xùn)練過程;第一步類似神經(jīng)網(wǎng)絡(luò)的隨機初始化初值過程,由于DL的第一步不是隨機初始化,而是通過學(xué)習(xí)輸入數(shù)據(jù)的結(jié)構(gòu)得到的,因而這個初值更接近全局最優(yōu),從而能夠取得更好的效果;所以deep learning效果好很大程度上歸功于第一步的feature learning過程。
?
一些技巧和認知的梳理
本部分摘自:面試常問的深度學(xué)習(xí)(DNN、CNN、RNN)的相關(guān)問題
一、如何避免陷入局部極小值
1.調(diào)節(jié)步伐:調(diào)節(jié)學(xué)習(xí)速率,使每一次的更新“步伐”不同;
2.優(yōu)化起點:合理初始化權(quán)重(weights initialization)、預(yù)訓(xùn)練網(wǎng)絡(luò)(pre-train),使網(wǎng)絡(luò)獲得一個較好的“起始點”,如最右側(cè)的起始點就比最左側(cè)的起始點要好。常用方法有:高斯分布初始權(quán)重(Gaussian distribution)、均勻分布初始權(quán)重(Uniform distribution)、Glorot 初始權(quán)重、He初始權(quán)、稀疏矩陣初始權(quán)重(sparse matrix)。
?
二、如何防止過擬合
L2正則化,Dropout(若規(guī)律不是在所有樣本中都存在,則dropout會刪除這樣的規(guī)律),每個epoch之后shuffle訓(xùn)練數(shù)據(jù),設(shè)置early-stopping。加Batch Normalization(BN首先是把所有的samples的統(tǒng)計分布標準化,降低了batch內(nèi)不同樣本的差異性,然后又允許batch內(nèi)的各個samples有各自的統(tǒng)計分布),BN最大的優(yōu)點為允許網(wǎng)絡(luò)使用較大的學(xué)習(xí)速率進行訓(xùn)練,加快網(wǎng)絡(luò)的訓(xùn)練速度(減少epoch次數(shù)),提升效果。
?
三、為何使用Batch Normalization
若用多個梯度的均值來更新權(quán)重的批量梯度下降法可以用相對少的訓(xùn)練次數(shù)遍歷完整個訓(xùn)練集,其次可以使更新的方向更加貼合整個訓(xùn)練集,避免單個噪音樣本使網(wǎng)絡(luò)更新到錯誤方向。然而也正是因為平均了多個樣本的梯度,許多樣本對神經(jīng)網(wǎng)絡(luò)的貢獻就被其他樣本平均掉了,相當(dāng)于在每個epoch中,訓(xùn)練集的樣本數(shù)被縮小了。batch中每個樣本的差異性越大,這種弊端就越嚴重。一般的解決方法就是在每次訓(xùn)練完一個epoch后,將訓(xùn)練集中樣本的順序打亂再訓(xùn)練另一個epoch,不斷反復(fù)。這樣重新組成的batch中的樣本梯度的平均值就會與上一個epoch的不同。而這顯然增加了訓(xùn)練的時間。同時因為沒辦法保證每次更新的方向都貼合整個訓(xùn)練集的大方向,只能使用較小的學(xué)習(xí)速率。這意味著訓(xùn)練過程中,一部分steps對網(wǎng)絡(luò)最終的更新起到了促進,一部分steps對網(wǎng)絡(luò)最終的更新造成了干擾,這樣“磕磕碰碰”無數(shù)個epoch后才能達到較為滿意的結(jié)果。
為了解決這種“不效率”的訓(xùn)練,BN首先是把所有的samples的統(tǒng)計分布標準化,降低了batch內(nèi)不同樣本的差異性,然后又允許batch內(nèi)的各個samples有各自的統(tǒng)計分布。
?
四、神經(jīng)元的運算邏輯
本段摘自:【Keras】DNN神經(jīng)網(wǎng)絡(luò)模型?(文中附有Keras的代碼實現(xiàn))
神經(jīng)元的運算邏輯,一定是線性內(nèi)核和非線性激活相結(jié)合,所以神經(jīng)元的算法是非線性的。因此DNN神經(jīng)元的計算內(nèi)核為X*W+b,以softmax函數(shù)(二元分類中使用Sigmoid函數(shù))為非線性核的構(gòu)造方式。同理,RNN的核采用RNN運算內(nèi)核,CNN采用卷積運算內(nèi)核。
邏輯分類可以視為一層DNN神經(jīng)網(wǎng)絡(luò),計算內(nèi)核為X*W+b,以softmax函數(shù)(二元分類中使用Sigmoid函數(shù))為非線性核的構(gòu)造方式。像邏輯分類這種,線性運算單元設(shè)計為權(quán)重相乘的,并且層與層之間的神經(jīng)元全部相連的神經(jīng)網(wǎng)絡(luò)就是全連接神經(jīng)網(wǎng)絡(luò),即DNN。
進一步增加隱層,,容納更多的神經(jīng)元,來增強模型的能力。比起淺層模型在特征工程和模型工程的各種嘗試,神經(jīng)網(wǎng)絡(luò)通過更多的神經(jīng)元直接增強模型的能力。
DNN vs. CNN:個人觀點,閹割掉卷積操作、改為全連接,即可轉(zhuǎn)變?yōu)槠胀―NN。而CNN的ResNet比較成熟,因此反而可以通過改造CNN來得到DNN(純屬個人觀點,具體實現(xiàn)當(dāng)然會有問題)
?
五、本質(zhì)的探討
為什么神經(jīng)網(wǎng)絡(luò)高效:并行的先驗知識使得模型可用線性級數(shù)量的樣本學(xué)習(xí)指數(shù)級數(shù)量的變體。
為什么深層神經(jīng)網(wǎng)絡(luò)比淺層神經(jīng)網(wǎng)絡(luò)更高效:迭代組成的先驗知識使得樣本可用于幫助訓(xùn)練其他共用同樣底層結(jié)構(gòu)的樣本。
神經(jīng)網(wǎng)絡(luò)在什么問題上不具備優(yōu)勢:不滿足并行與迭代先驗的任務(wù)。(本人不太理解)
對于這些關(guān)于本質(zhì)的說法以及神經(jīng)網(wǎng)絡(luò)在什么問題上不具備優(yōu)勢,本人暫時存疑。
?
六、訓(xùn)練DNN的一些其他技巧參考
如何正確訓(xùn)練DNN?、DNN訓(xùn)練技巧(Tips for Training DNN)等
這些博文中引用了一個很重要的觀點:“Do not always blame overfitting”。具體的,之后展開敘述。
?
代碼實現(xiàn)
待更新
?
?
總結(jié)
- 上一篇: C# 高校教学管理系统
- 下一篇: 单片机c语言执行从什么开始,学习C语言从