吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

多樣本向量化(Vectorizing across multiple examples)

在上一個筆記中,瞭解到如何針對於單一的訓練樣本,在神經網絡上計算出預測值。

在這篇筆記中,將會了解到如何向量化多個訓練樣本,並計算出結果。

該過程與你在邏輯迴歸中所做類似(看過的是否還記得??)

邏輯迴歸是將各個訓練樣本組合成矩陣,對矩陣的各列進行計算。神經網絡是通過對邏輯迴歸中的等式簡單的變形,讓神經網絡計算出輸出值。這種計算是所有的訓練樣本同時進行的,以下是實現它具體的步驟:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

上一篇筆記中得到的四個等式。它們給出如何計算出z^([1]),a^([1]),z^([2]),a^([2])。

對於一個給定的輸入特徵向量X,這四個等式可以計算出α^([2])等於y^。

這是針對於單一的訓練樣本。如果有m個訓練樣本,那麼就需要重複這個過程。

用第一個訓練樣本x^([1])來計算出預測值y^([1]),就是第一個訓練樣本上得出的結果。

然後,用x^([2])來計算出預測值y^([2]),循環往復,直至用x^([m])計算出y^([m])。

用激活函數表示法,如上圖左下所示,它寫成a^([2](1))、a^([2](2))和a^([2](m))。

【注】:a^([2](i)),(i)是指第i個訓練樣本而[2]是指第二層。

如果有一個非向量化形式的實現,而且要計算出它的預測值,對於所有訓練樣本,需要讓i從1到m實現這四個等式:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

對於上面的這個方程中的^(i),是所有依賴於訓練樣本的變量,即將(i)添加到x,z和a。如果想計算m個訓練樣本上的所有輸出,就應該向量化整個計算,以簡化這列。

本課程需要使用很多線性代數的內容,重要的是能夠正確地實現這一點,尤其是在深度學習的錯誤中。實際上本課程認真地選擇了運算符號,這些符號只是針對於這個課程的,並且能使這些向量化容易一些。

所以,希望通過這個細節可以更快地正確實現這些算法。接下來講講如何向量化這些: 公式1:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

公式2:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

公式3:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

公式4:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

前一張中的for循環是來遍歷所有個訓練樣本。 定義矩陣X等於訓練樣本,將它們組合成矩陣的各列,形成一個n維或n乘以m維矩陣。接下來計算見公式4:

以此類推,從小寫的向量x到這個大寫的矩陣X,只是通過組合x向量在矩陣的各列中。

同理,z^([1](1)),z^([1](2))等等都是z^([1](m))的列向量,將所有m都組合在各列中,就的到矩陣Z^([1])。

同理,a^([1](1)),a^([1](2)),……,a^([1](m))將其組合在矩陣各列中,如同從向量x到矩陣X,以及從向量z到矩陣Z一樣,就能得到矩陣A^([1])。

同樣的,對於Z^([2])和A^([2]),也是這樣得到。

這種符號其中一個作用就是,可以通過訓練樣本來進行索引

這就是水平索引對應於不同的訓練樣本的原因,這些訓練樣本是從左到右掃描訓練集而得到的。

在垂直方向,這個垂直索引對應於神經網絡中的不同節點

例如,這個節點,該值位於矩陣的最左上角對應於激活單元,它是位於第一個訓練樣本上的第一個隱藏單元。它的下一個值對應於第二個隱藏單元的激活值。它是位於第一個訓練樣本上的,以及第一個訓練示例中第三個隱藏單元,等等。

當垂直掃描,是索引到隱藏單位的數字。

當水平掃描,將從第一個訓練示例中從第一個隱藏的單元到第二個訓練樣本,第三個訓練樣本……直到節點對應於第一個隱藏單元的激活值,且這個隱藏單元是位於這m個訓練樣本中的最終訓練樣本。

從水平上看,矩陣A代表了各個訓練樣本。

從豎直上看,矩陣A的不同的索引對應於不同的隱藏單元。

對於矩陣Z,X情況也類似,

水平方向上,對應於不同的訓練樣本;

豎直方向上,對應不同的輸入特徵,而這就是神經網絡輸入層中各個節點。

神經網絡上通過在多樣本情況下的向量化來使用這些等式。

向量化實現的解釋(Justification for vectorized implementation)

在上面,我們學習到如何將多個訓練樣本橫向堆疊成一個矩陣X,然後就可以推導出神經網絡中前向傳播(forward propagation)部分的向量化實現。

我們將會繼續瞭解到,為什麼上面寫下的公式就是將多個樣本向量化的正確實現。

我們先手動對幾個樣本計算一下前向傳播,看看有什麼規律:

公式5:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

這裡,為了描述的簡便,我們先忽略掉 b^([1])後面你將會看到利用Python 的廣播機制,可以很容易的將b^([1]) 加進來(這個可以理解為只有wx項)。

現在 W^([1]) 是一個矩陣,x^(1),x^(2),x^(3)都是列向量,矩陣乘以列向量得到列向量,下面將它們用圖形直觀的表示出來: 公式6:

吳恩達深度學習(17)-神經網絡中的多樣本向量化實現再理解

視頻中,吳恩達老師很細心的用不同的顏色表示不同的樣本向量,及其對應的輸出。所以從圖中可以看出,當加入更多樣本時,只需向矩陣X中加入更多列(記得上面寫的豎直看代表什麼?)。

所以從這裡我們也可以瞭解到,為什麼之前我們對單個樣本的計算要寫成 z^([1](i))=W^([1]) x^((i))+b^([1]) 這種形式,因為當有不同的訓練樣本時,將它們堆到矩陣X的各列中,那麼它們的輸出也就會相應的堆疊到矩陣 Z^([1]) 的各列中。

現在我們就可以直接計算矩陣 Z^([1]) 加上b^([1]),因為列向量 b^([1]) 和矩陣 Z^([1])的列向量有著相同的尺寸,而Python的廣播機制對於這種矩陣與向量直接相加的處理方式是,將向量與矩陣的每一列相加。

所以這一節只是說明了為什麼公式 Z^([1])=W^([1]) X+ b^([1])是前向傳播的第一步計算的正確向量化實現,但事實證明,類似的分析可以發現,前向傳播的其它步也可以使用非常相似的邏輯,即如果將輸入按列向量橫向堆疊進矩陣,那麼通過公式計算之後,也能得到成列堆疊的輸出。

最後,對這一段內容做一個總結:

由公式1、公式2、公式3、公式4可以看出,使用向量化的方法,可以不需要顯示循環,而直接通過矩陣運算從X就可以計算出 A^([1]),實際上X可以記為 A^([0]),使用同樣的方法就可以由神經網絡中的每一層的輸入 A^([i-1]) 計算輸出 A^([i])。其實這些方程有一定對稱性,其中第一個方程也可以寫成Z^([1])=W^([1]) A^([0])+b^([1]),你看這對方程,還有這對方程形式其實很類似,只不過這裡所有指標加了1。所以這樣就顯示出神經網絡的不同層次,你知道大概每一步做的都是一樣的,或者只不過同樣的計算不斷重複而已。

這裡我們有一個雙層神經網絡,我們在後面的筆記裡會講深得多的神經網絡,你看到隨著網絡的深度變大,基本上也還是重複這兩步運算,只不過是比這裡你看到的重複次數更多。在下週的視頻中將會講解更深層次的神經網絡,隨著層數的加深,基本上也還是重複同樣的運算。

以上就是對神經網絡向量化實現的正確性的解釋,到目前為止,我們僅使用sigmoid函數作為激活函數,事實上這並非最好的選擇,在下一篇筆記中,將會繼續深入的講解如何使用更多不同種類的激活函數。

下一篇就是講解神經網絡的激活函數了,這個很重要哦,記得過來看!


分享到:


相關文章: