吳恩達 DeepLearning.ai課程筆記(1-3)神經網絡和深度學習 --- 淺層神經網絡


以下為在Coursera上吳恩達老師的DeepLearning.ai課程項目中,第一部分《神經網絡和深度學習》第二周課程部分關鍵點的筆記。筆記並不包含全部小視頻課程的記錄,如需學習筆記中舍棄的內容請至 Coursera 或者 網易雲課堂。同時在閱讀以下筆記之前,強烈建議先學習吳恩達老師的視頻課程。


1. 二分類問題

對於二分類問題,大牛給出了一個小的Notation。

  • 樣本: (x,y) ,訓練樣本包含 m 個;
  • 其中 x\in R^{n_{x}} ,表示樣本x  包含 n_{x}個特征;
  • y\in{0,1} ,目標值屬於0、1分類;
  • 訓練數據: \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)})\}

輸入神經網絡時樣本數據的形狀:

X.shape=(n_{x}, m)

目標數據的形狀:

Y=[y_{(1)},y_{(2)},\cdots,y_{(m)}]

Y.shape=(1, m)

 

2. logistic Regression

邏輯回歸中,預測值:

\[\hat h = P(y=1|x)\]

其表示為1的概率,取值范圍在 [0,1] 之間。 引入Sigmoid函數,預測值:

\hat y = Sigmoid(w^{T}x+b)=\sigma(w^{T}x+b)

其中

 Sigmoid(z)=\dfrac{1}{1+e^{-z}}

 

注意點:函數的一階導數可以用其自身表示,

\sigma'(z)=\sigma(z)(1-\sigma(z))

這里可以解釋梯度消失的問題,當 z=0 時,導數最大,但是導數最大為 \sigma'(0)=\sigma(0)(1-\sigma(0))=0.5(1-0.5)=0.25 ,這里導數僅為原函數值的0.25倍。 參數梯度下降公式的不斷更新, \sigma'(z) 會變得越來越小,每次迭代參數更新的步伐越來越小,最終接近於0,產生梯度消失的現象。

 

3. logistic回歸 損失函數

Loss function

一般經驗來說,使用平方錯誤(squared error)來衡量Loss Function:

L(\hat y, y)=\dfrac{1}{2}(\hat y-y)^{2}

但是,對於logistic regression 來說,一般不適用平方錯誤來作為Loss Function,這是因為上面的平方錯誤損失函數一般是非凸函數(non-convex),其在使用低度下降算法的時候,容易得到局部最優解,而不是全局最優解。因此要選擇凸函數。

邏輯回歸的Loss Function:

L(\hat y, y)=-(y\log\hat y+(1-y)\log(1-\hat y))

  • 當 y=1 時, L(\hat y, y)=-\log \hat y 。如果 \hat y 越接近1, L(\hat y, y) \approx 0 ,表示預測效果越好;如果 \hat y 越接近0, L(\hat y, y) \approx +\infty ,表示預測效果越差;
  • 當 y=0 時, L(\hat y, y)=-\log (1-\hat y) 。如果 \hat y 越接近0, L(\hat y, y) \approx 0 ,表示預測效果越好;如果 \hat y 越接近1, L(\hat y, y) \approx +\infty ,表示預測效果越差;
  • 我們的目標是最小化樣本點的損失Loss Function,損失函數是針對單個樣本點的。

Cost function

全部訓練數據集的Loss function總和的平均值即為訓練集的代價函數(Cost function)。

J(w,b)=\dfrac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})=-\dfrac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log\hat y^{(i)}+(1-y^{(i)})\log(1-\hat y^{(i)})\right]

  • Cost function是待求系數w和b的函數;
  • 我們的目標就是迭代計算出最佳的w和b的值,最小化Cost function,讓其盡可能地接近於0。

 

4. 梯度下降

用梯度下降法(Gradient Descent)算法來最小化Cost function,以計算出合適的w和b的值。

每次迭代更新的修正表達式:

w:=w-\alpha\dfrac{\partial J(w,b)}{\partial w}

b:=b-\alpha\dfrac{\partial J(w,b)}{\partial b}

在程序代碼中,我們通常使用dw來表示 \dfrac{\partial J(w,b)}{\partial w} ,用db來表示 \dfrac{\partial J(w,b)}{\partial b} 。

 

5. 邏輯回歸中的梯度下降法

對單個樣本而言,邏輯回歸Loss function表達式:

z= w^{T}x+b

\hat y=a=\sigma(z)

L(a, y)=-(y\log (a)+(1-y)\log(1-a))

反向傳播過程:

前面過程的da、dz求導:

da = \dfrac{\partial L}{\partial a}=-\dfrac{y}{a}+\dfrac{1-y}{1-a}

dz = \dfrac{\partial L}{\partial z}=\dfrac{\partial L}{\partial a}\cdot\dfrac{\partial a}{\partial z}=(-\dfrac{y}{a}+\dfrac{1-y}{1-a})\cdot a(1-a)=a-y

再對 w_{1}、w_{2} 和b進行求導:

dw_{1} = \dfrac{\partial L}{\partial w_{1}}=\dfrac{\partial L}{\partial z}\cdot\dfrac{\partial z}{\partial w_{1}}=x_{1}\cdot dz=x_{1}(a-y)

db = \dfrac{\partial L}{\partial b }=\dfrac{\partial L}{\partial z}\cdot\dfrac{\partial z}{\partial b }=1\cdot dz=a-y

梯度下降法:

w_{1}:=w_{1}-\alpha dw_{1}

w_{2}:=w_{2}-\alpha dw_{2}

b:=b-\alpha db

 

6. m個樣本的梯度下降

對m個樣本來說,其Cost function表達式如下:

z^{(i)}= w^{T}x^{(i)}+b

\hat y^{(i)}=a^{(i)}=\sigma(z^{(i)})

J(w,b)=\dfrac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})=-\dfrac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log\hat y^{(i)}+(1-y^{(i)})\log(1-\hat y^{(i)})\right]

Cost function 關於w和b的偏導數可以寫成所有樣本點偏導數和的平均形式:

dw_{1} =\dfrac{1}{m}\sum_{i=1}^{m}x_{1}^{(i)}(a^{(i)}-y^{(i)})

db = \dfrac{1}{m}\sum_{i=1}^{m}(a^{(i)}-y^{(i)})

 

7. 向量化(Vectorization)

在深度學習的算法中,我們通常擁有大量的數據,在程序的編寫過程中,應該盡最大可能的少使用loop循環語句,利用python可以實現矩陣運算,進而來提高程序的運行速度,避免for循環的使用。

邏輯回歸向量化

  • 輸入矩陣X:(n_{x},m)
  • 權重矩陣w: (n_{x},1)
  • 偏置b:為一個常數
  • 輸出矩陣Y: (1,m)

所有m個樣本的線性輸出Z可以用矩陣表示:

Z = w^{T}X+b

python代碼:

db = 1/m*np.sum(dZ) 

 

單次迭代梯度下降算法流程

Z = np.dot(w.T,X) + b A = sigmoid(Z) dZ = A-Y dw = 1/m*np.dot(X,dZ.T) db = 1/m*np.sum(dZ) w = w - alpha*dw b = b - alpha*db 

 

8. python的notation

雖然在Python有廣播的機制,但是在Python程序中,為了保證矩陣運算的正確性,可以使用reshape()函數來對矩陣設定所需要進行計算的維度,這是個好的習慣;

如果用下列語句來定義一個向量,則這條語句生成的a的維度為(5,),既不是行向量也不是列向量,稱為秩(rank)為1的array,如果對a進行轉置,則會得到a本身,這在計算中會給我們帶來一些問題。

a = np.random.randn(5) 

 

如果需要定義(5,1)或者(1,5)向量,要使用下面標准的語句:

a = np.random.randn(5,1) b = np.random.randn(1,5) 

 

可以使用assert語句對向量或數組的維度進行判斷。assert會對內嵌語句進行判斷,即判斷a的維度是不是(5,1),如果不是,則程序在此處停止。使用assert語句也是一種很好的習慣,能夠幫助我們及時檢查、發現語句是否正確。

assert(a.shape == (5,1)) 

 

可以使用reshape函數對數組設定所需的維度

a.reshape((5,1)) 

 

8. logistic regression代價函數的解釋

Cost function的由來

預測輸出 \hat y 的表達式:

 \hat y =\sigma(w^{T}x+b)

其中, \sigma(z)=\dfrac{1}{1+e^{-z}} 。

\hat y 可以看作預測輸出為正類(+1)的概率:

\hat y = P(y=1|x)

當 y=1 時, P(y|x)=\hat y ;當 y=0 時, P(y|x)=1-\hat y 。

將兩種情況整合到一個式子中,可得:

P(y|x)=\hat y^{y}(1-\hat y )^{(1-y)}

對上式進行log處理(這里是因為log函數是單調函數,不會改變原函數的單調性):

\log P(y|x)=\log\left[\hat y^{y}(1-\hat y )^{(1-y)}\right]=y\log\hat y+(1-y)\log(1-\hat y)

概率 P(y|x) 越大越好,即判斷正確的概率越大越好。這里對上式加上負號,則轉化成了單個樣本的Loss function,我們期望其值越小越好:

L(\hat y, y)=-(y\log\hat y+(1-y)\log(1-\hat y))

 

m個訓練樣本

假設樣本之間是獨立同分布的,我們總是希望訓練樣本判斷正確的概率越大越好,則有:\max \prod\limits_{i=1}^{m} {P(y^{(i)}|x^{(i)})}

同樣引入log函數,加負號,則可以得到Cost function:

J(w,b)=\dfrac{1}{m}\sum_{i=1}^{m}L(\hat y^{(i)}, y^{(i)})=-\dfrac{1}{m}\sum_{i=1}^{m}\left[y^{(i)}\log\hat y^{(i)}+(1-y^{(i)})\log(1-\hat y^{(i)})\right]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM