正向传播推导
第i个样本

输入xi,通过计算得到z(i),然后再使用sigmoid函数得到预测值y^(i),我们需要判断y^(i)与实际值y的关系。
第一,先判断维度,xi(nx1),w(nx1),z(i)(1x1),y^(i)(1x1)。
接着,我们来计算z(i)=(xi1w1+xi2w2+⋯+xinwn)+b=(w1,w2,…,wm)⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛xi1xi2...xin⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞+b。
其中,b是实数,python中有广播功能,能使b扩展到与前式相同的维度并计算。
向量化(从个别到整体)
为了与上面做区别,字母大写。
Z=(w1,w2,…,wm)⎝⎜⎜⎜⎜⎜⎜⎛x11x12...x1nx21x22...x2n………xm1xm2...xmn⎠⎟⎟⎟⎟⎟⎟⎞+b=wTX+b。
Y^=δ(Z)=sigmoid(Z)=(y^(1),y^(2),…,y^(m))。
此处使用sigmoid函数将预测值y^分布在0~1之间,即二分法。
判断向量维度
上面的维度是单个样本的维度,下面的维度是m个样本中向量的维度;在矩阵运算中,维度尤其重要,后面判断转置和累和都是基于矩阵维度。
X(nxm),其中n是特征,m是样本,w(nx1),b实数(1x1),Z(1xm),Y^(1xm)。
将原始数据进行整合
吴恩达老师提供了训练集和测试集,其中,train_data_org=(129,64,64,3)–>(129,64x64x3)–>(129,12288)->(129,12288)T−>(12288,129)。
其中,给出的训练集数据格式是129个样本,64x64的宽高,3原色(红、绿、蓝),我们需要将后面三位数相乘作为特征,然后再转置得到特征x样本即nxm。
接下来处理标签,train_labels_org=(129,)–>(1,129)。
其中,给出的训练集数据格式是129个样本,我们需要使用numpy库将其转换为需要的格式。
反向传播推导
第i个样本

依旧使用这幅图片,我们令a=y^(i)=δ(z(i))=1+e−z(i)1。其中,xi(nx1),w(nx1),z(i)(1x1),y^(i)(1x1),b实数(1x1)。
由前向传播函数得,Z=wTX+b。其中,X(nxm),w(nx1),b(1x1),Z(1xm),Y^(1xm),A(1xm)。
损失函数
loss function:对一个样本中计算预测值和实际值的差距。L(a,y)=−ylog10a−(1−y)log10(1−a)。
代价函数
costs function:对m个样本中的w和b累加和后求均值。J(a,y)=J(w,b)=−m1∑i=1m[y∗loga+(1−y)∗log(1−a)]。
梯度下降法(实则是多元函数求微分)
∂w∂L(a,y)=∂a∂L(a,y)∂z∂a∂w∂z。∂b∂L(a,y)=∂a∂L(a,y)∂z∂a∂b∂z。其中,∂a∂L(a,y)=−ay−1−a(1−y)(−1),∂z∂a=−(1+ez)2e−z(−1)=1+eze−z=(1+ez)211+ez1+ez−1=a(1−a),所以∂a∂L(a,y)∂z∂a=a−y。
最后,∂w∂L(a,y)=(a−y)x−−>x(a−y);∂b∂L(a,y)=a−y−−>np.sum(a−y)。
做点解释,前面采用微积分中的链式求导法则来算,后面根据维度做变换,∂w∂L(a,y)维度是nx1,∂b∂L(a,y)维度是1x1,a-y维度是1x1。
向量化(从个别到整体)
∂w∂L(A,Y)=X(A−Y)−−>X(A−Y)T;∂b∂L(A,Y)=A−Y−−>np.sum(A−Y)。其中,A-Y的维度是1xm。
W=W−αm1X(A−Y);b=b−αm1np.sum(A−Y);J(w,b)=−m1np.sum[Yloga+(1−Y)log(1−A)]。其中,J(w,b)维度是1xm,里面均是点乘(矩阵对应位置相乘)。