首先讓我們來回顧一下有關邏輯迴歸的知識。如下圖所示,在邏輯迴歸的前向傳播過程中,第一步我們要先計算出z,第二步計算出預測值,最後計算出損失函數L。
z = x+b
=
L(, y) = -(ylog() + (1-log)(1-))
上面是前向傳播,那麼反向傳播應該如何計算呢?
我們最終的目的是要計算出w和d關於L的偏導數,也就是和,然後更新w,b以使損失函數L越來越小,使預測越來越精準。
通常我們會將最終函數(在這裏是L)的偏導數的符號進行簡化,例如可以寫成dw,將寫成db,所以當你看到db時你會知道它是 而不是 。
爲了計算出dw和db,第一步需要計算出 ),d 的計算公式是 ,下一步我們需要求出dz,根據鏈式法則dz可以通過 求出,上面我們已經求出來了,的計算公式是,
經過計算後 。同理,我們可以計算出dw=xdz,db=dz。如下所示:
得到dw,db後,就可以更新這些參數值進行梯度下降,例如w=w-rdw,然後用新的參數值再次進行前向傳播然後再反向傳播,
通過這樣不停的前向反向傳播來訓練參數,使損失函數值越來越小。
上面講述的是單個訓練樣本時如何計算邏輯迴歸的偏導數,下面我給大家介紹多個訓練樣本時如何計算偏導數。
對於多個訓練樣本,成本其實就是多個樣本的損失的平均值——m個樣本的損失累加起來然後除以m就是成本。同理,多個樣本時的偏導數等於每個樣本的偏導數的平均值。
下圖給出m個樣本時計算偏導數的僞碼。
Z = np.dot(w.T, X) + b
A = 1 / (1 + np.exp(-Z))
L = np.sum(-(Y*np.log(A) + (1-Y)*np.log(1-A))) / m
dZ = A - Y
dw = np.dot(X,dZ.t) / m
db = np.sum(dZ) / m
w = w - r * dw
b = b - r * db
利用上面的計算過程我們實現了邏輯迴歸的前向傳播、反向傳播,對參數進行梯度下降,一步一步的更新參數,使預測越來越精準。