淺(深)層神經網絡-吳恩達學習筆記

1 神經網絡概覽

2 神經網絡表示

\begin{aligned} &a^{[0]}=x, a^{[0]} \in \mathbb{R}^{n_x},x \in \mathbb{R}^{n_x} \\ &z^{[1]} = W^{[1]}a^{[0]}+b^{[1]} \\ &a^{[1]} = g(z^{[1]}) \\ &z^{[2]} = W^{[2]}a^{[1]}+b^{[2]} \\ &a^{[2]} = g(z^{[2]}) \\ \end{aligned}

其中g是激活函數,W^{[l]},是用來與l-1的輸出當作l層的輸入做矩陣乘法得到l層的值,W^{[l]}的形狀是(l層單元數,l-1層單元數),b^{[l]}的形狀是(l層單元數,1),故

\begin{aligned} shape(W^{[1]})=(4,3), \ shape(b^{[1]})=(4,1)\\ shape(W^{[2]})=(1,4), \ shape(b^{[1]})=(1,1) \end{aligned}

3 激活函數

隱藏層單元激活函數:tanh幾乎總是優於sigmoid函數,因爲tanh的輸出介於(-1,1),激活函數的平均值更接近於0,在有些場景可能需要平移數據,讓數據的均值爲0,使用tanh也有類似數據中心化的效果,使得數據的均值更接近0,而非0.5,使下一層的學習更加方便。tanh和sigmoid有一個共同的缺點,當z很小或很大時,則其梯度非常小,會拖慢梯度下降算法。通常會使用Relu函數,當z小於0時,其梯度爲0,但是實踐中很少能碰到000000...的情況。

爲什麼要使用非線性激活函數,因爲若使用線性激活函數或恆等激活函數,則神經網絡只是將輸入線性組合再輸出,若使用線性激活函數或不使用激活函數,則無論神經網絡有多少層一直只是做的線性組合,唯一可使用線性激活函數的就是輸出層。舉例如下,隱藏層和輸出層均未使用激活函數,則輸出依舊是輸入的線性組合。

激活函數的導數

\begin{aligned} &sigmoid: g'(z) = (1-g(z))g(z) \\ &tanh: g'(z)=1-(g(z))^2 \end{aligned}

 4 神經網絡的梯度下降法

\left\{\begin{aligned} &a^{[0]}=x, a^{[0]} \in \mathbb{R}^{n_x},x \in \mathbb{R}^{n_x} \\ &z^{[1]} = W^{[1]}a^{[0]}+b^{[1]} \\ &a^{[1]} = g(z^{[1]}) \\ &z^{[2]} = W^{[2]}a^{[1]}+b^{[2]} \\ &a^{[2]} = g(z^{[2]}) \end{aligned} \left\{\begin{aligned} &dz^{[2]}=a^{[2]}-Y \\ &dw^{[2]}=1/m * dz^{[2]}a^{[1]}^T \\ &db^{[2]}=1/m * np.sum(dz^{[2]},axis=1,keepdims=True) \\ &dz^{[1]}= w^{[1]}^Tdz^{[2]} * g'(z^{[1]}) \\ &dw^{[2]}=1/m * dz^{[1]}a^{[0]}^T \\ &db^{[1]}=1/m * np.sum(dz^{[1]},axis=1,keepdims=True) \\ \end{aligned}

5 隨機初始化

爲何要隨機初始化:舉例如下,若將W^{[1]}初始化爲0,則由於全連接層,每個隱藏層單元的輸入都是一樣的,現在權重也一樣,則隱藏層單元的輸出也一樣,即a^{[1]}_1=a^{[1]}_2,然後若W^{[2]}也初始化爲0,則他們的梯度也一樣,即dz^{[1]}_1 = dz^{[1]}_2,以爲這多次迭代後依舊a^{[1]}_1=a^{[1]}_2,相當於多個隱藏單元在計算相同的東西,故需要隨機初始化。

其實,只要W數據類似下面這種情況,也就是所有行向量相等,則所有隱藏層單元就計算的是同樣的東西

W = \begin{bmatrix} u & v & w\\ u & v & w \\ u & v & w \end{bmatrix}

爲什麼要用比較小的隨機值初始化,主要是怕遇到形如tanh和sigmoid的激活函數,若權重參數過大,則z很容易絕對值過大,即梯度很小,會拖慢梯度下降速度。

6 深層神經網絡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章