Z = wTx + b
a = σ (z) = 1 / ( 1 + e-z )
L ( a , y ) = —( y log(a) + ( 1 - y ) log(1-a) )
dz(i) = a(i) - y(i)
dw = xdz
db = dz
如何向量化计算m个训练数据的梯度:
梯度计算时dz(i) = a(i) - y(i)
定义 Z = { z1 , z2 , z3 ................zm }
A = { a1 , a2 ,a3 ................ am }
Y = { y1 , y2 , y3 ................ym }
则:
dz = A - Y = { a1 - y1 , a2 - y2 , a3 - y3 ....................am - ym }
对于传统方法需要用for循环来重复更新dw和db的值
如: dw = 0 db = 0
dw += x1dz1 db += dz1
dw += x2dz2 db += dz2
: :
: :
: :
dw += xmdzm db += dzm
dw /= m db / = m
深度学习中使用方法为:
Z = np.dot(w.T,X)+b
A = sigmoid(Z)
dz = A - Y
dw = 1/m X dzT (其中X为x1 , x2 ......... xm组成的n*m阶矩阵 ,dz为z1 ,z2 .......... zm组成的1*m阶矩阵,则dzT为m*1阶矩阵 )
db = 1 / m * np.sum ( dz )
到这里就完成了正向和反向传播,确实实现了对所有训练样本进行预测和求导,而且没有用一个for循环,然后梯度下降更新参数
w = w - α * dw
b = b - α * db
其中α是学习率
上述所有标黄的部分就实现了logistic回归的梯度下降一次迭代
如果需要多洗进行迭代梯度下降,如:要求1000次导数进行梯度下降,在最外层需要一次for循环
for i in range (1000) :
Z = np.dot(w.T,X)+b
A = sigmoid(Z)
dz = A - Y
dw = 1/m X dzT
db = 1 / m * np.sum ( dz )
w = w - α * dw
b = b - α * db