1.2)深度学习笔记------神经网络的编程基础
目錄
1)Binary Classification
2)Logistic Regression
3)Logistic Regression Cost Function
4)Gradient Descent
5)Logistic Regression Gradient Descent(重點)
6)Gradient Descent on m Examples
7)Vectorization?Logistic Regression's Gradient(重點)
8)Broadcasting in Python
9)A note on python or numpy vectors
10)Explanation of logistic regression cost function(選修)
以下筆記是吳恩達老師深度學習課程第一門課第二周的的學習筆記:Basics of?Neural Network programming。筆記參考了黃海廣博士的內容,在此表示感謝。?
1)Binary Classification
這一小節,我們首先將學習本課程中用到的數學符號:
- :是一個維輸入數據,維度表示為
- :表示輸出結果,取值為
- :表示第 i 組數據;
- :表示所有訓練數據集的輸入值,放在一個的矩陣中;
- :對應表示所有的輸出值,維度為;
2)Logistic Regression
在吳恩達老師之前的機器學習課程中已經介紹過邏輯回歸,這里簡單復習一下邏輯函數。Logistic 回歸是一個用于二元分類的算法。Logistic 回歸中使用的參數如下:
-
輸入的特征向量:,其中是特征數量;
-
用于訓練的標簽:
-
權重:
-
偏置:
-
輸出:
-
Sigmoid 函數:
預測值為表示1的概率,故引入 Sigmoid 函數。從下圖可看出,Sigmoid 函數的值域為 [0, 1]。
3)Logistic Regression Cost Function
損失函數(loss function)用于衡量預測結果與真實值之間的誤差。 最簡單的損失函數定義方式為平方差損失:
但是,對于 logistic regression 來說,一般不使用平方差來作為 Loss Function,這是因為上面的平方差損失函數對于邏輯回歸問題一般是非凸函數(non-convex),其在使用梯度下降算法的時候,容易得到局部最優解,而不是全局最優解。因此要選擇凸函數。
邏輯回歸的Loss Function:? ? ? ? ? ? ? ? ? ?
損失函數是在單個訓練樣本中定義的,它衡量了在單個訓練樣本上的表現。而代價函數(cost function,或者稱作成本函數)衡量的是在全體訓練樣本上的表現,即衡量參數 w 和 b 的效果。
4)Gradient Descent
函數的梯度(gradient)指出了函數的最陡增長方向。即是說,按梯度的方向走,函數增長得就越快。那么按梯度的負方向走,函數值自然就降低得最快了。
模型的訓練目標即是尋找合適的 w 與 b 以最小化代價函數值。簡單起見我們先假設 w 與 b 都是一維實數,那么可以得到如下的 J 關于 w 與 b 的圖:
可以看到,成本函數 J 是一個凸函數,與非凸函數的區別在于其不含有多個局部最低點;選擇這樣的代價函數就保證了無論我們如何初始化模型參數,都能夠尋找到合適的最優解。
每次迭代更新的修正表達式:? ? ? ? ? ? ? ? ? ??
其中,表示學習速率,即每次更新參數的步伐長度。
5)Logistic Regression Gradient Descent(重點)
本節筆記之前吳恩達老師在課程里介紹了導數,計算圖,使用計算圖的例子,考慮到這部分內容不是很難,故沒有記載,需要的同學可以回看吳恩達老師的課程視頻或黃海廣博士的筆記。
這一節詳細介紹了邏輯回歸中梯度的計算和參數的更新,這部分掌握了對后面神經網絡的學習很有幫助。
對單個樣本而言,邏輯回歸Loss function表達式:
假設輸入的特征向量維度為 2,即輸入參數共有 x1, w1, x2, w2, b 這五個。可以推導出如下的計算圖:
首先反向求出 L 對于 a 和 ?z 的導數:? ? ? ? ? ? ? ? ? ? ? ?
再對進行求導:
梯度下降法更新參數可得:
6)Gradient Descent on m Examples
對 m 個樣本來說,其 Cost function 表達式如下:
Cost function 關于 w 和 b 的偏導數可以寫成所有樣本點偏導數和的平均形式:
完整的 Logistic 回歸中某次訓練的流程如下,這里僅假設特征向量的維度為 2:
然后對參數進行迭代。
上述過程在計算時有一個缺點:你需要編寫兩個 for 循環。第一個 for 循環遍歷 m 個樣本,而第二個 for 循環遍歷所有特征。如果有大量特征,在代碼中顯式使用 for 循環會使算法很低效。向量化可以用于解決顯式使用 for 循環的問題。
7)Vectorization?Logistic Regression's Gradient(重點)
在深度學習的算法中,我們通常擁有大量的數據,在程序的編寫過程中,應該盡最大可能的少使用loop循環語句,利用python可以實現矩陣運算,進而來提高程序的運行速度,避免for循環的使用。
在 Logistic 回歸中,需要計算如果是非向量化的循環方式操作,代碼可能如下:
z = 0; for i in range(n_x):z += w[i] * x[i] z += b而如果是向量化的操作,代碼則會簡潔很多,并帶來近百倍的性能提升(并行指令):
z = np.dot(w, x) + b不用顯式 for 循環,實現 Logistic 回歸的梯度下降一次迭代(對應之前代碼的 for 循環部分。這里公式和 NumPy 的代碼混雜,注意分辨):
單次迭代梯度下降算法流程
8)Broadcasting in Python
Numpy 的 Universal functions 中要求輸入的數組 shape 是一致的。當數組的 shape 不相等的時候,則會使用廣播機制,調整數組使得 shape 一樣,滿足規則,則可以運算,否則就出錯。
四條規則:
讓所有輸入數組都向其中 shape 最長的數組看齊;
輸出數組的 shape 是輸入數組 shape 的各個軸上的最大值;
如果輸入數組的某個軸和輸出數組的對應軸的長度相同或者其長度為 1 時,這個數組能夠用來計算,否則出錯;
當輸入數組的某個軸的長度為 1 時,沿著此軸運算時都用此軸上的第一組值。
9)A note on python or numpy vectors
- 雖然在Python有廣播的機制,但是在Python程序中,為了保證矩陣運算的正確性,可以使用reshape()函數來對矩陣設定所需要進行計算的維度,這是個好的習慣;
- 如果用下列語句來定義一個向量,則這條語句生成的 a 的維度為(5,),既不是行向量也不是列向量,稱為秩(rank)為1的數組,如果對a進行轉置,則會得到 a 本身,這在計算中會給我們帶來一些問題。
- 如果需要定義(5,1)或者(1,5)向量,要使用下面標準的語句:
可以使用assert語句對向量或數組的維度進行判斷。assert會對內嵌語句進行判斷,即判斷a的維度是不是(5,1),如果不是,則程序在此處停止。使用assert語句也是一種很好的習慣,能夠幫助我們及時檢查、發現語句是否正確。
assert(a.shape == (5,1))可以使用reshape函數對數組設定所需的維度
a.reshape((5,1))10)Explanation of logistic regression cost function(選修)
在前面的邏輯回歸中,我們可以把預測值可以看作預測輸出為正類(+1)的概率:
當;
將兩種情況整合到一個式子中,可得:
對上式進行log處理(這里是因為log函數是單調函數,不會改變原函數的單調性);
概率P(y|x)越大越好,即判斷正確的概率越大越好。這里對上式加上負號,則轉化成了單個樣本的Loss function,我們期望其值越小越好:
對于m個訓練樣本來說,假設樣本之間是獨立同分布的,我們總是希望訓練樣本判斷正確的概率越大越好,則有:
同樣引入log函數,加負號,則可以得到Cost function:
下面,我們要開始本周的編程作業了。
總結
以上是生活随笔為你收集整理的1.2)深度学习笔记------神经网络的编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “流感神药”为何夏季多地缺货?专家揭秘:
- 下一篇: 联想小新Pro 16 2022图赏:2.