Categories
程式開發

淺談深度學習背後的數學


本文最初發表於Towards Data Science 博客,經原作者Trist’n Joseph 授權,InfoQ 中文站翻譯並分享。

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

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

然而,儘管從數據中學習盡可能多的信息是我們的目標,但深度學習模型可能會受到過擬合的影響。 當模型從訓練數據中學習了太多的信息,包括隨機噪聲時,就會出現這種情況。 模型能夠確定數據中非常複雜的模式,但這會對新數據的性能產生負面影響。 訓練數據中接收到的噪聲並不適用於新的或未見過的數據,並且模型無法對所發現的模式進行泛化。 非線性在深度學習模型中也是非常重要的。 雖然模型會因為擁有多個隱藏層而學到很多信息,但將線性形式應用於非線性問題會導致性能低下。

淺談深度學習背後的數學 1

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

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

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

淺談深度學習背後的數學 2

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

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

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

淺談深度學習背後的數學 3

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

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

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

淺談深度學習背後的數學 4

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

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

淺談深度學習背後的數學 5

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

作者介紹:

Trist’n Joseph,數據科學家、研究員、內容創建者。

原文鏈接:

https://towardsdatascience.com/the-mathematics-behind-deep-learning-f6c35a0fe077