神經網絡和深度學習WU Week3——淺層神經網絡

1. 符號約定

  • [],中括號表示與層相關,如[1]表示第一層,以此類推,輸入層表示為[0]層,一個神經網絡的層數不包括輸入層;
  • (),仍然表示和樣本相關,如(1)表示第一個樣本點;
  • 每一層都計算 za,最后輸出層計算出來的a^{[]}就是輸出\hat{y};
  • 特征矩陣 X,參數W,b,類似的,W^{[2]}表示第二隱層的參數矩陣;
  • a^{[0]} = x,即特征向量(自變量);
  • a^{[1]}_i,第一個隱藏層第i個節點的輸出值;
  • 隱藏層與輸出層有參數,如隱藏層的參數W^{[1]},b^{[1]}

2. 只有一個隱層的神經網絡

2.1單隱層神經網絡

  • 輸入層
  • 輸出層
  • 隱藏層,之所以叫隱藏層是因為中間層的數值在訓練集看不到。
    如下圖所示,相關符號的意義參見符號規定節。


    單隱層神經網絡圖

2.2 計算神經網絡的輸出——單樣本點

圖例中的隱藏層有4個節點,在每個節點處進行如下的計算。


節點計算示意圖
  • 計算步驟(以第一個節點為例,第幾個節點只需要修改上標[]內的對應數值)
    • Step1 計算z^{[1]}_i = {w^{[1]}_1}^T \bullet x + b^{[1]}_1;
    • Step2 利用激活函數(sigmoid函數),計算a^{[1]}_1 = \sigma(z^{[1]}_1)
      即得到如下的計算式
      \begin{array}{l}{z_{1}^{[1]}=w_{1}^{[1] T} x+b_{1}^{[1]}, a_{1}^{[1]}=\sigma\left(z_{1}^{[1]}\right)} \\ {z_{2}^{[1]}=w_{2}^{[1] T} x+b_{2}^{[1]}, a_{2}^{[1]}=\sigma\left(z_{2}^{[1]}\right)} \\ {z_{3}^{[1]}=w_{3}^{[1] T} x+b_{3}^{[1]}, a_{3}^{[1]}=\sigma\left(z_{3}^{[1]}\right)} \\ {z_{4}^{[1]}=w_{4}^{[1] T} x+b_{4}^{[1]}, a_{4}^{[1]}=\sigma\left(z_{4}^{[1]}\right)}\end{array}
  • 向量化
    z^{[1]} = \begin{pmatrix}z^{[1]}_1\\z^{[1]}_2\\z^{[1]}_3\\z^{[1]}_4\end{pmatrix},即為4 \times 1的列向量
    W^{[1]}=\begin{pmatrix}{w_{1}^{[1] T}}\\ {w_{2}^{[1] T}} \\ {w_{3}^{[1] T} } \\ {w_{4}^{[1] T}}\end{pmatrix} = (w^{[1]}_1,w^{[1]}_2,w^{[1]}_3,w^{[1]}_4)^T
    b^{[1]} = \begin{pmatrix}b^{[1]}_1\\b^{[1]}_2\\b^{[1]}_3\\b^{[1]}_4\end{pmatrix}
    a^{[1]} = \begin{pmatrix}a^{[1]}_1\\ a^{[1]}_2\\ a^{[1]}_3\\ a^{[1]}_4\end{pmatrix}
    所以有
    z^{[1]} = W^{[1]}x + b^{[1]}
    a^{[1]} = \sigma(z^{[1]})
    考慮到x可以記作a^{[0]},從而有如下單隱層神經網絡的計算公式:

\begin{array}{l}{z^{[1]}=W^{[1]} a^{[0]}+b^{[1]}} \\ {a^{[1]}=\sigma\left(z^{[1]}\right)} \\ {z^{[2]}=W^{[2]} a^{[1]}+b^{[2]}} \\ {a^{[2]}=\sigma\left(z^{[2]}\right)}\end{array}

2.3 計算單隱層神經網絡的輸出——多樣本訓練集

  • 如果訓練集有m個樣本,需要對每個樣本都計算上面4個式子。

for i=1 to m:
\begin{aligned} z^{[1](i)} &=W^{[1]} x^{(i)}+b^{[1]} \\ a^{[1](i)} &=\sigma\left(z^{[1](i)}\right) \\ z^{[2](i)} &=W^{[2]} a^{[1](i)}+b^{[2]} \\ a^{[2](i)} &=\sigma\left(z^{[2](i)}\right) \end{aligned}

  • 向量化
    仍然采用前面的記號
    X = [x^{(1)},x^{(2)},...,x^{(m)}],即為n_x \times m矩陣,一列代表一個樣本。
    Z^{[1]} = [z^{[1] (1)},z^{[1] (2)},...,z^{[1] (m)}],即為4 \times m矩陣,一列代表一個樣本在不同節點的z值。
    A^{[1]} = [a^{[1] (1)},a^{[1] (2)},...,a^{[1] (m)}],即為4 \times m矩陣,一列代表一個樣本在不同節點的a值。
    即一列是同一層不同的節點,一行是同一層同一節點的不同樣本。
    從而有向量化結果:

\begin{aligned} Z^{[1]} &=W^{[1]} X+b^{[1]} \\ A^{[1]} &=\sigma\left(Z^{[1]}\right) \\ Z^{[2]} &=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]} &=\sigma\left(Z^{[2]}\right) \end{aligned}

考慮到X = A ^{[0]},所以可以寫成如下對稱的形式:

\begin{aligned} Z^{[1]} &=W^{[1]} A^{[0]}+b^{[1]} \\ A^{[1]} &=\sigma\left(Z^{[1]}\right) \\ Z^{[2]} &=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]} &=\sigma\left(Z^{[2]}\right) \end{aligned}

3 激活函數

3.1 激活函數

在前面的推導中,我們的激活函數一直用的 sigmoid函數\sigma(z) = \frac{1}{1+e^{-z}},還有其他的激活函數g(z)可以用(一般是非線性函數,后面會解釋為什么是非線性函數)。

  • 雙曲正切函數(hyperbolic tangent function)
    a = tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}},函數值在-1與1之間,函數圖像為
    雙曲正切函數
  • 在隱藏層,如果激活函數取為雙曲正切函數g(z) = tanh(z)效果基本都比sigmoid函數好。因為雙曲正切函數的均值是0,從而有類似數據中心化的作用,從而讓下一層的學習更方便一點。所以幾乎大部分情況都用此激活函數
  • 有一個例外,二分類的輸出層用sigmoid函數作為激活函數效果更好。

\begin{aligned} Z^{[1]} &=W^{[1]} X+b^{[1]} \\ A^{[1]} &=g^{[1]}(z)=tanh\left(Z^{[1]}\right) \\ Z^{[2]} &=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]} &= g^{[2]}(z)=\sigma\left(Z^{[2]}\right) \end{aligned}

  • sigmoid函數和tanh函數都有的一個\color{red}{缺點}就是如果z非常大或者非常小,導數就接近于0,從而拖慢梯度下降方法。另一個常用的激活函數就是ReLU函數(rectified linear unit)a = \max\{0,x \},函數圖像為

    ReLU函數圖像

    • z>0,導數為1
    • z<0,導數為0
    • z=0,導數不存在,可以定義為0或1,并不影響
  • 選擇激活函數的經驗

    • 二分類,即輸出為0或1,用sigmoid函數;
    • 其他都用ReLU函數。ReLU已經成為激活函數的默認選擇了,尤其如果你不知道用什么激活函數那就用ReLU函數!
  • ReLU函數的\color{red}{缺點}就是z<0是導數為0,為此有leaky ReLU函數,修改z<0是函數取值不為0,例如可以定義為0.01z,即z = max \{0.01z, z \}。函數圖像為

    leaky ReLu函數圖像

  • ReLU與leaky ReLU的\color {red}{優點}就是沒有斜率離0很遠,從而梯度類方法很快。

3.2 為什么需要非線性激活函數?

  • 為什么在神經網絡中不簡單的使用線性函數作為激活函數?讓我們來看一下。

\begin{aligned} Z^{[1]} &=W^{[1]} X+b^{[1]} \\ A^{[1]} &=g^{[1]}(z)=Z^{[1]} \\ Z^{[2]} &=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]} &= g^{[2]}(z) = Z^{[2]} \end{aligned}

從而有
A^{[2]} = Z^{[2]} = W^{[2]} A^{[1]}+b^{[2]} = W^{[2]} (W^{[1]} X+b^{[1]})+b^{[2]}
=W^{[2]} W^{[1]} X+(W^{[1]}b^{[1]}+b^{[2]}) = W^{'}x +b^{'}
所以無論你的神經網絡有多少層,實際上效果仍然是去掉中間所有隱層的線性回歸,類似的,如果g^{[z]} = z, g^{[2]}(z) = \sigma(z),那么無論有多少層都效果都是logistic回歸。

  • 有一種情況可以使用線性函數,就是回歸問題(預測值是實數)的輸出層,此時的隱藏層仍然不用線性函數。

3.3 激活函數的導數

  • Sigmoid激活函數
    sigmoid函數

    實際上,前面已經計算過了
    \frac{\mathrmppllu5lg(z)}{\mathrm4q1b4nb(z)} = g(z)[1-g(z)] = a(1-a)
    • z比較大時g(z) \approx 1,從而\frac{\mathrmc9utbjag(z)}{\mathrmrlhhqhu(z)} \approx 0,與圖像吻合;
    • z比較小時g(z) \approx 0,從而\frac{\mathrm4ryudl9g(z)}{\mathrmduzqhpg(z)} \approx 0,與圖像吻合;
      z = 0g(z) =\frac{1}{2},從而\frac{\mathrmdnnglbbg(z)}{\mathrm3lktow9(z)} =\frac{1}{4},與圖像吻合。
    • \color {red}{優點}只要計算出a = g(z)的值就能很快算出來導數為g^{'}(z) = a(1-a)
  • tanh激活函數
    tanh激活函數

    tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}
    tanh^{'}(z) = \frac{\mathrmhs91gvctanh(z)}{\mathrmmctgtjjz} = \frac{(e^{z}+e^{-z})^2-(e^{z}-e^{-z})^2}{(e^{z}+e^{-z})^2}
    = 1-tanh^{2}(z) = 1 - a^{2}
    • z比較大時g(z) \approx 1,從而\frac{\mathrmoddltycg(z)}{\mathrmqllgl1f(z)} \approx 0,與圖像吻合;
    • z比較小時g(z) \approx -1,從而\frac{\mathrmd8hyx66g(z)}{\mathrm11rbane(z)} \approx 0,與圖像吻合;
    • z = 0g(z) =0,從而\frac{\mathrmekkxduhg(z)}{\mathrmu9c3dlb(z)} =1,與圖像吻合;
    • \color {red}{優點}只要計算出a = g(z)的值就能很快算出來導數為g^{'}(z) = 1-a^{2}
  • ReLU激活函數與Leaky ReLU激活函數
    • ReLU激活函數
      ReLU與leaky ReLU激活函數

      g^{'}(z) = \{ \begin{aligned} 1; z>0 \\ 0;z<0 \\無定義;z=0 \end{aligned}
      事實上,借助一次梯度的概念,可以定義為
      g^{'}(z) = \{ \begin{aligned} 1; z \geq 0 \\ 0;z<0 \end{aligned}
    • leaky ReLU 激活函數
      g^{'}(z) = \{ \begin{aligned} 1; z>0 \\ 0.01;z<0 \\無定義;z=0 \end{aligned}
      事實上,借助一次梯度的概念,可以定義為
      g^{'}(z) = \{ \begin{aligned} 1; z \geq 0 \\ 0.01;z<0 \end{aligned}

4. 神經網絡的梯度下降法

  • 目的:學習神經網絡的參數

  • 參數:W^{[1]} \in (n^{[1]},n^{[0]}),b^{[1]} \in (n^{[1]},1),W^{[2]} \in (n^{[2]},n^{[1]}),b^{[1]} \in (n^{[2]},1)

  • cost function: J(W^{[1]} ,W^{[2]} ,b^{[1]} ,b^{[2]} )= \frac{1}{m}\sum_{n=1}^mL(\hat{y},y) =\frac{1}{m}\sum_{n=1}^mL(a^{[2]},y)

  • 前向傳播(Forward Propagation):
    \begin{aligned} Z^{[1]} &=W^{[1]} X+b^{[1]} \\ A^{[1]} &=g^{[1]}(Z^{[1]})\\ Z^{[2]} &=W^{[2]} A^{[1]}+b^{[2]} \\ A^{[2]} &= g^{[2]}(Z^{[2]}) \end{aligned}

  • 反向傳播(Backward Propagation):

    • \mathrmxszoo56Z^{[2]}= A^{[2]} - Y,

    • \mathrm0bp3ffxW^{[2]}= \frac{1}{m} \mathrmgcllkkxZ^{[2]} \bullet A^{[1] T}

    • \mathrmv1r1dmzb^{[2]} = \frac{1}{m}np.sum(\mathrmremdud1W^{[2]},axis=1(沿水平方向相加),keepdims=True)
      防止出現奇怪的無秩(n^{[2]},)保證仍然是矩陣,維數為(n^{[2]},1)

    • \mathrm7bedl6wZ^{[1]}=\mathrmqt8ihmlA^{[1]} \bullet g^{[1] '}(Z^{[1]}) = W^{[2] T} \bullet \mathrmvmd4bqdZ^{[2]} * g^{[1] '}(Z^{[1]}),

      • 上式第一個乘積是矩陣乘積,得到(n^{[1]},m)維矩陣,g^{[1] '}(Z^{[1]})(n^{[1]},m)維,所以后面的是逐個元素乘積。
    • \mathrmo1upuzmW^{[1]}= \frac{1}{m} \mathrmrsuxh61Z^{[1]} \bullet A^{[0] T} = \frac{1}{m} \mathrmuud9y92Z^{[1]} \bullet X^{T}

    • \mathrm7hhcpplb^{[1]} =np.sum(\mathrmnrqvlzzZ^{[1]},axis=1,keepdims = True),keepdims參數可以不用,但為了防止出現秩為1的奇怪數組,需用reshape命令。

    隨后迭代
    W^{[1]} =W^{[1]} - \alpha \mathrmwaiihd4W^{[1]}
    W^{[2]} =W^{[2]} - \alpha \mathrmn6rqzvmW^{[2]}
    b^{[1]} =b^{[1]} - \alpha \mathrmnndzgp5b^{[1]}
    b^{[2]} =b^{[2]} - \alpha \mathrmk8ot1mmb^{[2]}

  • 小結:正向與反向傳播的主要公式如下


    正向與反向傳播主要公式

5. 參數初始化

  • Logistic回歸可以把參數初始化為0
  • 但除Logistic回歸外,一般參數會隨機初始化,而不是初始化為0。
    如果把神經網絡的全部參數都初始化為0,再使用梯度下降法,則會失效。
    此時會出現完全對稱話,影響主要是權重參數W^{[1]},W^{[2]},事實上,如果把偏置參數b^{[1]},b^{[2]}都初始化為0是可以的。但是對權重參數如果都初始化為0,那么無論你的隱層有多少個節點,事實上它們計算的都是同一個函數,和只有一個節點是一樣一樣的,如下圖所示:
    權重初始化為0示意圖
  • 解決方法
W^[1] = np.random.randn(n^[1],n) * 0.01
b^[1] = np.zeros(n^[1],1)
W^[2] = np.random.randn(n^[2],n^[1]) * 0.01
b^[2] = np.zeros(n^[2],1)

之所以要乘以一個很小的0.01,是考慮到如果激活函數使用的是sigmoid函數或者tanh函數,W很大時,此時梯度下降算法很慢,會減慢學習速度。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容