從【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模型的學習和預測的步驟:
- 初始化W和b
- 指定learning rate和迭代次數
- 每次迭代,根據當前W和b計算對應的梯度(J對W,b的偏導數),然後更新W和b
- 迭代結束,學得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算法向量化的過程,就是:
- 把m個樣本,同時計算,同時算出它們的zi,也就是直接算Z這個m維行向量
- 同時把Z的m維都激活,得到m維行向量A
- 得到A和Z之後,就可以直接計算J對Z的梯度dZ了,得到dZ之後,也就可以直接算出W和b的梯度了
- 同時更新所有的wi和b
下一篇會用python親自動手地實現一下Logistic regression,並記錄一些其中編程的要點。 有任何疑問,歡迎留言交流!