2.13 向量化 Logistic 回归-深度学习-Stanford吴恩达教授
| 2.12 向量化的更多例子 | 回到目錄 | 2.14 向量化 Logistic 回歸的梯度輸出 |
向量化 Logistic 回歸 (Vectorizing Logistic Regression)
我們已經討論過向量化是如何顯著加速你的代碼,在本次視頻中我們將討論如何實現邏輯回歸的向量化計算。這樣就能處理整個數據集,甚至不會用一個明確的for循環就能實現對于整個數據集梯度下降算法的優化。我對這項技術感到非常激動,并且當我們后面談到神經網絡時同樣也不會用到一個明確的 for 循環。
讓我們開始吧,首先我們回顧一下邏輯回歸的前向傳播步驟。所以,如果你有 mmm 個訓練樣本,然后對第一個樣本進行預測,你需要這樣計算。計算 zzz ,我正在使用這個熟悉的公式 z(1)=wTx(1)+bz^{(1)}=w^Tx^{(1)}+bz(1)=wTx(1)+b 。然后計算激活函數 a(1)=σ(z(1))a^{(1)}=\sigma(z^{(1)})a(1)=σ(z(1)) ,計算第一個樣本的預測值 yyy 。
然后對第二個樣本進行預測,你需要計算 z(2)=wTx(2)+bz^{(2)}=w^Tx^{(2)}+bz(2)=wTx(2)+b ,a(2)=σ(z(2))a^{(2)}=\sigma(z^{(2)})a(2)=σ(z(2)) 。然后對第三個樣本進行預測,你需要計算 z(3)=wTx(3)+bz^{(3)}=w^Tx^{(3)}+bz(3)=wTx(3)+b , a(3)=σ(z(3))a^{(3)}=\sigma(z^{(3)})a(3)=σ(z(3)) ,依次類推。如果你有 mmm 個訓練樣本,你可能需要這樣做 mmm 次,可以看出,為了完成前向傳播步驟,即對我們的 mmm 個樣本都計算出預測值。有一個辦法可以并且不需要任何一個明確的for循環。讓我們來看一下你該怎樣做。
首先,回憶一下我們曾經定義了一個矩陣 XXX 作為你的訓練輸入,(如下圖中藍色 XXX )像這樣在不同的列中堆積在一起。這是一個 nxn_xnx? 行 mmm 列的矩陣。我現在將它寫為Python numpy的形式 (nx,m)(n_x,m)(nx?,m) ,這只是表示 XXX 是一個 nxn_xnx? 乘以 mmm 的矩陣 Rnx?m\R^{n_x*m}Rnx??m 。
現在我首先想做的是告訴你該如何在一個步驟中計算 z1z_1z1? 、 z2z_2z2? 、 z3z_3z3? 等等。實際上,只用了一行代碼。所以,我打算先構建一個 1?m1*m1?m 的矩陣,實際上它是一個行向量,同時我準備計算 z(1),z(2),?z^{(1)},z^{(2)},\cdotsz(1),z(2),? 一直到 z(m)z^{(m)}z(m) ,所有值都是在同一時間內完成。結果發現它可以表達為 www 的轉置乘以大寫矩陣 然后加上向量 [bb?b][bb\cdots b][bb?b] , ([z(1)z(2)?z(m)]=wT+[bb?b])([z^{(1)}z^{(2)}\cdots z^{(m)}]=w^T+[bb\cdots b])([z(1)z(2)?z(m)]=wT+[bb?b]) 。 [bb?b][bb\cdots b][bb?b] 是一個 1?m1*m1?m 的向量或者 1?m1*m1?m 的矩陣或者是一個 mmm 維的行向量。所以希望你熟悉矩陣乘法,你會發現的 www 轉置乘以 x(1)x^{(1)}x(1) , x(2)x^{(2)}x(2) 一直到 x(m)x^{(m)}x(m) 。所以 www 轉置可以是一個行向量。所以第一項 wTXw^TXwTX 將計算 www 的轉置乘以 x(1)x^{(1)}x(1) , www 轉置乘以 x(2)x^{(2)}x(2) 等等。然后我們加上第二項 [bb?b][bb\cdots b][bb?b] ,你最終將 bbb 加到了每個元素上。所以你最終得到了另一個 1?m1*m1?m 的向量, [z(1)z(2)?z(m)]=wTX+[bb?b]=[wTx(1)+b,wTx(2)+b,?,wTx(m)+b][z^{(1)}z^{(2)}\cdots z^{(m)}]=w^TX+[bb\cdots b]=[w^Tx^{(1)}+b,w^Tx^{(2)}+b,\cdots, w^Tx^{(m)}+b][z(1)z(2)?z(m)]=wTX+[bb?b]=[wTx(1)+b,wTx(2)+b,?,wTx(m)+b] 。
wTx(1)+bw^Tx^{(1)}+bwTx(1)+b 這是第一個元素, wTx(2)+bw^Tx^{(2)}+bwTx(2)+b 這是第二個元素, wTx(m)+bw^Tx^{(m)}+bwTx(m)+b 這是第 mmm 個元素。
如果你參照上面的定義,第一個元素恰好是 z(1)z^{(1)}z(1) 的定義,第二個元素恰好是 z(2)z^{(2)}z(2) 的定義,等等。所以,因為 XXX 是一次獲得的,當你得到你的訓練樣本,一個一個橫向堆積起來,這里我將 [z(1),z(2),?,z(m)][z^{(1)},z^{(2)},\cdots,z^{(m)}][z(1),z(2),?,z(m)] 定義為大寫的 ZZZ ,你用小寫 zzz 表示并將它們橫向排在一起。所以當你將不同訓練樣本對應的小寫 xxx 橫向堆積在一起時得到大寫變量 XXX 并且將小寫變量也用相同方法處理,將它們橫向堆積起來,你就得到大寫變量 ZZZ 。結果發現,為了計算 WTX+[bb?b]W^TX+[bb\cdots b]WTX+[bb?b] ,numpy命令是Z=np.dot(w.T,x)+b。這里在Python中有一個巧妙的地方,這里 bbb 是一個實數,或者你可以說是一個 1?11*11?1 矩陣,只是一個普通的實數。但是當你將這個向量加上這個實數時,Python自動把這個實數 bbb 擴展成一個 1?m1*m1?m 的行向量。所以這種情況下的操作似乎有點不可思議,它在Python中被稱作廣播(brosdcasting),目前你不用對此感到顧慮,我們將在下一個視頻中進行進一步的講解。話說回來它只用一行代碼,用這一行代碼,你可以計算大寫的 ZZZ ,而大寫 ZZZ 是一個包含所有小寫 z(1)z^{(1)}z(1) 到 z(m)z^{(m)}z(m) 的 1?m1*m1?m 的矩陣。這就是 ZZZ 的內容,關于變量 aaa 又是如何呢?
我們接下來要做的就是找到一個同時計算 [a(1),a(2),?,a(m)][a^{(1)},a^{(2)},\cdots,a^{(m)}][a(1),a(2),?,a(m)] 的方法。就像把小寫 xxx 堆積起來得到大寫 XXX 和橫向堆積小寫 zzz 得到大寫 ZZZ 一樣,堆積小寫變量 aaa 將形成一個新的變量,我們將它定義為大寫 AAA 。在編程作業中,你將看到怎樣用一個向量在sigmoid函數中進行計算。所以sigmoid函數中輸入大寫 ZZZ 作為變量并且非常高效地輸出大寫 AAA 。你將在編程作業中看到它的細節。
總結一下,在這張幻燈片中我們已經看到,不需要for循環,利用 mmm 個訓練樣本一次性計算出小寫 zzz 和小寫 aaa ,用一行代碼即可完成。
Z = np.dot(w.T,X) + b
這一行代碼:A=[a(1),a(2),?,a(m)]=σ(Z)A=[a^{(1)},a^{(2)},\cdots,a^{(m)}]=\sigma(Z)A=[a(1),a(2),?,a(m)]=σ(Z) ,通過恰當地運用 σ\sigmaσ 一次性計算所有 aaa 。這就是在同一時間內你如何完成一個所有 mmm 個訓練樣本的前向傳播向量化計算。
概括一下,你剛剛看到如何利用向量化在同一時間內高效地計算所有的激活函數的所有 aaa 值。接下來,可以證明,你也可以利用向量化高效地計算反向傳播并以此來計算梯度。讓我們在下一個視頻中看該如何實現。
課程PPT
| 2.12 向量化的更多例子 | 回到目錄 | 2.14 向量化 Logistic 回歸的梯度輸出 |
總結
以上是生活随笔為你收集整理的2.13 向量化 Logistic 回归-深度学习-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.12 向量化更多例子-深度学习-St
- 下一篇: 2.14 向量化 Logistic 回归