我的数据科学之路-深度学习正向传播与反向传播
本篇做一个深度学习的入门介绍。神经网络是在20世纪80年代兴起的技术,后来因为所消耗的计算资源泰国庞大而逐渐被冷落,直到最近硬件水平的大幅度提高而再次火热起来。而深度学习多层的神经网络技术。
3层神经网络上图是一个3层的神经网络模型,一个输入层,两个隐层,一个输出层,不考虑输入层,所以说3层神经网络。每一个神经元对于输入所做的处理都是一样的,先进性线性变换,即z=wx+b,然后通过一个激活函数将a映射到真正的输出y=g(z),因为线性变换的组合最终还是线性变换,所以需要一个非线性的函数来调整曲线。
正向传播:
Input:a[l-1]
Output:a[l], cache(z[l]) (or W[l], b[l])
FP 的两个公式,比较简单,直接代入即可(主要根据这两个公式推导BP):
z[l]= W[l]·a[l-1]+ b[l] --------- ①
a[l]= g[l](z[l]) ------------------- ②
反向传播:
Input:da[l]
Output:da[l-1], dW[l], db[l]
BP的公式:
1. 首先求dz[l],由公式②,dz[l] = da[l]*g[l]'(z[l]),根据链式求导法则得出,因为*是元素对应相乘,所以两者顺序对结果不影响。
2. 再求dW[l],由公式①,dW[l] = dz[l]·a[l-1]T,因为乘积为点乘,因此两者顺序影响结果。此时,我们可以分析矩阵的维度来判断顺序以及是否要转置。dW[l] 为 (n[l],n[l-1]),dz[l]为 (n[l],1),a[l-1]为 (n[l-1],1),因此,要得到 dW[l]的维度,应该将 dz[l] 放在前,并与a[l-1]T作点积运算。(注:吴恩达老师在讲课时,写的是a[l-1],我个人认为此处是笔误,欢迎大家讨论)
3. 同样根据公式①,容易得出:db[l] = dz[l]。
4. 最后,根据公式①,da[l-1] = W[l]T·dz[l],da[l-1] 的维度为 (n[l-1],1),W[l] 的维度为 (n[l],n[l-1]),dz[l]为 (n[l],1),显然需要将W[l]转置再与dz[l]作点积。
这样我们就得到的 Output 的三个值。