日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习入门笔记(六):浅层神经网络

發布時間:2023/12/14 pytorch 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习入门笔记(六):浅层神经网络 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

專欄——深度學習入門筆記

聲明

1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。

文章目錄

    • 專欄——深度學習入門筆記
    • 聲明
    • 深度學習入門筆記(六):淺層神經網絡
      • 1 、神經網絡概述
      • 2、激活函數和激活函數的導數
      • 3、為什么需要非線性激活函數?
      • 4、神經網絡的梯度下降
      • 5、隨機初始化
    • 推薦閱讀
    • 參考文章

深度學習入門筆記(六):淺層神經網絡

1 、神經網絡概述

關于神經網絡的概述,具體的可以看這個博客——大話卷積神經網絡CNN(干貨滿滿),我在其中詳細的介紹了 人類視覺原理神經網絡卷積神經網絡的定義和相關網絡結構基礎,還有 應用關于深度學習的本質的探討,如果你需要 學習資源 也可以在博客中找一下,這里就不詳細介紹了。

什么是淺層神經網絡呢?

看了上面提到的博客,你應該知道相關概念了,淺層神經網絡其實就是一個單隱層神經網絡!!!

2、激活函數和激活函數的導數

使用一個神經網絡時,需要決定使用哪種激活函數用隱藏層上?哪種用在輸出節點上?不同的激活函數的效果是不一樣的。下面將介紹一下常用的激活函數:

  • sigmoid 函數

函數圖像和導數圖像如下:

公式如下:

a=σ(z)=11+e?za = \sigma(z) = \frac{1}{{1 + e}^{- z}}a=σ(z)=1+e?z1?

導數公式如下:

ddzg(z)=11+e?z(1?11+e?z)=g(z)(1?g(z))\fracozvdkddzhkzd{dz}g(z) = {\frac{1}{1 + e^{-z}} (1-\frac{1}{1 + e^{-z}})}=g(z)(1-g(z))dzd?g(z)=1+e?z1?(1?1+e?z1?)=g(z)(1?g(z))

如果沒有非線性的激活函數,再多的神經網絡只是計算線性函數,或者叫恒等激勵函數。sigmoid 函數是使用比較多的一個激活函數。

  • tanh 函數

函數圖像和導數圖像如下:

公式如下:

a=tanh(z)=ez?e?zez+e?za= tanh(z) = \frac{e^{z} - e^{- z}}{e^{z} + e^{- z}}a=tanh(z)=ez+e?zez?e?z?

導數公式如下:

ddzg(z)=1?(tanh(z))2\fracozvdkddzhkzd{ozvdkddzhkzdz}g(z) = 1 - (tanh(z))^{2}dzd?g(z)=1?(tanh(z))2

事實上,tanhsigmoid 的向下平移和伸縮后的結果。對它進行了變形后,穿過了(0,0)(0,0)(0,0)點,并且值域介于 +1 和 -1 之間。

所以效果總是優于 sigmoid 函數。因為函數值域在 -1 和 +1 的激活函數,其均值是更接近零均值的。在訓練一個算法模型時,如果使用 tanh 函數代替 sigmoid 函數中心化數據,使得數據的平均值更接近0而不是0.5。但是也有例外的情況,有時對隱藏層使用 tanh 激活函數,而輸出層使用 sigmoid 函數,效果會更好。

小結:

sigmoid 函數和 tanh 函數兩者共同的缺點是,在未經過激活函數的輸出特別大或者特別小的情況下,會導致導數的梯度或者函數的斜率變得特別小,最后就會接近于0,導致降低梯度下降的速度。

  • ReLu 函數

在機器學習另一個很流行的函數是:修正線性單元的函數(ReLu)

函數圖像和導數圖像如下:

公式如下:

a=max(0,z)a =max( 0,z) a=max(0,z)

導數公式如下:

g(z)′={0if?z?<?01if?z?>?0undefinedif?z?=?0g(z)^{'}= \begin{cases} 0& \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases} g(z)=??????01undefined?if?z?<?0if?z?>?0if?z?=?0?

zzz 是正值的情況下,導數恒等于1,當 zzz 是負值的時候,導數恒等于0。Relu 的一個優點是當 zzz 是負值的時候,導數等于0,當 zzz 是正值的時候,導數等于1。這樣在梯度下降時就不會受 梯度爆炸或者梯度消失 的影響了。

詳見博客——深度學習100問之深入理解Vanishing/Exploding Gradient(梯度消失/爆炸)

一些選擇激活函數的經驗法則:
如果輸出是0、1值(二分類問題),則輸出層選擇 sigmoid 函數,然后其它的所有單元都選擇 Relu 函數。這是很多激活函數的默認選擇,如果在隱藏層上不確定使用哪個激活函數,那么通常會使用 Relu 激活函數。有時,也會使用 tanh 激活函數。

  • Leaky Relu 函數

這里也有另一個版本的 Relu 被稱為 Leaky Relu

函數圖像和導數圖像如下:

ReLU 類似,公式如下:

g(z)=max?(0.01z,z)g(z)=\max(0.01z,z)g(z)=max(0.01z,z)

導數公式如下:

g(z)′={0.01if?z?<?01if?z?>?0undefinedif?z?=?0g(z)^{'}= \begin{cases} 0.01& \text{if z < 0}\\ 1& \text{if z > 0}\\ undefined& \text{if z = 0} \end{cases} g(z)=??????0.011undefined?if?z?<?0if?z?>?0if?z?=?0?

zzz 是負值時,這個函數的值不是等于0,而是輕微的傾斜。這個函數通常比 Relu 激活函數效果要好,盡管在實際中 Leaky ReLu 使用的并不多。

RELU 系列的兩個激活函數的優點是:

  • 第一,在未經過激活函數的輸出的區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大于0,在程序實現就是一個 if-else 語句,而 sigmoid 函數需要進行浮點四則運算,在實踐中,使用 ReLu 激活函數神經網絡通常會比使用 sigmoid 或者 tanh 激活函數學習的更快。

  • 第二,sigmoidtanh 函數的導數在正負飽和區的梯度都會接近于0,這會造成梯度彌散,而 ReluLeaky ReLu 函數大于0部分都為常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu 進入負半區的時候,梯度為0,神經元此時不會訓練,產生所謂的 稀疏性,而 Leaky ReLu 不會有這問題。但 ReLu 的梯度一半都是0,有足夠的隱藏層使得未經過激活函數的輸出值大于0,所以對大多數的訓練數據來說學習過程仍然可以很快。)

最后簡單介紹完了常用的激活函數之后,來快速概括一下。

  • sigmoid 激活函數:除了輸出層是一個二分類問題基本上不會用 sigmoid

  • tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。

  • ReLu 激活函數:最常用的默認激活函數。如果不確定用哪個激活函數,就先使用 ReLu

很多人在編寫神經網絡的時候,經常遇到一個問題是,有很多個選擇:隱藏層單元的個數激活函數的種類初始化權值的方式、等等……這些選擇想得到一個比較好的指導原則是挺困難的,所以其實更多的是經驗,這也是深度學習被人稱為經驗主義學科和被人詬病的地方,更像是一種煉丹術,是不是?

你可能會看到好多博客,文章,或者哪一個工業界大佬或者學術界大佬說過,哪一種用的多,哪一種更好用。但是,你的神經網絡的結構,以及需要解決問題的特殊性,是很難提前知道選擇哪些效果更好的,或者沒辦法確定別人的經驗和結論是不是對你同樣有效。

所以通常的建議是:如果不確定哪一個激活函數效果更好,可以把它們都試試,然后在驗證集或者測試集上進行評價,這樣如果看到哪一種的表現明顯更好一些,就在你的網絡中使用它!!!

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

為什么神經網絡需要非線性激活函數?

首先是事實證明了,要讓神經網絡能夠計算出有趣的函數,必須使用非線性激活函數。但是這么說太不科學了,現在來證明一下,證明過程如下:

a[1]=g(z[1])a^{[1]} = g(z^{[1]})a[1]=g(z[1]),這是神經網絡正向傳播的方程,之前我們學過的,你還記得不?不記得去翻翻 深度學習入門筆記(二):神經網絡基礎。

現在去掉函數 ggg,也就是去掉激活函數,然后令 a[1]=z[1]a^{[1]} = z^{[1]}a[1]=z[1],或者也可以直接令 g(z[1])=z[1]g(z^{[1]})=z^{[1]}g(z[1])=z[1],這個有時被叫做 線性激活函數(更學術點的名字是 恒等激勵函數,因為它們就是把輸入值直接輸出)。

因為:

(1) a[1]=z[1]=W[1]x+b[1]a^{[1]} = z^{[1]} = W^{[1]}x + b^{[1]}a[1]=z[1]=W[1]x+b[1]

(2) a[2]=z[2]=W[2]a[1]+b[2]a^{[2]} = z^{[2]} = W^{[2]}a^{[1]}+ b^{[2]}a[2]=z[2]=W[2]a[1]+b[2]

將式子(1)代入式子(2)中,則得到:

(3) a[2]=z[2]=W[2](W[1]x+b[1])+b[2]=W[2]W[1]x+W[2]b[1]+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])a^{[2]} = z^{[2]} = W^{[2]}(W^{[1]}x + b^{[1]}) + b^{[2]} = W^{[2]}W^{[1]}x + W^{[2]}b^{[1]} + b^{[2]} = (W^{[2]}W^{[1]})x + (W^{[2]}b^{[1]} + b^{[2]})a[2]=z[2]=W[2](W[1]x+b[1])+b[2]=W[2]W[1]x+W[2]b[1]+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])

然后簡化多項式,你可以發現兩個括號里的式子都可以簡化,可得:

(4) a[2]=z[2]=W′x+b′a^{[2]} = z^{[2]} = W^{'}x + b^{'}a[2]=z[2]=Wx+b

小結:如果使用 線性激活函數 或者叫 恒等激勵函數,那么神經網絡只是把輸入線性組合再輸出。

之后我們會學到 深度網絡,什么是 深度網絡?顧名思義,就是有很多層(很多隱藏層)的神經網絡。然而,上面的證明告訴我們,如果使用線性激活函數或者不使用激活函數,那么無論你的神經網絡有多少層,一直在做的也只是計算線性函數,都可以用 a[2]=z[2]=W′x+b′a^{[2]} = z^{[2]} = W^{'}x + b^{'}a[2]=z[2]=Wx+b 表示,還不如直接去掉全部隱藏層,反正也沒啥用。。。

總之,不能在隱藏層用線性激活函數,相反你可以用 ReLU 或者 tanh 或者 leaky ReLU 或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層。

4、神經網絡的梯度下降

我們這一次講的淺層神經網絡——單隱層神經網絡,會有 W[1]W^{[1]}W[1]b[1]b^{[1]}b[1]W[2]W^{[2]}W[2]b[2]b^{[2]}b[2] 這些個參數,還有個 nxn_xnx? 表示輸入特征的個數,n[1]n^{[1]}n[1] 表示隱藏單元個數,n[2]n^{[2]}n[2] 表示輸出單元個數。

好了,這就是全部的符號參數了。那么具體參數的維度如下:

  • 矩陣 W[1]W^{[1]}W[1] 的維度就是(n[1],n[0]n^{[1]}, n^{[0]}n[1],n[0]),b[1]b^{[1]}b[1] 就是 n[1]n^{[1]}n[1]維向量,可以寫成 (n[1],1)(n^{[1]}, 1)(n[1],1),就是一個的列向量。

  • 矩陣 W[2]W^{[2]}W[2] 的維度就是(n[2],n[1]n^{[2]}, n^{[1]}n[2],n[1]),b[2]b^{[2]}b[2] 的維度和 b[1]b^{[1]}b[1] 一樣,就是寫成 (n[2],1)(n^{[2]},1)(n[2],1)

此外,還有一個神經網絡的 代價函數(Cost function),在之前的博客——深度學習入門筆記(二):神經網絡基礎 中講過,不過是基于邏輯回歸的。假設現在是在做二分類任務,那么代價函數等于:

J(W[1],b[1],W[2],b[2])=1m∑i=1mL(y^,y)J(W^{[1]},b^{[1]},W^{[2]},b^{[2]}) = {\frac{1}{m}}\sum_{i=1}^mL(\hat{y}, y)J(W[1],b[1],W[2],b[2])=m1?i=1m?L(y^?,y)

訓練參數之后,需要做梯度下降,然后進行參數更新,進而網絡優化。所以,每次梯度下降都會循環,并且計算以下的值,也就是網絡的輸出:

y^(i)(i=1,2,…,m)\hat{y}^{(i)} (i=1,2,…,m)y^?(i)(i=1,2,,m)

  • 前向傳播(forward propagation) 方程如下(之前講過):

(1) z[1]=W[1]x+b[1]z^{[1]} = W^{[1]}x + b^{[1]}z[1]=W[1]x+b[1]

(2) a[1]=σ(z[1])a^{[1]} = \sigma(z^{[1]})a[1]=σ(z[1])

(3) z[2]=W[2]a[1]+b[2]z^{[2]} = W^{[2]}a^{[1]} + b^{[2]}z[2]=W[2]a[1]+b[2]

(4) a[2]=g[2](z[z])=σ(z[2])a^{[2]} = g^{[2]}(z^{[z]}) = \sigma(z^{[2]})a[2]=g[2](z[z])=σ(z[2])

  • 反向傳播(back propagation) 方程如下:

(1) dz[2]=A[2]?Y,Y=[y[1]y[2]?y[m]]dz^{[2]} = A^{[2]} - Y , Y = \begin{bmatrix}y^{[1]} & y^{[2]} & \cdots & y^{[m]}\\ \end{bmatrix}dz[2]=A[2]?Y,Y=[y[1]?y[2]???y[m]?]

(2) dW[2]=1mdz[2]A[1]TdW^{[2]} = {\frac{1}{m}}dz^{[2]}A^{[1]T}dW[2]=m1?dz[2]A[1]T

(3) db[2]=1mnp.sum(dz[2],axis=1,keepdims=True){\rm d}b^{[2]} = {\frac{1}{m}}np.sum(ozvdkddzhkzdz^{[2]},axis=1,keepdims=True)db[2]=m1?np.sum(dz[2],axis=1,keepdims=True)

(4) dz[1]=W[2]Tdz[2]?(n[1],m)?g[1]′?activationfunctionofhiddenlayer?(z[1])?(n[1],m)dz^{[1]} = \underbrace{W^{[2]T}{\rm d}z^{[2]}}_{(n^{[1]},m)}\quad*\underbrace{{g^{[1]}}^{'}}_{activation \; function \; of \; hidden \; layer}*\quad\underbrace{(z^{[1]})}_{(n^{[1]},m)}dz[1]=(n[1],m)W[2]Tdz[2]???activationfunctionofhiddenlayerg[1]???(n[1],m)(z[1])??

(5) dW[1]=1mdz[1]xTdW^{[1]} = {\frac{1}{m}}dz^{[1]}x^{T}dW[1]=m1?dz[1]xT

(6) db[1]?(n[1],1)=1mnp.sum(dz[1],axis=1,keepdims=True){\underbrace{db^{[1]}}_{(n^{[1]},1)}} = {\frac{1}{m}}np.sum(dz^{[1]},axis=1,keepdims=True)(n[1],1)db[1]??=m1?np.sum(dz[1],axis=1,keepdims=True)

:反向傳播的這些公式都是針對所有樣本,進行過向量化的(深度學習入門筆記(四):向量化)。

其中,YYY1×m1×m1×m 的矩陣;這里 np.sum 是 pythonnumpy 命令,axis=1 表示水平相加求和,keepdims 是防止 python 輸出那些古怪的秩數 (n,)(n,)(n,),加上這個確保陣矩陣 db[2]db^{[2]}db[2] 這個向量的輸出的維度為 (n,1)(n,1)(n,1) 這樣標準的形式。

編程操作看這個博客——深度學習入門筆記(五):神經網絡的編程基礎。

  • 參數更新 方程如下:

(1) dW[1]=dJdW[1],db[1]=dJdb[1]dW^{[1]} = \frac{dJ}{dW^{[1]}},db^{[1]} = \frac{dJ}{db^{[1]}}dW[1]=dW[1]dJ?,db[1]=db[1]dJ?

(1) dW[2]=dJdW[2],db[2]=dJdb[2]ozvdkddzhkzdW^{[2]} = \frac{{dJ}}{dW^{[2]}},ozvdkddzhkzdb^{[2]} = \frac{dJ}{db^{[2]}}dW[2]=dW[2]dJ?,db[2]=db[2]dJ?

其中 W[1]?W[1]?adW[1],b[1]?b[1]?adb[1]W^{[1]}\implies{W^{[1]} - adW^{[1]}},b^{[1]}\implies{b^{[1]} -adb^{[1]}}W[1]?W[1]?adW[1]b[1]?b[1]?adb[1]W[2]?W[2]?αdW[2],b[2]?b[2]?αdb[2]W^{[2]}\implies{W^{[2]} - \alpha{\rm d}W^{[2]}},b^{[2]}\implies{b^{[2]} - \alpha{\rm d}b^{[2]}}W[2]?W[2]?αdW[2]b[2]?b[2]?αdb[2]

如果你跟著咱們系列下來的話(深度學習入門筆記),應該發現了到目前為止,計算的都和 Logistic 回歸(深度學習入門筆記(二):神經網絡基礎)十分的相似,但當你開始 計算 反向傳播的時候,你會發現,是需要計算隱藏層和輸出層激活函數的導數的,在這里(二元分類)使用的是 sigmoid 函數。

如果你想認真的推導一遍反向傳播,深入理解反向傳播的話,歡迎看一下這個博客——深度學習100問之深入理解Back Propagation(反向傳播),只要你跟著推導一遍,反向傳播基本沒什么大問題了。或者如果你覺得自己數學不太好的話,也可以和許多成功的深度學習從業者一樣直接實現這個算法,不去了解其中的知識,這就是深度學習相較于機器學習最大的優勢,我猜是的。

5、隨機初始化

當訓練神經網絡時,權重隨機初始化 是很重要的,簡單來說,參數初始化 就是 決定梯度下降中的起始點。對于邏輯回歸,把權重初始化為0當然也是可以的,但是對于一個神經網絡,如果權重或者參數都初始化為0,那么梯度下降將不會起作用。你一定想問為什么?

慢慢來看,假設現在有兩個輸入特征,即 n[0]=2n^{[0]} = 2n[0]=2,2個隱藏層單元,即 n[1]n^{[1]}n[1] 等于2,因此與一個隱藏層相關的矩陣,或者說 W[1]W^{[1]}W[1] 就是一個 2*2 的矩陣。我們再假設,在權重隨機初始化的時候,把它初始化為 0 的 2*2 矩陣,b[1]b^{[1]}b[1] 也等于 [00]T[0\;0]^T[00]T(把偏置項 bbb 初始化為0是合理的),但是把 www 初始化為 0 就有問題了。你會發現,如果按照這樣進行參數初始化的話,總是發現 a1[1]a_{1}^{[1]}a1[1]?a2[1]a_{2}^{[1]}a2[1]? 相等,這兩個激活單元就會一樣了!!!為什么會這樣呢?

因為在反向傳播時,兩個隱含單元計算的是相同的函數,都是來自 a1[2]a_1^{[2]}a1[2]? 的梯度變化,也就是 dz1[1]\text{dz}_{1}^{[1]}dz1[1]?dz2[1]\text{dz}_{2}^{[1]}dz2[1]? 是一樣的,由 W[1]=W[1]?adWW^{[1]} = {W^{[1]}-adW}W[1]=W[1]?adW 可得 W[1]=adWW^{[1]} = ad{W}W[1]=adW,學習率 aaa 一樣,梯度變化 dWd{W}dW 一樣,這樣更新后的輸出權值也會一模一樣,由此 W[2]W^{[2]}W[2] 也等于 [00][0\;0][00]

你可能覺得這也沒啥啊,大驚小怪的,但是如果這樣初始化這整個神經網絡的話,那么這兩個隱含單元就完全一樣了,因此它們兩個完全對稱,也就意味著計算同樣的函數,并且肯定的是最終經過每次訓練的迭代,這兩個隱含單元仍然是同一個函數,令人困惑。

由此可以推導,由于隱含單元計算的是同一個函數,所有的隱含單元對輸出單元有同樣的影響。一次迭代后,同樣的表達式結果仍然是相同的,即 隱含單元仍是對稱的。那么兩次、三次、無論多少次迭代,不管網絡訓練多長時間,隱含單元仍然計算的是同樣的函數。因此這種情況下超過1個隱含單元也沒什么意義,因為計算的是同樣的東西。當然無論是多大的網絡,比如有3個特征,還是有相當多的隱含單元。

那么這個問題的解決方法是什么?其實很簡單,就是 隨機初始化參數

你應該這么做:把 W[1]W^{[1]}W[1] 設為 np.random.randn(2,2)(生成標準正態分布),通常再乘上一個較小的數,比如 0.01,這樣就把它初始化為一個很小的隨機數。然后 bbb 本來就沒有這個對稱的問題(叫做symmetry breaking problem),所以可以把 bbb 初始化為0,因為只要隨機初始化 WWW,就有不同的隱含單元計算不同的東西,就不會有 symmetry breaking 問題了。相似地,對于 W[2]W^{[2]}W[2] 也隨機初始化,b[2]b^{[2]}b[2] 可以初始化為0。

舉一個隨機初始化的例子,比如:

W[1]=np.random.randn(2,2)?0.01,b[1]=np.zeros((2,1))W^{[1]} = np.random.randn(2,2)\;*\;0.01\;,\;b^{[1]} = np.zeros((2,1))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]=0W^{[2]} = np.random.randn(2,2)\;*\;0.01\;,\;b^{[2]} = 0W[2]=np.random.randn(2,2)?0.01,b[2]=0

你也許會疑惑,這個常數從哪里來?為什么是0.01,而不是100或者1000?

這是因為我們 通常傾向于初始化為很小的隨機數

這么想,如果你用 tanh 或者 sigmoid 激活函數,或者說只在輸出層有一個 sigmoid 激活函數,這種情況下,如果(數值)波動太大,在計算激活值時 z[1]=W[1]x+b[1],a[1]=σ(z[1])=g[1](z[1])z^{[1]} = W^{[1]}x + b^{[1]}\;,\;a^{[1]} = \sigma(z^{[1]})=g^{[1]}(z^{[1]})z[1]=W[1]x+b[1],a[1]=σ(z[1])=g[1](z[1]),如果 WWW 很大,zzz 就會很大或者很小,這種情況下很可能停在 tanh / sigmoid 函數的平坦的地方(甚至在訓練剛剛開始的時候),而這些平坦的地方對應導數函數圖像中梯度很小的地方,也就意味著梯度下降會很慢(因為梯度小),因此學習也就很慢,這顯然是不好的。

sigmoid 函數圖像和導數函數圖像:

tanh 函數圖像和導數函數圖像:

如果你沒有使用 sigmoid / tanh 激活函數在整個的神經網絡里,就不成問題。但如果做二分類并且輸出單元是 Sigmoid 函數,那么你一定不會想讓你的初始參數太大,因此這就是為什么乘上 0.01 或者其他一些小數是合理的嘗試,對 w[2]w^{[2]}w[2] 也是一樣。

關于淺層神經網絡的代碼,可以手撕一下,歡迎看一下這個博客——深度學習之手撕神經網絡代碼(基于numpy)。

推薦閱讀

  • 深度學習入門筆記(一):深度學習引言
  • 深度學習入門筆記(二):神經網絡基礎
  • 深度學習入門筆記(三):求導和計算圖
  • 深度學習入門筆記(四):向量化
  • 深度學習入門筆記(五):神經網絡的編程基礎
  • 深度學習入門筆記(六):淺層神經網絡
  • 深度學習入門筆記(七):深層神經網絡
  • 深度學習入門筆記(八):深層網絡的原理
  • 深度學習入門筆記(九):深度學習數據處理
  • 深度學習入門筆記(十):正則化
  • 深度學習入門筆記(十一):權重初始化
  • 深度學習入門筆記(十二):深度學習數據讀取
  • 深度學習入門筆記(十三):批歸一化(Batch Normalization)
  • 深度學習入門筆記(十四):Softmax
  • 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
  • 深度學習入門筆記(十六):計算機視覺之邊緣檢測
  • 深度學習入門筆記(十七):深度學習的極限在哪?
  • 深度學習入門筆記(十八):卷積神經網絡(一)
  • 深度學習入門筆記(十九):卷積神經網絡(二)
  • 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)

參考文章

  • 吳恩達——《神經網絡和深度學習》視頻課程

總結

以上是生活随笔為你收集整理的深度学习入门笔记(六):浅层神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。