首先让我们来回顾一下有关逻辑回归的知识。如下图所示,在逻辑回归的前向传播过程中,第一步我们要先计算出z,第二步计算出预测值y^\hat{y}y^,最后计算出损失函数L。
z = wTw^TwTx+b
y^\hat{y}y^ = 11+e−z\frac{1}{1 + e^{-z}}1+e−z1
L(y^\hat{y}y^, y) = -(ylog(y^\hat{y}y^) + (1-log)(1-y^\hat{y}y^))
上面是前向传播,那么反向传播应该如何计算呢?
我们最终的目的是要计算出w和d关于L的偏导数,也就是dLdw\frac{dL}{dw}dwdL和dLdb\frac{dL}{db}dbdL,然后更新w,b以使损失函数L越来越小,使预测越来越精准。
通常我们会将最终函数(在这里是L)的偏导数的符号进行简化,例如dLdw\frac{dL}{dw}dwdL可以写成dw,将dLdb\frac{dL}{db}dbdL写成db,所以当你看到db时你会知道它是 dLdb\frac{dL}{db}dbdL而不是 dy^db\frac{d\hat{y}}{db}dbdy^。
为了计算出dw和db,第一步需要计算出 dy^(dLdy^d\hat{y}(\frac{dL}{d\hat{y}}dy^(dy^dL),dy^\hat{y}y^ 的计算公式是 −(yy^+1−y1−y^)-(\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}})−(y^y+1−y^1−y),下一步我们需要求出dz,根据链式法则dz可以通过 dLdy^dy^dz\frac{dL}{d\hat{y}}\frac{d\hat{y}}{dz}dy^dLdzdy^ 求出,dLdy^\frac{dL}{d\hat{y}}dy^dL上面我们已经求出来了,dy^dz\frac{d\hat{y}}{dz}dzdy^的计算公式是y^(1−y^)\hat{y}(1-\hat{y})y^(1−y^),
dy^dz=−(1+e−z)−2e−z(−1)\frac{d\hat{y}}{dz}=-(1+e^{-z})^{-2}e^{-z}(-1)dzdy^=−(1+e−z)−2e−z(−1)
=e−z(1+e−z)2=\frac{e^{-z}}{(1+e^{-z})^2}=(1+e−z)2e−z
=e−z+1−1(1+e−z)2=\frac{e^{-z}+1-1}{(1+e^{-z})^2}=(1+e−z)2e−z+1−1
=11+e−z−1(1+e−z)2=\frac{1}{1 + e^{-z}}-\frac{1}{(1 + e^{-z})^2}=1+e−z1−(1+e−z)21
=y^−y^2=\hat{y}-\hat{y}^2=y^−y^2
经过计算后 dz=y^−ydz=\hat{y}-ydz=y^−y。同理,我们可以计算出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
利用上面的计算过程我们实现了逻辑回归的前向传播、反向传播,对参数进行梯度下降,一步一步的更新参数,使预测越来越精准。