清華大數據軟件團隊官方微信公衆号
來源:Deephub Imba
本文約3500字,建議閱讀5分鐘
如何計算隐藏層中的誤差?微積分和這些有什麼關系?反向傳播是神經網絡通過調整神經元的權重和偏差來最小化其預測輸出誤差的過程。但是這些變化是如何發生的呢?如何計算隐藏層中的誤差?微積分和這些有什麼關系?在本文中,你将得到所有問題的回答。讓我們開始吧。
在了解反向傳播的細節之前,讓我們先浏覽一下整個神經網絡學習過程:
神經網絡是如何進行學習的?神經網絡中的學習過程分為三個步驟。
第 1 步:将數據輸入神經網絡。該輸入數據順序通過神經網絡的不同層,并在最終輸出層産生輸出或預測。數據從輸入層流向輸出層的整個過程稱為前向傳播。我們将在下面看到前向傳播的細節。
第 2 步:現在有了輸出,我們計算輸出中的損失。我們有很多計算損失的選項,例如均方誤差、二元交叉熵等,如何計算損失是根據不同的目标來定義的。
第 3 步:計算損失後,我們必須告訴神經網絡如何改變它的參數(權重和偏差)以最小化損失。這個過程稱為反向傳播。
神經網絡中的前向傳播NN 基本上由三種類型的層組成。輸入層、隐藏層和輸出層。通過 NN 的數據流是這樣的:
當輸入通過向前傳播産生輸出後,我們可以在輸出中找出誤差。誤差是預測輸出和期望的真實值之間的差異。但在神經網絡中通常不計算輸出中的誤差,而是使用特定的損失函數來計算損失,并随後在優化算法中使用該函數來将損失降低到最小值。
計算損失的方法有很多,如均方誤差、二元交叉熵等。這些使用那個損失是根據我們要解決的問題來選擇的。
梯度下降算法反向傳播的全部思想是最小化損失。我們有很多優化算法來做到這一點。但為了簡單起見,讓我們從一個基本但強大的優化算法開始,梯度下降算法。
這裡的想法是計算相對于每個參數的損失變化率,并在減少損失的方向上修改每個參數。任何參數的變化都會導緻損失發生改變。如果變化為負,那麼我們需要增加權重以減少損失,而如果變化為正,我們需要減少權重。我們可以用數學方式将其寫為,
其中梯度是損失函數相對于權重的偏導數。學習率隻是一個縮放因子,用于放大或縮小梯度。在接下來的文本中更詳細地解釋了它。相同的公式适用于偏差:
new_bias = old_bias - learning_rate * gradient
其中梯度是損失函數相對于偏差的偏導數。
看看下面的圖表。我們繪制了神經網絡的損失與單個神經元權重變化的關系圖。
現在我們可以看到曲線中有很多局部最小值(所有下凹曲線),但我們感興趣的是将損失降低到全局最小值(最大的下凹曲線)。假設我們的權重值現在接近示例圖中的原點(假設為 1,因此我們的損失接近 4)。
在上圖中權重值約為3的時候損失最小。
所以我們的算法必須能夠找到這個權重值(3),來使得損失最小。所以權重的改變應該與損失成某個比例。這就是為什麼梯度是由損失相對于權重的偏導數給出的。所以梯度下降算法的步驟是:
對以上操作進行叠代,直到損失收斂到全局最小值。
關于梯度的更多信息
由于直線的斜率可以使用通用斜率公式計算:
取直線上相距一定距離的兩點,計算斜率。當圖形是一條直線時,這種計算梯度的方法給出了精确的計算。但是當我們有不均勻的曲線時,使用這種方式計算梯度一個好主意。因為這些圖中的每個點的損失都在不斷變化,尤其是當曲線不規則時,如果我們可以使我們計算斜率的鄰域或距離無限小呢?這樣不就可以計算最準确的梯度值了嗎?
對,這正是通過計算 y 相對于 x 的導數所做的。這為我們提供了 y 相對于 x 的瞬時變化率。瞬時變化率為我們提供了比我們之前的運行遞增法方更精确的梯度,因為這個梯度是瞬時的。在計算相對于權重或偏差的損失變化率時,應遵循相同的方法。損失函數相對于權重的導數為我們提供了損失相對于權重的瞬時變化率。
學習率在計算完梯度之後需要一些東西來縮放梯度。因為有時候神經網絡試圖朝着損耗曲線的最低點前進時,它可能會在每次調整其權重時采取很大的調整,調整過大可能永遠不會真正收斂到全局最小值。你可以在下面的圖表中看到:
正如你所看到的,損失會持續朝任何方向移動,并且永遠不會真正收斂到最小值。如果學習速度太小,損失可能需要數年的時間才能收斂到最小。因此最佳學習率對于任何神經網絡的學習都是至關重要的。
因此,每次參數更新時,我們使用學習速率來控制梯度的大小。讓我重申一下上面看到的更新參數的公式。
new_weight = old_weight - learning_rate * gradient
所以學習速率決定了每一步的大小同時收斂到最小值。
計算梯度計算的損失是由于網絡中所有神經元的權重和偏差造成的。有些權重可能比其他權重對輸出的影響更大,而有些權重可能根本沒有影響輸出。
前面已經說了我們訓練的目标是減少輸出中的誤差。要做到這一點必須計算每個神經元的梯度。然後将這個梯度與學習速率相乘,并從當前的權重(或偏差)中減去這個值。這種調整發生在網絡中的每一個神經元中。現在讓我們考慮隻有一個神經元的神經網絡。
預激活 z 可以寫為,
為了簡單起見,讓我們暫時忽略偏差b。
然後 z 的值由激活函數激活。這個例子中我們使用 sigmoid 激活函數。sigmoid 激活函數由符号 σ 表示。
這個網絡的輸出是 y-hat。通過使用可用的各種損失函數之一來完成計算損失。讓我們用字母 C 表示損失函數。現在該進行反向傳播了,計算損失函數的梯度:
這個值告訴我們權重的任何變化如何影響損失。
為了計算梯度,我們使用鍊式法則來尋找導數。我們使用鍊式法則是因為誤差不受權重的直接影響, 權重影響預激活函數,進而影響激活函數,進而影響輸出,最後影響損失。下面的樹顯示了每個術語如何依賴于上面網絡中的另一個術語。
預激活函數取決于輸入、權重和偏差、激活函數依賴于預激活函數、損失取決于激活函數
圖像右上角的 y 是與預測輸出進行比較并計算損失的真實值。
所以當我們應用鍊式法則時,我們得到:
我們有另一個詞來指代這個梯度,即損失相對于權重的瞬時變化率。将這些從單個神經元網絡的梯度計算中獲得的知識外推到具有四層的真正神經網絡:一個輸入層、兩個隐藏層和一個輸出層。
每個神經元的預激活函數由下式給出
除了我們沒有激活函數的輸入層之外的所有神經元都是如此。因為在輸入層中z 隻是輸入與其權重相乘的總和(不是前一個神經元的激活輸出)。
這裡的梯度由下式給出,
其中 w 是分别連接 L-1 層和 L 層節點 k 和 j 的權重。k 是前一個節點,j 是後繼節點。但是這可能會引發一個新的問題:為什麼是wjk而不是wkj呢?這隻是在使用矩陣将權重與輸入相乘時要遵循的命名約定。(所以暫時先不管他)
下面的樹可以看到它們之間相互依賴
可以看到,前一層節點的激活函數的輸出作為後一層節點的輸入。如果知道以下項的值,就可以輕松計算輸出節點中的梯度:
但是當我們在隐藏層計算梯度時,我們必須單獨計算損失函數相對于激活函數的導數,然後才能在上面的公式中使用它。
這個方程與第一個方程幾乎相同(損失函數相對于權重的推導)。但在這裡有一個總結。這是因為與權重不同,一個神經元的激活函數可以影響它所連接的下一層中所有神經元的結果。
需要說明的是 :這裡沒有編寫用于推導與輸出層中的激活函數相關的損失函數的鍊式法則的單獨方程。那是因為輸出層的激活函數直接影響誤差。但隐藏層和輸入層的激活函數并非如此。它們通過網絡中的不同路徑間接影響最終輸出。
通過以上的計算,在計算網絡中所有節點的梯度後,乘以學習率并從相應的權重中減去。
這就是反向傳播和權重調整的方式。經過多次叠代這個過程,将損失減少到全局最小值,最終訓練結束。
還差一個偏差偏差也以與重量相同的方式經曆一切!
與權重一樣,偏差也會影響網絡的輸出。因此在每次訓練叠代中,當針對權重的損失計算梯度時,同時計算相對于偏差的損失的梯度。
對于隐藏層,損失函數相對于前一層激活函數的推導也将使用鍊式法則單獨計算。因此梯度被反向傳播并且每個節點的偏差被調整。
總結當損失被反向傳播和最小化時,這就是在每個訓練循環期間發生的所有事情。我希望這篇文章已經消除了數學中的晦澀難懂的概念,并使用了一種簡單的方式将整個反向傳播的過程描述清楚了。如果你有什麼建議,歡迎留言。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!