深度神經網路DNN

2021-09-11 12:40:19 字數 4999 閱讀 7715

深度網路dnn的概念,是基於淺層網路——多層感知機mlp(或稱人工神經網路ann)的基礎上發展而來。關於mlp或ann的知識,此處不作贅述,網上有很多資料可以參考。

有8000個變數,其中少數變數之間可能存在相關性;有20000個樣本,每個樣本都有這8000個變數的資料;這20000個樣本可以被分為2類(label)。求如何用這些變數構造乙個分類器?

這個問題,是乙個典型的高通量資訊資料的問題(如基因組學、代謝組學等),首先考慮的方法是普通機器學習的模型,如pca、pls、lasso等降維,單因素差異分析如wilcoxon檢驗、fold change卡差異界值,甚至聚類分析,再建模弄個svm、隨機森林、ann等,最後回歸解釋性模型如logistic等。機器學習高階一點的方法還有xgboost也可以試試。

但是,如果拋開普通機器學習的方法,僅討論深度學習的方法,這個任務該如何解決?有兩個idea,第一是直接套用cnn,但是直觀感覺,卷積在此處的作用可能不大(也可能有用,將變數固定順序,將構成一維影象,雖然相鄰畫素較難聯合構成有效的區域性特徵),因此cnn的方法試試就行;第二是採用全連線的dnn(如fc的resnet),由於是全連線,引數較多,容易過擬合,考驗煉丹的能力了(注意relu等非線性變換需要保留,否則就退化成線性分類器了)。

深度學習就是學習如何利用矩陣的線性變換加啟用函式的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/回歸。增加節點數:增加維度,即增加線性轉換能力。增加層數:增加啟用函式的次數,即增加非線性轉換次數。

深度 vs. 淺層:淺層神經網路可以模擬任何函式,但資料量的代價是無法接受的。深層解決了這個問題。相比淺層神經網路,深層神經網路可以用更少的資料量來學到更好的擬合。深層的前提是:空間中的元素可以由迭代發展而來的。

有人總結了一下經驗(看看就好,也不要全信):

1.如果資料已經有了特徵,比如性別、年齡、地點、訪問量等等特徵,則直接使用dnn或者全連線進行判斷;

2.在有了特徵的情況下使用cnn可能會導致模型的準確率不是特別高。

本文就這類問題,進行建模技巧講解。

本部分摘自:dnn與ann的區別

傳統神經網路中,採用的是bp演算法的方式進行,簡單來講就是採用迭代的演算法來訓練整個網路,隨機設定初值,計算當前網路的輸出,然後根據當前輸出和label之間的差去改變前面各層的引數,直到收斂(整體是乙個梯度下降法)。

大約二三十年前,neural network曾經是ml領域特別火熱的乙個方向,但是後來確慢慢淡出了,原因包括以下幾個方面:

1)比較容易過擬合,引數比較難tune,而且需要不少trick;

2)訓練速度比較慢,在層次比較少(小於等於3)的情況下效果並不比其它方法更優;

同時bp演算法存在的問題:

(1)梯度越來越稀疏:從頂層越往下,誤差校正訊號越來越小;

(2)收斂到區域性最小值:尤其是從遠離最優區域開始的時候(隨機值初始化會導致這種情況的發生)。

直到2023年,hinton等人提成了乙個實際可行的deep learning框架。

為了克服神經網路訓練中的問題,dl採用了與神經網路很不同的訓練機制。而deep learning整體上是乙個layer-wise的訓練機制。這樣做的原因是因為,如果採用back propagation的機制,對於乙個deep network(7層以上),殘差傳播到最前面的層已經變得太小,出現所謂的gradient diffusion(梯度消失或梯度瀰散)。

hinton等人提出,在非監督資料上建立多層神經網路的乙個有效方法,簡單的說,分為兩步,一是每次訓練一層網路,二是調優,使原始表示x向上生成的高階表示r和該高階表示r向下生成的x'盡可能一致。方法是:

1)首先逐層構建單層神經元,這樣每次都是訓練乙個單層網路。

2)當所有層訓練完後,hinton使用wake-sleep演算法進行調優。

將除最頂層的其它層間的權重變為雙向的,這樣最頂層仍然是乙個單層神經網路,而其它層則變為了圖模型。向上的權重用於「認知」,向下的權重用於「生成」。然後使用wake-sleep演算法調整所有的權重。讓認知和生成達成一致,也就是保證生成的最頂層表示能夠盡可能正確的復原底層的結點。比如頂層的乙個結點表示人臉,那麼所有人臉的影象應該啟用這個結點,並且這個結果向下生成的影象應該能夠表現為乙個大概的人臉影象。wake-sleep演算法分為醒(wake)和睡(sleep)兩個部分。

1)wake階段:認知過程,通過外界的特徵和向上的權重(認知權重)產生每一層的抽象表示(結點狀態),並且使用梯度下降修改層間的下行權重(生成權重)。也就是「如果現實跟我想象的不一樣,改變我的權重使得我想象的東西就是這樣的」。

2)sleep階段:生成過程,通過頂層表示(醒時學得的概念)和向下權重,生成底層的狀態,同時修改層間向上的權重。也就是「如果夢中的景象不是我腦中的相應概念,改變我的認知權重使得這種景象在我看來就是這個概念」。

deep learning訓練過程具體如下:

1)使用自下上公升非監督學習(就是從底層開始,一層一層的往頂層訓練):

採用無標定資料(有標定資料也可)分層訓練各層引數,這一步可以看作是乙個無監督訓練過程,是和傳統神經網路區別最大的部分(這個過程可以看作是feature learning過程):

具體的,先用無標定資料訓練第一層,訓練時先學習第一層的引數(這一層可以看作是得到乙個使得輸出和輸入差別最小的三層神經網路的隱層),由於模型capacity的限制以及稀疏性約束,使得得到的模型能夠學習到資料本身的結構,從而得到比輸入更具有表示能力的特徵;在學習得到第n-1層後,將n-1層的輸出作為第n層的輸入,訓練第n層,由此分別得到各層的引數;

2)自頂向下的監督學習(就是通過帶標籤的資料去訓練,誤差自頂向下傳輸,對網路進行微調):

基於第一步得到的各層引數進一步fine-tune整個多層模型的引數,這一步是乙個有監督訓練過程;第一步類似神經網路的隨機初始化初值過程,由於dl的第一步不是隨機初始化,而是通過學習輸入資料的結構得到的,因而這個初值更接近全域性最優,從而能夠取得更好的效果;所以deep learning效果好很大程度上歸功於第一步的feature learning過程。

本部分摘自:面試常問的深度學習(dnn、cnn、rnn)的相關問題

一、如何避免陷入區域性極小值

1.調節步伐:調節學習速率,使每一次的更新「步伐」不同;

2.優化起點:合理初始化權重(weights initialization)、預訓練網路(pre-train),使網路獲得乙個較好的「起始點」,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分布初始權重(gaussian distribution)、均勻分布初始權重(uniform distribution)、glorot 初始權重、he初始權、稀疏矩陣初始權重(sparse matrix)。

二、如何防止過擬合

l2正則化,dropout(若規律不是在所有樣本中都存在,則dropout會刪除這樣的規律),每個epoch之後shuffle訓練資料,設定early-stopping。加batch normalization(bn首先是把所有的samples的統計分布標準化,降低了batch內不同樣本的差異性,然後又允許batch內的各個samples有各自的統計分布),bn最大的優點為允許網路使用較大的學習速率進行訓練,加快網路的訓練速度(減少epoch次數),提公升效果。

三、為何使用batch normalization

若用多個梯度的均值來更新權重的批量梯度下降法可以用相對少的訓練次數遍歷完整個訓練集,其次可以使更新的方向更加貼合整個訓練集,避免單個噪音樣本使網路更新到錯誤方向。然而也正是因為平均了多個樣本的梯度,許多樣本對神經網路的貢獻就被其他樣本平均掉了,相當於在每個epoch中,訓練集的樣本數被縮小了。batch中每個樣本的差異性越大,這種弊端就越嚴重。一般的解決方法就是在每次訓練完乙個epoch後,將訓練集中樣本的順序打亂再訓練另乙個epoch,不斷反覆。這樣重新組成的batch中的樣本梯度的平均值就會與上乙個epoch的不同。而這顯然增加了訓練的時間。同時因為沒辦法保證每次更新的方向都貼合整個訓練集的大方向,只能使用較小的學習速率。這意味著訓練過程中,一部分steps對網路最終的更新起到了促進,一部分steps對網路最終的更新造成了干擾,這樣「磕磕碰碰」無數個epoch後才能達到較為滿意的結果。

為了解決這種「不效率」的訓練,bn首先是把所有的samples的統計分布標準化,降低了batch內不同樣本的差異性,然後又允許batch內的各個samples有各自的統計分布。

四、神經元的運算邏輯

本段摘自:【keras】dnn神經網路模型 (文中附有keras的**實現)

神經元的運算邏輯,一定是線性核心和非線性啟用相結合,所以神經元的演算法是非線性的。因此dnn神經元的計算核心為x*w+b,以softmax函式(二元分類中使用sigmoid函式)為非線性核的構造方式。同理,rnn的核採用rnn運算核心,cnn採用卷積運算核心。

邏輯分類可以視為一層dnn神經網路,計算核心為x*w+b,以softmax函式(二元分類中使用sigmoid函式)為非線性核的構造方式。像邏輯分類這種,線性運算單元設計為權重相乘的,並且層與層之間的神經元全部相連的神經網路就是全連線神經網路,即dnn

進一步增加隱層,,容納更多的神經元,來增強模型的能力。比起淺層模型在特徵工程和模型工程的各種嘗試,神經網路通過更多的神經元直接增強模型的能力。

dnn vs. cnn:個人觀點,閹割掉卷積操作、改為全連線,即可轉變為普通dnn。而cnn的resnet比較成熟,因此反而可以通過改造cnn來得到dnn(純屬個人觀點,具體實現當然會有問題)

五、本質的**

為什麼神經網路高效:並行的先驗知識使得模型可用線性級數量的樣本學習指數級數量的變體。

為什麼深層神經網路比淺層神經網路更高效:迭代組成的先驗知識使得樣本可用於幫助訓練其他共用同樣底層結構的樣本。

神經網路在什麼問題上不具備優勢:不滿足並行與迭代先驗的任務。(本人不太理解)

對於這些關於本質的說法以及神經網路在什麼問題上不具備優勢,本人暫時存疑。

六、訓練dnn的一些其他技巧參考

如何正確訓練dnn 、dnn訓練技巧(tips for training dnn)等

這些博文中引用了乙個很重要的觀點:「do not always blame overfitting」。具體的,之後展開敘述。

待更新

DNN(深度神經網路演算法)

資料集定義模型 訓練 學習 評估模型 自從 1962 年 rosenblat 提出感知機 perceptron 以來,dnn 的概念就已經出現了,而自 rumelhart hinton 和 williams 在 1986 年發現了梯度下降演算法後,dnn 的概念就變得可行了。直到最近 dnn 才成為...

深度神經網路(DNN)反向傳播演算法 BP

在深度神經網路 dnn 模型與前向傳播演算法中,我們對dnn的模型和前向傳播演算法做了總結,這裡我們更進一步,對dnn的反向傳播演算法 back propagation,bp 做乙個總結。在了解dnn的反向傳播演算法前,我們先要知道dnn反向傳播演算法要解決的問題,也就是說,什麼時候我們需要這個反向...

深度神經網路(DNN)反向傳播演算法 BP

在深度神經網路 dnn 模型與前向傳播演算法中,我們對dnn的模型和前向傳播演算法做了總結,這裡我們更進一步,對dnn的反向傳播演算法 back propagation,bp 做乙個總結。在了解dnn的反向傳播演算法前,我們先要知道dnn反向傳播演算法要解決的問題,也就是說,什麼時候我們需要這個反向...