【Keras之父】高級DL最佳實踐

      Sequential模型假設網絡只有一個輸入和一個輸出,而且網絡是層的線性堆疊。既有元數據,文本描述還有圖像,如何才能同時使用這三種數據呢???一種樸素的做法:訓練三個獨立的模型,然後對三者的預測做加權平均。但是此方法會存在模型提取的信息可能存在冗餘。更好的方法是使用一個可以同時查看所有可用的輸入模態的模型,從而聯合學習一個更加精確的數據模型。其多輸入模型如下:

同樣,有些任務需要預測輸入數據的多個目標屬性。多輸出模型如下:

此外許多最新開發的你神經架構要求非線性的網絡拓撲結構,即網絡結構爲有向無環圖。例如Inception系列網絡依賴於Inception模塊類圖如下:

 

殘差連接(residual connection):最早出現於ResNet系列網絡—微軟,是指將前面的輸出張量與後面的輸出張量相加,從而將前面的表示重新注入下游數據流中,這有助於防止信息處理流程中的信息損失。

           以上是三個重要的使用案例(多輸入模型多輸出模型和類圖模型)。Keras中的Sequential模型是無法實現,另一種更加通用、更加靈活的使用Keras的方式:函數式API(functionalAPI):可以直接操作張量,也可以把層當作函數來使用,接收張量並返回張量。對比如下:

=========================================================

1.多輸入模型:這種模型會在某一時刻用一個可以組合多個張量的層將不同的輸入分支合併,張量組合方式可能是相加、連接等,例如問答模型。

model = Model([text_input, question_input], answer)

model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['acc'])------實例化網絡model

訓練這個模型有2個可用的API

1.可以向模型輸入一個由Numpy數組組成的列表

2.可以輸入一個將輸入名稱映射爲Numpy數組的字典。只有輸入具有名稱時才能使用後一種方法。

model.fit([text, question], answers, epochs=10, batch_size=128)  -->第一種

model.fit({'text': text, 'question': question}, answers,epochs=10,batch_size=128)

 

2.多輸出模型

訓練這種模型需要能夠對網絡的各個頭指定不同的損失函數,例如,年齡預測是標量回歸任務,而性別預測是二分類任務,二者需要不同的訓練過程。但是梯度下降要求將一個標量最小化,所以爲了能夠訓練模型,必須將這些損失合併爲單個標量合併不同損失最簡單的方法就是對所有損失求和。在 Keras 中,可以在編譯時使用損失組成的列表或字典來爲不同輸出指定不同損失,然後將得到的損失值相加得到一個全局損失,並在訓練過程中將這個損失最小化。

【注意】嚴重不平衡的損失貢獻會導致模型表示針對單個損失值最大的任務優先進行優化, 而不考慮其他任務的優化。爲了解決這個問題,可以爲每個損失值對最終損失的貢獻分配 不同大小的重要性。如果不同的損失值具有不同的取值範圍,那麼這一方法尤其有用。比如, 用於年齡迴歸任務的均方誤差(MSE)損失值通常在 3~5 左右,而用於性別分類任務的交叉熵損失值可能低至 0.1。在這種情況下,爲了平衡不同損失的貢獻,可以讓交叉熵損失的權重取 10,而 MSE 損失的權重取 0.5

 

3.多輸出模型

Keras 中的神經網絡可以是層組成的任意有向無環圖(directed acyclic graph)-- 即這些圖不能有循環,張量x不能稱爲生成x的某一層輸入,唯一允許的處理循環(即循環連接)是循環層的內部循環。2個著名的組件是Inception模塊和殘差連接

3.1 Inception

Inception是模塊的堆疊,這些模塊看起來像是小型的獨立網絡,被分爲多個並行分支。Inception模塊最基本的形式:包含3~4個分支,首先是一個1*1的卷積,然後是一個3*3的卷積,最後將所得到的特徵連接在一起。這種設置有助於網絡分別學習空間特徵和逐通道的特徵,比聯合學習這兩種特徵更加有效。

卷積能夠在輸入張量的每一個方塊周圍提取空間圖塊,並對所有圖塊應用相同的變換。極端的情況就是提取的圖塊只包含一個方塊,這時等價於讓每個方塊向量經過一個Dense層:逐點卷積---它計算得到的特徵能夠將輸入張量通道中的信息混合在一起,但不會將跨空間的信息混合在一起(因爲它每一次只查看一個方塊)。Inception3架構如下:

Xception(extreme inception),是一種卷積神經網絡架構,將分別進行通道特徵學習與空間特徵學習的想法推向邏輯上的極端,並將 Inception 模塊替換爲深度可分離卷積,其中包括一個逐深度卷積(即一個空間卷積,分別對每個輸入通道進行處理)和後面的一個逐點卷積(即一個 1×1 卷積)。這個深度可分離卷積實際上是 Inception 模塊的一種 極端形式,其空間特徵和通道特徵被完全分離。Xception的參數個數與 Inception V3大致相同, 但因爲它對模型參數的使用更加高效,所以在 ImageNet以及其他大規模數據集上的運行性能更好,精度也更高。

3.2 殘差連接

殘差連接(residual connection)是一種常見的類圖網絡組件。殘差連接解決了困擾所有大規模深度學習模型的兩個共性問題: 梯度消失和表示瓶頸。通常來說,向任何多於10層的模型中添加殘差連接,都可能會有所幫助。

殘差連接是讓前面某層的輸出作爲後面某層的輸入,從而在序列網絡中有效地創造了一條捷徑。前面層的輸出沒有與後面層的激活連接在一起,而是與後面層的激活相加(這裏假設兩個激活的形狀相同)。如果它們的形狀不同,可以用一個線性變換將前面層的激活改變成目標形狀(例如,這個線性變換可以是不帶激活的Dense 層; 對於卷積特徵圖,可以是不帶激活 1×1 卷積)。

~~~~~~~~~~~DL的表示瓶頸~~~~~~~~~~~~~~

    在 Sequential模型中,每個連續的表示層都構建於前一層之上,這意味着它只能訪問前一層激活中包含的信息。如果某一層太小(比如特徵維度太低),那麼模型將會受限於該層激活中能夠塞入多少信息。

可以通過類比信號處理來理解這個概念:假設有一條包含一系列操作的音頻處理流水線,每個操作的輸入都是前一個操作的輸出,如果某個操作將信號裁剪到低頻範圍(比如 0~15 kHz),那麼下游操作將永遠無法恢復那些被丟棄的頻段。任何信息的丟失都是永久性的殘差連接可以將較早的信息重新注入到下游數據中,從而部分解決了DL模型的這一問題。

~~~~~~~~~~~DL的梯度消失~~~~~~~~~~~~~

反向傳播是用於訓練深度神經網絡的主要算法,其工作原理是將來自輸出損失的反饋信號向下傳播到更底部的層。如果這個反饋信號的傳播需要經過很多層,那麼信號可能會變得非常微弱,甚至完全丟失,導致網絡無法訓練,被稱爲梯度消失(vanishing gradient)。

深度網絡中存在這個問題,在很長序列上的循環網絡也存在這個問題。在這兩種情況下, 反饋信號的傳播都必須通過一長串操作。LSTM 層是如何在循環網絡中解決這個問題的:它引入了一個攜帶軌道(carry track),可以在與主處理軌道平行的軌道上傳播信息。殘差連接在前饋深度網絡中的工作原理與此類似,但它更加簡單:它引入了一個純線性的信息攜帶軌道,與主要的層堆疊方向平行,從而有助於跨越任意深度的層來傳播梯度。

【層複用】

如何通過多次調用相同的層實例或模型實例,在不同的處理分支之間重複使用層或模型的權重。

        1.共享層權重:函數式API還有一個重要的特性:能夠多次重複使用一個層實例

    2.模型作爲層:實際上,可以將模型看作“更大的層”。Sequential 類和 Model 類都是如此。這意味着可以在一個輸入張量上調用模型,並得到一個輸出張量。y = model(x)

如果模型具有多個輸入張量和多個輸出張量,那麼應該用張量列表來調用模型。y1, y2 = model([x1, x2])

訓練模型時,不知道需要多少輪才能得到最佳驗證損失。處理這個問題的更好方法是:當觀測到驗證損失不再改善時就停止訓練。回調函數callback是在調用fit時傳入模型的一個對象(即實現特定方法的類實例),它在訓練過程中的不同時間點都會被模型調用。它可以訪問關於模型狀態與性能的所有可用數據,還可以採取行動:中斷訓練、保存模型、加載一組不同的權重或改變模型的狀態。

TensorBoardTensorFlow的可視化框架,其主要的用途是在訓練過程中幫助以可視化的方法監控模型內部發生的一切。如果監控了除模型最終損失之外的更多信息,那麼可以更清楚地瞭解模型做了什麼、沒做什麼並且能夠更快的取得進展。具有一下技巧:

1.在訓練過程中以可視化的方式監控指標

2.將模型架構可視化

3.將激活和梯度的直方圖可視化

4.以三維的形式研究嵌入

========================================================

【高級架構模式】

1.批標準化:用於讓ML學習模型看到的不同樣本彼此之間更加相似,這有助於模型的學習與對新數據的泛化。最常見的數據標準形式爲:將數據減去其平均值使其中心爲0,然後將數據除以其標準差爲1。這種分佈屬於正態分佈。

批標準化(Batch normalization)的工作原理是訓練過程中在內部保存已讀區每批數據均值和方差的指數移動平均值。主要效果是有助於梯度傳播,類似殘差鏈接,因此允許更深的網絡。自標準化神經網絡(self-normalizing neural network)使用特殊的selu激活函數和特殊的lecun_normal初始化器能夠讓數據通過任何Dense層之後保持數據標準化。

2.深度可分離卷積

3.殘差鏈接

 

【超參數優化】

超參數hyper parameter:堆疊的層數、每層需要的單元或過濾器的個數、使用哪個激活函數、在某一層之後是否應該使用BatchNormalization、使用多大的dropout比率等等,這些在架構層面的參數。其過程如下:

1.選擇一組超參數(自動選擇)

2.構建相應的模型。

3.將模型在訓練數據上擬合,並衡量其在驗證數據上的最終性能。

4.選擇要嘗試的下一組超參數(自動選擇)

5.重複上述過程。

6.最後,衡量模型在測試數據上的性能。

這個過程的關鍵在於給定許多組虛參數,使用驗證性能的歷史來選擇下一組需要評估的超參數的算法,常見有:貝葉斯優化、遺傳算法、簡單隨機搜索等。訓練模型權重相對簡單:在小批量數據上計算損失函數,然後用反向傳播算法讓權重向正確的方向移動。與此相反,更新超參數需要考慮以下2點:

1.計算反饋信號(即這組超參數在這個任務上是否得到了一個高性能的模型)的計算代價可能非常高,它需要在數據集上創建一個新模型並從頭開始訓練

2. 超參數空間通常由很多離散的決定組成,因而既不是連續的也不是可微的,因此通常不能在超參數空間中做梯度下降。相反,必須依賴不適用梯度的優化方法,而這些方法的效率比梯度下降要低很多。

這些挑戰很困難,目前只能使用非常有限的工具來優化模型。通常情況下,隨機搜索(隨機選擇需要評估的超參數,並重復這一過程)就是最好的解決方法,也是最簡單的解決方案。Keras之父推薦使用用於超參數優化的Python—Hyperopt,其內部使用Parzen估計器的樹來預測哪組超參數可能會得到很好的結果

=========================================================== 

      【注意】 在進行大規模超參數自動優化時,需要牢記驗證集過擬合這個重要的問題。因爲使用驗證數據計算出一個信號,然後根據這個信號更新超參數,所以實際上是在驗證數據上訓練超參數,很快會對驗證數據過擬合。 超參數自動優化是一個有潛力的領域

============================================================

【模型集成】

集成是指將一系列不同模型的預測結果彙集到一起,從而得到更好的預測結果。集成依賴於這樣的假設:即對於獨立訓練的不同良好模型,它們變現良好可能是因爲不同的原因每個模型都從略有不同的角度觀察數據來做出預測,得到了“真相”的一部分但不是全部真相。

以分類問題爲例,若想要將一組分類器的預測結果彙集在一起[即分類器集成(ensemble the classifiers)],最簡單的方法就是將它們的預測結果取平均值作爲預測結果。將分類器集成有一個更聰明的做法,即加權平均,其權重在驗證數據上學習得到。通常來說,更好的分類器被賦予更大的權重,而較差的分類器則被賦予較小的權重。爲了找到一組好的集成權重,可以使用隨機搜索或簡單的優化算法(比如Nelder-Mead方法)。

按照機器學習的術語:如果所有模型的偏差都在同一個方向上,那麼集成也會保留同樣的偏差。如果各個模型的偏差在不同方向上,那 麼這些偏差會彼此抵消,集成結果會更加穩定、更加準確。

因此,集成的模型應該儘可能好,同時儘可能不同。這通常意味着使用非常不同的架構, 甚至使用不同類型的機器學習方法。切勿去做的事情就是對相同的網絡使用不同的隨機初始化多次獨立訓練然後集成。如果模型之間的唯一區別是隨機初始化和訓練數據的讀取順序,那麼集成的多樣性很小,與單一模型相比只會有微小的改進。

有一種方法在實踐中非常有效:將基於樹的方法(比如隨機森林或梯度提升樹)和深度神經網絡進行集成。集成中的某一個模型來源於與其他模型都不相同的方法(它是正則化的貪婪森林),並且得分也遠遠低於其他模型。它在集成中被賦予了一個很小的權重,極大地改進了總體的集成結果,因爲它和其他所有模型都完全不同, 提供了其他模型都無法獲得的信息。集成不在於最佳模型有多好,而在於候選模型集合的多樣性

一種在實踐中非常成功的基本集成方法是寬且深(wide and deep)的模型類型, 它結合了深度學習與淺層學習。這種模型聯合訓練一個深度神經網絡和一個大型的線性模型。 對多種模型聯合訓練,是實現模型集成的另一種選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章