1. 程式人生 > >上手深度學習之前,我們先聊聊“數學”

上手深度學習之前,我們先聊聊“數學”

摘要:深度神經網路是建立在微積分和一些統計學的基礎之上的。

深度神經網路(Deep neural network,DNN)本質上是由具有多個連線的感知器形成的,其中一個感知器是單個神經元。我們可以將人工神經網路(Artificial neural network,ANN)看作一個包含一組沿著加權路徑饋送的輸入系統。然後對這些輸入進行處理,併產生一個輸出來執行某些任務。隨著時間的推移,人工神經網路將會“學習”,並發展出不同的路徑。各種路徑可以具有不同的權重,並且被認為更重要(或產生更理想結果)的路徑在模型內被分配的權重比那些產生較少理想結果的路徑更高。

在深度神經網路中,如果所有的輸入都密集地連線到所有的輸出,那麼這些層就稱為 密集層(Dense layers)。此外,深度神經網路可以包含多個 隱藏層(Hidden layer)。隱藏層基本上是神經網路輸入和輸出之間的點,啟用函式在這裡對輸入的資訊進行轉換。它之所以被稱為隱藏層,是因為它不能直接從系統的輸入和輸出中觀察到。神經網路的深度越深,網路能從資料中識別的資訊就越多。

然而,儘管從資料中學習儘可能多的資訊是我們的目標,但深度學習模型可能會受到過擬合的影響。當模型從訓練資料中學習了太多的資訊,包括隨機噪聲時,就會出現這種情況。

模型能夠確定資料中非常複雜的模式,但這會對新資料的效能產生負面影響。訓練資料中接收到的噪聲並不適用於新的或未見過的資料,並且模型無法對所發現的模式進行泛化。非線性在深度學習模型中也是非常重要的。雖然模型會因為擁有多個隱藏層而學到很多資訊,但將線性形式應用於非線性問題會導致效能低下。

現在,問題來了,“這些層是如何學習的?”那麼,讓我們將人工神經網路應用到一個真實的場景中去解決問題,以瞭解如何訓練模型來完成目標。在目前全球新冠肺炎疫情之下,很多學校都過渡到了虛擬學習,這使得一些學生擔心他們通過課程的機會。任何人工智慧系統都應該能夠解決“我能否通過這門課程”這種問題。

為簡單起見,讓我們設想此模型只有 3 個輸入:學生聽課次數、花在作業上的時間,以及在整個授課過程中網路掉線的次數。這個模型的輸出將是一個二元分類;學生要麼通過課程,要麼沒通過課程。現在是學期末,學生 A 聽了 21 堂課,花了 90 個小時完成作業,並且在這個學期中,網路掉線 7 次。這些輸入被輸入到模型中,輸出預測學生有 5% 的機會通過課程。一個星期後,期末成績公佈,學生 A 通過了這門課程。那麼,這個模型的預測出了什麼問題呢?

從技術上來說,並沒有出問題。該模型本來可以按照目前開發的模型工作。但問題是,模型並不知道發生了什麼。我們本來只是在路徑上對一些權重進行了初始化,但模型目前並不知道什麼是對的,什麼是錯的;因此,權重是不正確的。這就是學習的意義所在。我們的想法是,模型需要了解什麼時候是錯誤的,我們通過計算某種形式的 "損失 "來實現這一點。計算的損失取決於當前的問題,但它通常涉及最小化預測輸出和實際輸出之間的差異。

在上面的場景中,只有一個學生和一個誤差點需要最小化。然而,通常情況卻並非如此。現在,考慮到有多個學生和多個差異最小化。因此,總損失通常計算為所有預測值與實際觀測值之差的平均值。

回想一下,我在前面提到的被計算的損失取決於當前的問題。因此,由於我們當前的問題是二元分類,適當的損失計算將是 交叉熵損失。這個函式背後的想法是,它將學生是否會通過課程的預測分佈與實際分佈進行比較,並試圖將這些分佈之間的差異最小化。

假設我們不再想預測學生是否能通過這門課程,而是現在想預測他們這門課的成績。交叉熵損失將不再是一個合適的方法,相反,均方誤差損失 將更合適。相反,均方誤差損失會更合適。這種方法適用於迴歸問題,其想法是它將嘗試最小化實際值和預測值之間的平方差。

現在,我們瞭解了一些損失函式,就可以進入損失優化和模型訓練了。擁有良好的深度神經網路的一個關鍵因素是擁有合適的權重。損失優化應該是土找到一組權重 $W$,它將使計算的損失最小化。如果只有一個權重分量,則可以在二維圖上繪製權重和損失,然後選擇使損失最小的權重。然而,大多數深度神經網路具有多個權重分量,將一個 $n$ 維圖進行視覺化是非常困難的。

取而代之的是,計算損失函式相對於所有權重的導數來確定最大上升方向。既然模型現在已經理解上行和下行的方向,它就會向下行進,直到在區域性最小值處到達收斂點。一旦這個下降點完成,就會返回一組最優權重,這就是深度神經網路應該使用的權重(假設模型開發得很好)。

計算這個導數的過程被稱為 反向傳播(Back propagation),它本質上是微積分的鏈式法則。考慮到上面顯示的神經網路,第一組權重的微小變化是如何影響最終損失的?這就是導數或梯度試圖解釋的內容。但是,第一組權值被輸入到一個隱藏層,然後隱藏層有另一組權值導致預測的輸出和損失。因此,也應該考慮權重變化對隱藏層的影響。這是網路中僅有的兩個部分。但是,如果有更多的權重需要考慮,這個過程可以通過將鏈式規則從輸出應用到輸入來繼續這一過程。

訓練深度神經網路時要考慮的另一個重要因素是學習率。當模型在尋找一個最優的權值集時,它需要通過一些因子來更新它的權重。雖然這看起來微不足道,但是決定模型應該移動的因子是相當困難的。如果因子太小,那麼模型可能會執行一段指數級的時間,或者陷入某個不是全域性最小值的地方。如果因子太大,那麼模型可能會完全偏離目標點,進而發散。

雖然固定的學習率可能是理想的,但 自適應學習率(Adaptive learning rate)會減少出現前文所提到的問題的機會。也就是說,因子將根據當前梯度、當前權重的大小或可能影響模型下一步查詢最佳權重的位置的某些其他因素而發生變化。

可以看出,深度神經網路是建立在微積分和一些統計學的基礎之上的。評估這些過程背後的數學非常有用,因為它可以幫助人們瞭解模型內部真正發生的事情,這可以導致開發更好的整體模型。但是,即使這些概念不容易理解,大多數程式都附帶了自動微分等工具,所以不用擔心。

 

點選關注,第一時間瞭解華為雲新鮮技術~