【DL筆記2】神經網絡編程原則&Logistic Regression的算法解析

從【DL筆記1】到【DL筆記N】,是我學習深度學習一路上的點點滴滴的記錄,是從Coursera網課、各大博客、論文的學習以及自己的實踐中總結而來。從基本的概念、原理、公式,到用生動形象的例子去理解,到動手做實驗去感知,到著名案例的學習,到用所學來實現自己的小而有趣的想法......我相信,一路看下來,我們可以感受到深度學習的無窮的樂趣,並有興趣和激情繼續鑽研學習。 正所謂 Learning by teaching,寫下一篇篇筆記的同時,我也收穫了更多深刻的體會,希望大家可以和我一同進步,共同享受AI無窮的樂趣。


在【DL筆記1】中,我們學習了Logistic regression的基本原理,由於後面我們需要編程復現,因此這篇文章,我們一起學習一下神經網絡中的一些編程方法,並對Logistic regression的算法進行詳細解析。

一、神經網絡中的編程指導原則

就一句話:

只要闊能,就不要使用顯示for循環(explicit for-loop),而是儘可能採用矢量化技術(Vectorization)

爲啥呢,因爲深度學習中的數據量往往巨大,用for循環去跑的話效率會非常低下,相比之下,矩陣運算就會快得多。而python的矩陣“傳播機制(broadcasting)”和專門用於矩陣計算的numpy包更是給了我們使用矩陣運算的理由。

因此,我們在面對深度學習問題的時候,首先要想一想,如何把數據進行“矢量化”,就是轉化成向量或者矩陣,這樣可以大大提高我們的效率。

有關python的傳播機制、numpy的典型使用以及for-loop和vectorization運算時間的對比,可以參見我的另一篇文章。

具體怎麼把我們的數據進行Vectorization呢?我們在Logistic regression的python實現裏面去看一看。

二、Logistic regression算法

在寫python代碼之前,我們先用僞代碼來示意一下Logistic regression的過程。

首先回顧一下上一篇文章中對Logistic regression模型的學習和預測的步驟:

  1. 初始化W和b
  2. 指定learning rate和迭代次數
  3. 每次迭代,根據當前W和b計算對應的梯度(J對W,b的偏導數),然後更新W和b
  4. 迭代結束,學得W和b,帶入模型進行預測,分別測試在訓練集合測試集上的準確率,從而評價模型

假設我們的樣本數爲m,每一個樣本的特徵數爲n,我們設置的迭代次數爲2000,那麼按照上述步驟,如果使用for循環的話,我們需要幾個for,總循環多少次呢?

(由於微信不方便寫公式,我這裏貼出圖片:)

簡單看一下:

for iteration=1 to 2000:  #梯度下降2000次迭代
  for i=1 to m:  # 遍歷m個樣本
    for j=1 to n  # 求每一個特徵對應的w的梯度

3個for循環啊!共循環2000×m×n次!通常情況下,m至少也有大幾千吧,特徵n更是成千上萬,尤其是對於圖片識別類的問題。這樣for下去簡直闊怕!

事實上,我們可以通過Vectorization來消除第二個和第三個for循環,因爲一個樣本的n個特徵可以組成一個向量,m個樣本也可以組成一個大矩陣。於是:

(上面出現的np.dot()是numpy包的矩陣乘法,就是點乘,np.sum()就是numpy的矩陣求和)

搞定,一次迭代中,一個for也沒有用。(當然,這個迭代的for循環我們沒法消除,因爲迭代次數是我們人爲設定的,這裏設爲2000次,也可以設爲1500次、3000次等等)

(寫這樣的全都是公式的文章真的好累啊!(╬ ̄皿 ̄))

上面就是Logistic regression的算法了,

我們總結一下:

所謂的Vectorization,就是把我們需要用for-loop來對那些只有上標或者下標變化的變量,放進一個向量或者矩陣中,讓他們所有變量同時計算! 因此,Logistic regression算法向量化的過程,就是:

  1. 把m個樣本,同時計算,同時算出它們的zi,也就是直接算Z這個m維行向量
  2. 同時把Z的m維都激活,得到m維行向量A
  3. 得到A和Z之後,就可以直接計算J對Z的梯度dZ了,得到dZ之後,也就可以直接算出W和b的梯度了
  4. 同時更新所有的wi和b

下一篇會用python親自動手地實現一下Logistic regression,並記錄一些其中編程的要點。 有任何疑問,歡迎留言交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章