2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授
| 2.13 向量化 Logistic 回歸 | 回到目錄 | 2.15 Python 中的廣播 |
向量化 Logistic 回歸的梯度輸出 (Vectorizing Logistic Regression’s Gradient Computation)
注:本節中大寫字母代表向量,小寫字母代表元素
如何向量化計算的同時,對整個訓練集預測結果 aaa ,這是我們之前已經討論過的內容。在本次視頻中我們將學習如何向量化地計算 mmm 個訓練數據的梯度,本次視頻的重點是如何同時計算 mmm 個數據的梯度,并且實現一個非常高效的邏輯回歸算法(Logistic Regression)。
之前我們在講梯度計算的時候,列舉過幾個例子, dz(1)=a(1)?y(1)dz^{(1)}=a^{(1)}-y^{(1)}dz(1)=a(1)?y(1) , dz(2)=a(2)?y(2)dz^{(2)}=a^{(2)}-y^{(2)}dz(2)=a(2)?y(2) ……等等一系列類似公式。現在,對 mmm 個訓練數據做同樣的運算,我們可以定義一個新的變量 dZ=[dz(1),dz(2),?,dz(m)]dZ=[dz^{(1)},dz^{(2)},\cdots,dz^{(m)}]dZ=[dz(1),dz(2),?,dz(m)] ,所有的 dzdzdz 變量橫向排列,因此, dZdZdZ 是一個 1?m1*m1?m 的矩陣,或者說,一個 mmm 維行向量。在之前的幻燈片中,我們已經知道如何計算 AAA ,即 [a(1),a(2),?,a(m)][a^{(1)},a^{(2)},\cdots,a^{(m)}][a(1),a(2),?,a(m)],我們需要找到這樣的一個行向量 Y=[y(1),y(2),?,y(m)]Y=[y^{(1)},y^{(2)},\cdots,y^{(m)}]Y=[y(1),y(2),?,y(m)] ,由此,我們可以這樣計算 dZ=A?Y=[a(1)?y(1),a(2)?y(2),?,a(m)?y(m)]dZ=A-Y=[a^{(1)}-y^{(1)},a^{(2)}-y^{(2)},\cdots,a^{(m)}-y^{(m)}]dZ=A?Y=[a(1)?y(1),a(2)?y(2),?,a(m)?y(m)] ,不難發現第一個元素就是 dz(1)dz^{(1)}dz(1) ,第二個元素就是 dz(2)dz^{(2)}dz(2) ……所以我們現在僅需一行代碼,就可以同時完成這所有的計算。
在之前的實現中,我們已經去掉了一個for循環,但我們仍有一個遍歷訓練集的循環,如下所示:
dw=0dw=0dw=0dw+=x(1)?dz(1)dw+=x^{(1)}*dz^{(1)}dw+=x(1)?dz(1)dw+=x(2)?dz(2)dw+=x^{(2)}*dz^{(2)}dw+=x(2)?dz(2)?\vdots?dw+=x(m)?dz(m)dw+=x^{(m)}*dz^{(m)}dw+=x(m)?dz(m)dw=dwmdw=\frac{dw}mdw=mdw?db=0db=0db=0db+=dz(1)db+=dz^{(1)}db+=dz(1)db+=dz(2)db+=dz^{(2)}db+=dz(2)?\vdots?db+=dz(m)db+=dz^{(m)}db+=dz(m)db+=dbmdb+=\frac{db}mdb+=mdb?
上述(偽)代碼就是我們在之前實現中做的,我們已經去掉了一個for循環,但用上述方法計算 dwdwdw 仍然需要一個循環遍歷訓練集,我們現在要做的就是將其向量化!
首先我們來看 dbdbdb ,不難發現 db=1m∑i=1mdz(i)db=\frac1m\sum_{i=1}^mdz^{(i)}db=m1?∑i=1m?dz(i) , 之前的講解中,我們知道所有的 dz(i)dz^{(i)}dz(i) 已經組成一個行向量 dZdZdZ 了,所以在Python中,我們很容易地想到 db=1m?np.sum(dZ)db=\frac1m*np.sum(dZ)db=m1??np.sum(dZ) ;接下來看 dwdwdw ,我們先寫出它的公式 dw=1m?X?dzTdw=\frac1m*X*dz^Tdw=m1??X?dzT 其中, XXX 是一個行向量。因此展開后 dw=1m?(x(1)dz(1)+x(2)dz(2)+?+x(m)dz(m))dw=\frac1m*(x^{(1)}dz^{(1)}+x^{(2)}dz^{(2)}+\cdots+x^{(m)}dz^{(m)})dw=m1??(x(1)dz(1)+x(2)dz(2)+?+x(m)dz(m)) 。因此我們可以僅用兩行代碼進行計算: db=1m?np.sum(dZ)db=\frac1m*np.sum(dZ)db=m1??np.sum(dZ) , dw=1m?X?dzTdw=\frac1m*X*dz^Tdw=m1??X?dzT 。這樣,我們就避免了在訓練集上使用for循環。
現在,讓我們回顧一下,看看我們之前怎么實現的邏輯回歸,可以發現,沒有向量化是非常低效的,如下圖所示代碼:
我們的目標是不使用for循環,而是向量,我們可以這么做:
Z=wTX+b=np.dot(w.T,x)+bZ=w^TX+b=np.dot(w.T,x)+bZ=wTX+b=np.dot(w.T,x)+bA=σ(Z)A=\sigma(Z)A=σ(Z)dZ=A?YdZ=A-YdZ=A?Ydw=1m?X?dzTdw=\frac1m*X*dz^Tdw=m1??X?dzTdb=1m?np.sum(dZ)db=\frac1m*np.sum(dZ)db=m1??np.sum(dZ)w:=w?α?dww:=w-\alpha*dww:=w?α?dwb:=b?α?dbb:=b-\alpha*dbb:=b?α?db
現在我們利用前五個公式完成了前向和后向傳播,也實現了對所有訓練樣本進行預測和求導,再利用后兩個公式,梯度下降更新參數。我們的目的是不使用for循環,所以我們就通過一次迭代實現一次梯度下降,但如果你希望多次迭代進行梯度下降,那么仍然需要for循環,放在最外層。不過我們還是覺得一次迭代就進行一次梯度下降,避免使用任何循環比較舒服一些。
最后,我們得到了一個高度向量化的、非常高效的邏輯回歸的梯度下降算法,我們將在下次視頻中討論Python中的Broadcasting技術。
課程PPT
| 2.13 向量化 Logistic 回歸 | 回到目錄 | 2.15 Python 中的廣播 |
總結
以上是生活随笔為你收集整理的2.14 向量化 Logistic 回归的梯度输出-深度学习-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.13 向量化 Logistic 回归
- 下一篇: 2.15 Python 中的广播-深度学