天天看點

淺層神經網絡

神經網絡表示

淺層神經網絡

 所謂“隐藏”的含義就是在訓練集中這些中間節點的真正數值我們是不知道的,在訓練集中我們看不到它們的數值。我們能看到輸入值,也能看到輸出值,但是隐藏層的值我們是無法看到的

之前我們利用x來表示輸入特征,現在我們也可以使用

淺層神經網絡

來表示,它意味着網絡中不同層的值會傳遞給後面的層

輸入層将x的值傳遞給隐藏層,我們将輸入層的激活值稱為a[0]

下一層隐藏層也會産生一些激活值,我們将其記作a[1]

這裡的第一個單元或者說節點我們将其表示為

淺層神經網絡

以此類推。

淺層神經網絡

 這裡是一個四維向量,一個4*1矩陣,是以這個圖中有四個節點,或者說四個隐藏層單元。

輸出層的話表示的就是a[2]

在此例中這是個雙層神經網絡。這裡不算輸入層,隐藏層是第一層

隐藏層有兩個相關的參數w和b

計算神經網絡的輸出

淺層神經網絡

 先看左圖,這個是logistic回歸的計算,分兩步,先計算一下z,之後 再計算激活函數也就是sigmoid函數。而右圖的神經網絡呢就是重複計算這兩步驟多次。

隻看隐藏層的第一個節點,我們就可以把這個第一個節點看作是左圖的這個圓。然後先計算

淺層神經網絡

,這裡因為是第一個節點,我們都在符号上面加上一個下标

淺層神經網絡

,之後第二步就是計算激活函數了

淺層神經網絡

 按照之前我們所說的符号第一個節點就寫成了a1[1]

上标表示層數;下标表示 層中的第幾個節點。

剩下的幾個節點也是按照以上方法進行計算。

淺層神經網絡

 然後我們可以将它們進行向量化

淺層神經網絡

 像這樣,之後 , 我們可以将這些符号w啥的,進行一下堆疊,成為一個w[1]

淺層神經網絡

整體來說的話就是,輸入一個特征x,然後到隐藏層,先進行兩步計算,完了之後 我們到輸出層進行計算,輸出層計算的話和上面那個左圖是一樣,也是一個圓,也是分兩步進行計算。然後上标就改為[2]即可。是以當我們遇到像這種的神經網絡計算單個特征向量時,我們再寫代碼時隻需要寫這四步就可以了。

多個例子中的向量化

淺層神經網絡

這個表示第二層的第i 個特征向量

前面有了解到單個特征向量的計算輸出。那麼如果是有多個呢,無非就是重複幾次計算嘛

淺層神經網絡

 利用for循環來周遊一下。

淺層神經網絡

 這些也可以實作向量化

淺層神經網絡
淺層神經網絡

 這裡就是将一些符号進行了一下堆疊實作向量化

激活函數

在神經網絡的正向傳播步驟中,

淺層神經網絡

 有這兩步用的激活函數。這裡我們可以使用g來代替

淺層神經網絡

,有一個激活函數效果要比

淺層神經網絡

 好一些,就是tanh函數,雙曲正切函數。

淺層神經網絡

,介于-1到1之間

淺層神經網絡

現在

淺層神經網絡

函數和tanh函數都有一個缺點就是如果z非常大或非常小,那麼導數的梯度或者說這個函數的斜率可能 就很小,是以z很大或很小的時候函數的斜率很接近0,這樣會拖慢梯度下降算法。這時,在機器學習裡有一個叫修正線性單元,relu函數。

淺層神經網絡

 隻要z為正導數就為1,當z為負的時候,斜率就為0。

在選擇激活函數時有一些經驗法則,就是如果你在做二進制分類,輸出值為0和1,那麼

淺層神經網絡

函數很适合作為輸出層的激活函數,然後其他所有單元都有relu,如果你不确定隐層應該用哪個,那就可以用relu作為激活函數

淺層神經網絡

為什麼需要非線性激活函數

事實上,如果你想讓你的神經網絡能夠計算出有趣的函數,那必須使用非線性激活函數。

激活函數的導數

淺層神經網絡
淺層神經網絡
淺層神經網絡

 神經網絡的梯度下降法

單隐層神經網絡,有如下參數

淺層神經網絡

  使用nx

表示那麼多輸入特征

淺層神經網絡

 那麼矩陣w[1]就是(n[1],n[0])

b[1]就是n[1]維向量,可以寫成(n[1],1),也就是列向量

b[2]的次元就是(n[2],1),矩陣w[2]就是(n[2],n[1])

還有一個神經網絡的成本函數:j。假設我們再做二進制分類,是以參數就是

j(w[1],b[1],w[2],b[2])=1/m  然後對損失函數求平均

淺層神經網絡

 然後這裡的l表示 當你的神經網絡預測出y帽時的損失函數

是以要訓練參數,算法就需要做梯度下降,在訓練神經網絡時,随機初始化參數很重要

當你把參數初始化成某些值 之後 每個梯度下降循環都會計算預測值

你要計算i=1到m的預測值y帽

淺層神經網絡

 然後計算導數,計算dw[1],

淺層神經網絡

 然後梯度下降最後會更新,将w[1]更新,b[1]也需要更新

淺層神經網絡

 這就是梯度下降的一次疊代循環,然後重複很多次,直到你的參數看起來在收斂

總結一下,正向傳播的方程

淺層神經網絡

 最後這個公式都是對整個訓練集向量化,若我們做的是二分分類的話,那麼最後這個激活函數應該是sigmoid函數。

輪到反向傳播了,也就是計算導數了。

淺層神經網絡

 這裡運用了一些python代碼,np.sum是python的numpy指令,用來對矩陣的一個次元求和,水準相加求和,而加上開關keepdims就是防止python,直接輸出這些古怪的值為1的數組,它的次元是(n,....),是以加上keepdims=true確定python輸出的是矩陣,對于db^[2]這個向量輸出的次元是(n,1)

随機初始化

當你訓練神經網絡時,随機初始化權重非常重要,對于logistic回歸可以将權重初始化為零,但如果将神經網絡的各參數數組全部初始化為0,再使用梯度下降算法那就完無效了。

當你有兩個輸入特征,即n^[0]=2,有兩個隐藏單元,n^[1]=2;與隐層相關的矩陣w^[1]是2*2的矩陣,是先将值都初始化為0

淺層神經網絡

  這些初始化的值都是一樣的,也就是說兩個單元都在做着完全相同的運算,結果也是完全相同的,無論你訓練 神經網絡多長時間,兩個隐藏單元仍然在計算完全一樣的函數,是以在這種情況下,多個隐藏單元就沒意義了。

是以我們就需要兩個不同的隐藏單元去計算不同的函數,解決方案就是随機初始化所有參數。

首先我們可以令w^[1]=np.random.randn(2,2)*0.01,這可以産生參數為(2,2)的高斯分布随機變量,然後你再乘以一個很小的數字,比如0.01,這樣你就将權重 初始化成很小的随機數。

b的話可以是0的。即b^[1]=np.zero((2,1))

對于w^[2]和b^[2]的話重複上面1的操作就行

淺層神經網絡

繼續閱讀