01.神经网络和深度学习 W3.浅层神经网络
文章目錄
- 1. 神經網絡概覽
- 2. 神經網絡的表示
- 3. 神經網絡的輸出
- 4. 多樣本向量化
- 5. 激活函數
- 6. 為什么需要 非線性激活函數
- 7. 激活函數的導數
- 8. 隨機初始化
- 作業
 
參考:
 吳恩達視頻課
 深度學習筆記
1. 神經網絡概覽
 xW[1]b[1]}?z[1]=W[1]x+b[1]?a[1]=σ(z[1])\left.\begin{array}{c}x \\ W^{[1]} \\ b^{[1]}\end{array}\right\} \Longrightarrow z^{[1]}=W^{[1]} x+b^{[1]} \Longrightarrow a^{[1]}=\sigma\left(z^{[1]}\right)xW[1]b[1]??????z[1]=W[1]x+b[1]?a[1]=σ(z[1])
第一層根據輸入計算 z[1]z^{[1]}z[1],然后計算第一層的輸出 a[1]a^{[1]}a[1]
a[1]=σ(z[1])W[2]b[2]}?z[2]=W[2]a[1]+b[2]?a[2]=σ(z[2])?L(a[2],y)\left.\begin{array}{r}a^{[1]}=\sigma\left(z^{[1]}\right) \\ W^{[2]} \\ b^{[2]}\end{array}\right\} \Longrightarrow z^{[2]}=W^{[2]} a^{[1]}+b^{[2]} \Longrightarrow a^{[2]}=\sigma\left(z^{[2]}\right)\\ \Longrightarrow L(a^{[2]}, y)a[1]=σ(z[1])W[2]b[2]??????z[2]=W[2]a[1]+b[2]?a[2]=σ(z[2])?L(a[2],y)
把第一層的輸出 a[1]a^{[1]}a[1] 作為第二層的輸入,計算 z[2]z^{[2]}z[2],代入 sigmoid 函數,得到輸出 a[2]a^{[2]}a[2],進而計算損失函數
da[1]=dσ(z[1])dW[2]db[2]}?dz[2]=d(W[2]a[1]+b[2])?da[2]=dσ(z[2])?dL(a[2],y)\left.\begin{array}{rl}d a^{[1]}=d \sigma\left(z^{[1]}\right) & \\ d W^{[2]} \\ d b^{[2]}\end{array}\right\} \Longleftarrow d z^{[2]}=d\left(W^{[2]} a^{[1]}+b^{[2]}\right) \Longleftarrow d a^{[2]}=d \sigma\left(z^{[2]}\right)\\ \Longleftarrow dL(a^{[2]}, y)da[1]=dσ(z[1])dW[2]db[2]??????dz[2]=d(W[2]a[1]+b[2])?da[2]=dσ(z[2])?dL(a[2],y)
還有反向的求導過程
2. 神經網絡的表示
3. 神經網絡的輸出
 每個神經網絡單元的工作包括兩部分:計算 zzz,然后根據激活函數(sigmoid)計算 σ(z)\sigma(z)σ(z)
z1[1]=w1[1]Tx+b1[1],a1[1]=σ(z1[1])z2[1]=w2[1]Tx+b2[1],a2[1]=σ(z2[1])z3[1]=w3[1]Tx+b3[1],a3[1]=σ(z3[1])z4[1]=w4[1]Tx+b4[1],a4[1]=σ(z4[1])\begin{aligned} z_{1}^{[1]} &=w_{1}^{[1] T} x+b_{1}^{[1]}, \quad a_{1}^{[1]}=\sigma\left(z_{1}^{[1]}\right) \\ z_{2}^{[1]} &=w_{2}^{[1] T} x+b_{2}^{[1]}, \quad a_{2}^{[1]}=\sigma\left(z_{2}^{[1]}\right) \\ z_{3}^{[1]} &=w_{3}^{[1] T} x+b_{3}^{[1]}, \quad a_{3}^{[1]}=\sigma\left(z_{3}^{[1]}\right) \\ z_{4}^{[1]} &=w_{4}^{[1] T} x+b_{4}^{[1]}, \quad a_{4}^{[1]}=\sigma\left(z_{4}^{[1]}\right) \end{aligned}z1[1]?z2[1]?z3[1]?z4[1]??=w1[1]T?x+b1[1]?,a1[1]?=σ(z1[1]?)=w2[1]T?x+b2[1]?,a2[1]?=σ(z2[1]?)=w3[1]T?x+b3[1]?,a3[1]?=σ(z3[1]?)=w4[1]T?x+b4[1]?,a4[1]?=σ(z4[1]?)?
[layer] 上標表示第幾層,下標表示該層的第幾個節點
 a[1]=[a1[1]a2[1]a3[1]a4[1]]=σ(z[1])a^{[1]}=\left[\begin{array}{c}a_{1}^{[1]} \\ a_{2}^{[1]} \\ a_{3}^{[1]} \\ a_{4}^{[1]}\end{array}\right]=\sigma\left(z^{[1]}\right)a[1]=??????a1[1]?a2[1]?a3[1]?a4[1]????????=σ(z[1])
 
- 輸入一個樣本的特征向量,四行代碼計算出一個簡單神經網絡的輸出,那么多個樣本呢?往下看
4. 多樣本向量化
對于 m 個樣本,(i)表示第i個樣本
z[1](i)=W[1](i)x(i)+b[1](i)a[1](i)=σ(z[1](i))z[2](i)=W[2](i)a[1](i)+b[2](i)a[2](i)=σ(z[2](i))\begin{aligned} z^{[1](i)} &=W^{[1](i)} x^{(i)}+b^{[1](i)} \\ a^{[1](i)} &=\sigma\left(z^{[1](i)}\right) \\ z^{[2](i)} &=W^{[2](i)} a^{[1](i)}+b^{[2](i)} \\ a^{[2](i)} &=\sigma\left(z^{[2](i)}\right) \end{aligned}z[1](i)a[1](i)z[2](i)a[2](i)?=W[1](i)x(i)+b[1](i)=σ(z[1](i))=W[2](i)a[1](i)+b[2](i)=σ(z[2](i))?
- 為了向量化計算,進行堆疊
 x=[????x(1)x(2)?x(m)????]x=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]x=??????x(1)???x(2)???????x(m)???????
Z[1]=[????z[1](1)z[1](2)?z[1](m)????]Z^{[1]}=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & \cdots & z^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]Z[1]=??????z[1](1)???z[1](2)???????z[1](m)???????
A[1]=[????α[1](1)α[1](2)?α[1](m)????]A^{[1]}=\left[\begin{array}{cccc}\vdots & \vdots & \vdots & \vdots \\ \alpha^{[1](1)} & \alpha^{[1](2)} & \cdots & \alpha^{[1](m)} \\ \vdots & \vdots & \vdots & \vdots\end{array}\right]A[1]=??????α[1](1)???α[1](2)???????α[1](m)???????
z[1](i)=W[1](i)x(i)+b[1]α[1](i)=σ(z[1](i))z[2](i)=W[2](i)α[1](i)+b[2]α[2](i)=σ(z[2](i))}?{A[1]=σ(z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(z[2])\left.\begin{array}{c}z^{[1](i)}=W^{[1](i)} x^{(i)}+b^{[1]} \\ \alpha^{[1](i)}=\sigma\left(z^{[1](i)}\right) \\ z^{[2](i)=W^{[2](i)} \alpha^{[1](i)}+b^{[2]}} \\ \alpha^{[2](i)}=\sigma\left(z^{[2](i)}\right)\end{array}\right\} \Longrightarrow \left\{ \begin{array}{c} A^{[1]}=\sigma\left(z^{[1]}\right) \\ z^{[2]}=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]}=\sigma\left(z^{[2]}\right)\end{array}\right.z[1](i)=W[1](i)x(i)+b[1]α[1](i)=σ(z[1](i))z[2](i)=W[2](i)α[1](i)+b[2]α[2](i)=σ(z[2](i))??????????????A[1]=σ(z[1])z[2]=W[2]A[1]+b[2]A[2]=σ(z[2])?
列向看,對應于不同的特征,就是神經網絡中的該層的各個節點
 行向看,對應于不同的訓練樣本
5. 激活函數
- tanh激活函數是 sigmoid的平移伸縮結果,其效果在所有場合都優于sigmoid,tanh幾乎適合所有場合
- 例外是,二分類問題的輸出層,想讓結果介于 0,1之間,所以使用 sigmoid 激活函數
tanh、 sigmoid兩者的缺點:
- 在特別大或者特別小 zzz 的情況下,導數的梯度 或者 函數的斜率會變得特別小,最后就會接近于0,導致降低梯度下降的速度。
- 修正線性單元的函數(ReLu)
激活函數的選擇經驗:
-  如果輸出是0、1值(二分類問題),輸出層 選擇sigmoid函數,其它所有單元都選擇Relu函數 
-  隱藏層通常會使用Relu激活函數。有時,也會使用tanh激活函數,但Relu的一個缺點是:當是負值的時候,導數等于0 
-  另一個版本的Relu被稱為Leaky Relu,當是負值時,這個函數的值不等于0,而是輕微的傾斜,這個函數通常比Relu激活函數效果要好,盡管在實際中Leaky ReLu使用的并不多 
ReLu、Leaky ReLu的優點:
-  sigmoid函數需要進行浮點四則運算,在實踐中,使用ReLu激活函數學習的更快 
-  sigmoid和tanh函數的導數在正負飽和區的梯度接近于0,這會造成梯度彌散,而Relu和Leaky ReLu函數大于0部分都為常數,不會產生梯度彌散現象。(Relu進入負半區的時候,梯度為0,神經元此時不會訓練,產生所謂的稀疏性,而Leaky ReLu不會有這問題) 
-  雖然ReLu的梯度一半都是0,但是,有足夠的隱藏層使得 zzz 值大于0,所以對大多數的訓練數據來說學習過程仍然可以很快 
6. 為什么需要 非線性激活函數
線性隱藏層一點用也沒有,因為線性函數的組合本身就是線性函數,所以除非你引入非線性,否則你無法計算出更有趣的函數,即使網絡層數再多也不行
- 不能在隱藏層用線性激活函數,可以用ReLU、tanh、leaky ReLU或者其他的非線性激活函數
- 唯一可以用 線性激活函數的通常就是輸出層;在隱藏層使用 線性激活函數非常少見
7. 激活函數的導數
- sigmoid
 
 a=g(z);g′(z)=ddzg(z)=a(1?a)a=g(z) ;\quad g^{\prime}(z)=\fracze8trgl8bvbq{d z} g(z)=a(1-a)a=g(z);g′(z)=dzd?g(z)=a(1?a)
- tanh
 
a=g(z);g′(z)=ddzg(z)=1?a2a=g(z) ; \quad g^{\prime}(z)=\fracze8trgl8bvbq{d z} g(z)=1-a^2a=g(z);g′(z)=dzd?g(z)=1?a2
-  ReLu Rectified Linear Unit 
 
 g′(z)={0if?z<01if?z>0undefinedif?z=0g^{\prime}(z)=\left\{\begin{array}{ll}0 & \text { if } z<0 \\ 1 & \text { if } z>0 \\ u n d e f i n e d & \text { if } z=0\end{array}\right.g′(z)=????01undefined??if?z<0?if?z>0?if?z=0?
 z=0z=0z=0 時,可以讓導數為 0,或者 1
-  Leaky ReLU Leaky linear unit 
 
 g′(z)={0.01if?z<01if?z>0undefinedif?z=0g^{\prime}(z)=\left\{\begin{array}{ll}0.01 & \text { if } z<0 \\ 1 & \text { if } z>0 \\ u n d e f i n e d & \text { if } z=0\end{array}\right.g′(z)=????0.011undefined??if?z<0?if?z>0?if?z=0?
 z=0z=0z=0 時,可以讓導數為 0.01,或者 1
8. 隨機初始化
對于一個神經網絡,如果你把權重或者參數都初始化為0,那么梯度下降將不會起作用。
W[1]=np.random.randn(2,2)?0.01,b[1]=np.zeros?((2,1))W[2]=np.random.randn(2,2)?0.01,b[2]=0\begin{aligned} W^{[1]} &=n p . \text {random.randn}(2,2) * 0.01, \quad b^{[1]}=n p . z \operatorname{eros}((2,1)) \\ W^{[2]} &=n p . \text {random.randn}(2,2) * 0.01, \quad b^{[2]}=0 \end{aligned}W[1]W[2]?=np.random.randn(2,2)?0.01,b[1]=np.zeros((2,1))=np.random.randn(2,2)?0.01,b[2]=0?
 常數為什么是0.01,而不是100或者1000,sigmoid/tanh 激活函數在很平坦的地方,學習非常慢
當你訓練一個非常非常深的神經網絡,你可能要試試0.01以外的常數
作業
01.神經網絡和深度學習 W3.淺層神經網絡(作業:帶一個隱藏層的神經網絡)
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
 
總結
以上是生活随笔為你收集整理的01.神经网络和深度学习 W3.浅层神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: LeetCode 1670. 设计前中后
- 下一篇: LeetCode 740. 删除与获得点
