反向传播解析
对于单个样本计算一次梯度:
在逻辑回归中,我们要做的就是修改参数w和b,来减少损失函数。因为我们要计算关于损失函数的导数,反向传播时,首先计算损失函数对于da的导数。
da = dL/da = -y/a+(1-y)/(1-a) 。
继续往回,算出损失函数对z的导数:
dz = dL/dz = (dL/da)*(da/dz) = da*a(1-a) = a-y
其中 da/dz=a(1-a) 注:仅对于sigmoid函数成立。
现在可以计算当前L层的dw,db。
小结:
(1)以上为单个隐藏层时的梯度计算,扩展到多个隐藏层,只需继续往回走。
(2)可以注意到,每次往回计算(L-1)层的导数时,都会用到(L)层的导数——链式求导法则。
m个训练样例计算一次梯度:
for循环遍历训练集 同时计算相应的每个 训练样本的微分并把它们加起来
假设你只有 两个特征 所以n等于2 否则你需要对dw_1 dw_2 dw_3等等
最终对所有的m个训练样本 都进行这个计算后 还需要 除以m 因为我们是在计算平均值
做完所有这些计算后 你已经计算了 代价函数J 对各个参数w_1 w_2 (即每一层的W,W包含w_1,w_2)和b的导数 。
所以完成所有 这些计算后实现一步 梯度下降来更新w_1 即w_1减去学习率 乘上dw_1 而w_2更新为w_2减去 学习率乘上dw_2
所以幻灯片上的所有东西 只实现了一步梯度下降,即一次迭代。
因此你需要 重复以上内容很多次 以完成多次梯度下降
如果按照这里的方法实现的话,逻辑回归时 你需要两个for循环 第一个for循环 是一个小循环用于遍历m个训练样本 第二个for循环是一个 遍历所有特征的for循环 这个例子中我们只有2个特征 所以n等于2并且n_x等于2 但如果你有更多特征 你需要编写dw_1 dw_2 以及类似地计算dw_3等等 直到dw_n 所以看来你 需要一个for循环遍历
矢量化技术 它可以帮助你的代码摆脱for循环
神经网络流程:
m表示训练样例的个数。
两层(一个隐藏层+一个输出层)神经网络实现细节:
前向传播:
计算Loss函数:
反向计算梯度: