別急,它來了!反向傳播原來這麼簡單 | 神經網絡 | 損失函數與Softmax(1)

2021-03-02 AI算法詞典
回顧深度神經網絡

神經網絡是由權值、截距、激活函數、歸一化方法和損失函數逐層構造而成,同樣地,我們將使用由sklearn提供的手寫數字作為神經網絡的數據集。

nums_8x8 = load_digits()

data = nums_8x8.images[13:16] / np.max(nums_8x8.images[13:16])
data = data.reshape(len(data), -1)
labels = nums_8x8.target[13:16]

在將數據放入神經網絡時,記得將像素值歸一化成0到1之間的值。

x_l1 = layer(data, 64, 32)
x_b1 = batch_norm(x_l1)
x_a1 = relu(x_b1)

x_l2 = layer(x_a1, 32, 16)
x_b2 = batch_norm(x_l2)
x_a2 = relu(x_b2)

x_l3 = layer(x_a2, 16, 10)
x_b3 = batch_norm(x_l3)
y_pred = softmax(x_b3)

為了評估神經網絡預測的質量,所有ground truth標籤都應該轉換成 one-hot格式對齊網絡輸出結果,這樣它們才可以被放入一個損失函數。

def one_hot(labels, class_num=10):
    return np.eye(class_num, dtype=float)[labels]

y = one_hot(nums_8x8.target[13:16], class_num=10)
loss = dl.cross_entropy(y, y_pred)
print(np.round(loss, decimals=2))

輸出:
[[0.2  0.24 0.02 1.59 0.03 0.03 0.11 0.22 0.02 0.01]
 [0.02 0.03 0.26 0.04 1.35 0.03 0.02 0.05 0.29 0.08]
 [0.07 0.04 0.07 0.03 0.04 1.19 0.16 0.03 0.05 0.26]]

然而,神經網絡計算過程中的參數都保存在函數中,這使得我們無法有效地獲取並進一步更新它們。定義這些函數的更好方法是使用 class (類),因為類的屬性是可變的。為了使我們的代碼保持一致性,所有的函數將被重寫為類。

在前兩步損失函數與 softmax 函數的反向傳播中,由於沒有轉置和歸一化操作,所以很容易計算梯度。一個常用的導數函數就可以清晰地指導編程工作。相反,為了正確計算梯度,必須認真考慮線性代數的概念

1. Derivative of Loss Function

反向傳播的第一步是從損失函數開始的,損失函數應該取決於我們遇到的任務類型: 回歸 or 分類。對於回歸任務,平方損失函數是一個正確的選擇:

class SquareLoss(object):
    def loss(self, y, y_pred):
        return 0.5 * np.power((y - y_pred), 2)

    def gradient(self, y, y_pred):
        return -(y - y_pred)

對於分類問題而言,我們則需要選擇交叉熵作為損失函數。

class CrossEntropyLoss(object):
    def __call__(self, y, y_pred):
        # Avoid division by zero
        y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
        return - y * np.log(y_pred) - (1 - y) * np.log(1 - y_pred)

    def gradient(self, y, y_pred):
        # Avoid division by zero
        y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
        return - (y / y_pred) + (1 - y) / (1 - y_pred)

對於數據而言,接下來的代碼就是反向傳播的起點,one-hot 格式下的標籤和預測結果需要同事被輸入計算損失函數的梯度,並且每一個函數都需要先被實例化之後才能開始工作。

ce = CrossEntropyLoss()
loss_grad = ce.gradient(y, y_pred)
print(np.round(loss_grad, decimals=2))

輸出:
[[ 1.22  1.27  1.02 -4.92  1.03  1.03  1.12  1.24  1.02  1.01]
 [ 1.02  1.03  1.29  1.04 -3.87  1.03  1.02  1.05  1.34  1.08]
 [ 1.07  1.04  1.07  1.03  1.04 -3.29  1.18  1.03  1.05  1.3 ]]

2. Derivative of Softmax Function

第二站來到了softmax函數,這個函數用來把神經網絡的輸出轉化成概率的形式,是個非常重要的環節。

我們想在這裡添加 𝑐 的原因是因為當輸入向量包含大數字時,它可以防止類間的概率多樣性被抹除。為了求導softmax函數,我們將使用除法法則:

若將此一法則套用到 softmax 函數中,則𝑔(𝑥)表示分子而ℎ(𝑥)表示分母:

並且𝑗代表了從1到n個類之間的某一個值,這麼一來,在求一階導的過程中只有對應的類別才會留下常數項。

class Softmax():
    def __call__(self, x):
        e_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
        return e_x / np.sum(e_x, axis=-1, keepdims=True)

    def gradient(self, x):
        p = self.__call__(x)
        return p * (1 - p)

當我們想要將softmax函數應用於反向傳播時,注意梯度是基於鏈式法則的。因此,我們不僅要計算softmax函數的梯度,還要乘以先前從損失函數計算出的梯度。

softmax = Softmax()
softmax_grad = softmax.gradient(x_b3) * loss_grad
print(np.round(softmax_grad, decimals=2))

輸出:
[[ 0.18  0.21  0.02 -0.8   0.02  0.03  0.11  0.2   0.02  0.01]
 [ 0.02  0.03  0.23  0.04 -0.74  0.03  0.02  0.05  0.25  0.08]
 [ 0.07  0.04  0.07  0.03  0.04 -0.7   0.15  0.03  0.05  0.23]

相關焦點

  • 神經網絡反向傳播的數學原理
    接下來介紹矩陣、向量求導的維數相容原則利用維數相容原則快速推導反向傳播編程實現前向傳播、反向傳播卷積神經網絡的反向傳播快速矩陣、向量求導這一節展示如何使用鏈式法則、轉置、組合等技巧來快速完成對矩陣對於矩陣、向量求導:如何證明經過維數相容原則調整後的結果是正確的呢?直覺!簡單就是美...快速反向傳播神經網絡的反向傳播求得 「各層」 參數
  • Softmax(假神經網絡)與詞向量的訓練
    sigmoid的理解程度啦~ 習慣性的交待一下前置鋪墊:1、詞袋模型、獨熱與詞向量概念掃盲2、sigmoid到softmax(至關重要)3、邏輯回歸4、邏輯回歸到神經網絡 總之,請務必清楚詞向量的概念,深刻理解softmax的概念和公式內的意義。
  • 乾貨送達丨神經網絡丨損失函數與歸一化(3)
    在上一章節關於神經元的介紹中,我們了解了激勵函數是如何引入非線性性質的,以及多張圖片如何拼在一起送入神經網絡進行計算。本次將介紹神經網絡訓練前的最後兩個關鍵點:損失函數與歸一化。5. [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]每一行向量代表了對某個樣本,網絡判斷其歸屬於各個類別的概率,如第一行第三個位置是 1,表示了第一條數據屬於第三個類別的概率是 1,也就是神經網絡 100% 地確認它屬於第三類。
  • 【softmax】詳解softmax函數以及相關求導過程
    激活函數,以及它的梯度求導過程,整理一下便於分享和交流!一、softmax函數softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!假設我們有一個數組,V,Vi表示V中的第i個元素,那麼這個元素的softmax值就是
  • 神經網絡中的各種損失函數介紹
    我們的目標是通過優化神經網絡的參數(權重)來最大程度地減少神經網絡的損失。通過神經網絡將目標(實際)值與預測值進行匹配,再經過損失函數就可以計算出損失。然後,我們使用梯度下降法來優化網絡權重,以使損失最小化。這就是我們訓練神經網絡的方式。均方誤差當你執行回歸任務時,可以選擇該損失函數。
  • 從最優化的角度看待Softmax損失函數
    Softmax交叉熵損失函數應該是目前最常用的分類損失函數了,在大部分文章都是從概率角度來解釋的(請讀者自行搜索),本文將嘗試從最優化的角度來推導出Softmax交叉熵損失函數,希望能夠啟發出更多的研究思路。
  • 從最優化的角度看待 Softmax 損失函數
    Softmax交叉熵損失函數應該是目前最常用的分類損失函數了,在大部分文章中,Softmax交叉熵損失函數都是從概率角度來解釋的,本周二極市就推送了一篇Softmax相關文章:一文道盡softmax loss及其變種。本文將嘗試從最優化的角度來推導出Softmax交叉熵損失函數,希望能夠啟發出更多的研究思路。
  • 神經網絡原來這麼簡單 機器學習入門貼送給你
    「神經網絡」一詞很流行,人們通常認為它很難,但其實要簡單得多。是不是這樣呢?先看再說。神經網絡的理解主要分為三個部分,神經元、神經網絡的構建、訓練神經網絡。神經元——神經網絡的基本單元在訓練神經網絡之前,首先需要一個方法來量化它做得有多「好」,是否能夠做得「更好」,那就是損失函數(loss)。這裡,我們將使用損失函數的一種——均方誤差來計算。
  • 通俗詳解softmax函數及其求導過程
    以及它的梯度求導過程,整理一下便於分享和交流!1、softmax函數講解2、softmax函數求導過程詳解3、softmax函數求導為什麼如此方便softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!
  • 神經網絡原來這麼簡單,機器學習入門貼送給你|乾貨
    我們就以神經網絡為例先來一睹為快吧!神經網絡概論作者說,神經網絡並不複雜!「神經網絡」一詞很流行,人們通常認為它很難,但其實要簡單得多。通常來說,激活函數使用Sigmoid函數,也就是常說的S型函數,輸入任意值(-∞,+∞),最後輸出都能停留在0-1之間。對此,他還舉了一個簡單的例子。以激活函數是S型函數、2輸入神經元為例,設置參數 w=[0,1] (w1=0,w2=1),b=4。
  • 談Softmax激活函數以及Softmax回歸和Logistic回歸關係
    一、神經網絡中的Softmax函數1、Softmax函數定義Softmax函數常在神經網絡輸出層充當激活函數,將輸出層的值通過激活函數映射到
  • 【Softmax】乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨
    神經網絡概論作者說,神經網絡並不複雜!「神經網絡」一詞很流行,人們通常認為它很難,但其實要簡單得多。是不是這樣呢?先看再說。神經網絡的理解主要分為三個部分,神經元、神經網絡的構建、訓練神經網絡。神經元——神經網絡的基本單元
  • 神經網絡(1):使用python計算神經網絡中的Jacobian矩陣
    一般來說,神經網絡是一個多元矢量值函數,如下所示:使用這種標量損失時,M = 1,使用(隨機)梯度下降來學習參數,重複計算損失函數相對於θ的梯度。假設有一個簡單的網絡[affine→ReLU→affine→softmax]。
  • CS231N 06: 神經網絡、損失函數
    如果將其忽略,則兩個矩陣可以合為一個矩陣,因此預測的類分數將再次是輸入的線性函數。非線性函數是改變的關鍵點。參數 W2, W1 是通過隨機梯度下降學習的,其梯度是通過鏈式規則導出的(並通過反向傳播計算)。
  • 神經網絡為何非激活函數不可?
    本文作者 Vandit Jain 對激活函數的相關知識進行了一個較為全面的總結,重點聚焦於以下幾個方面:一、激活函數是什麼?簡單地說,激活函數就是加入到人工神經網絡中的一個函數,目的在於幫助神經網絡從數據中學習複雜模式。
  • 用Python實現多層感知器神經網絡
    常見的非線性激活函數為S型,softmax,整流線性單位(ReLU)或簡單的tanH。激活函數有很多選項,但是在本文中我們僅涉及Sigmoid和softmax。圖1:感知器對於有監督的學習,我們稍後將輸入的數據通過一系列隱藏層轉發到輸出層。這稱為前向傳播。在輸出層,我們能夠輸出預測y。
  • 菜鳥:簡單神經網絡train and test詳解(雙層)
    簡單神經網絡train and test詳解(雙層)【 The latest data : 2018/05/01 】Yuchen1. NN模型如下神經網絡整體架構內容可參考之前的雲筆記《06_神經網絡整體架構》http://note.youdao.com/noteshare?
  • 乾貨 | 淺談Softmax函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。
  • 乾貨 | 淺談 Softmax 函數
    引言Softmax函數幾乎是深度學習中的標配了,在人工神經網絡中,幾乎無處不可見softmax函數的身影。可以認為softmax是arg max操作的一種平滑近似。我將softmax的用途總結為兩種:分類:給定一系列類別,softmax可以給出某輸入被劃分到各個類別的概率分布。