Deep Learning (1) - Neural Network with 1 Hidden Layer
在之前学习Andrew NG的Coursera课程《Machine Learning》的时候,针对Neural Network做过一篇笔记:Machine Learning (2) - Neural Network。当时通过学习知道了如何计算2层(1个隐藏层)Neural Network的偏导数问题。但是理解只是局限于一堆公式,不够深刻。这次在学习Andrew NG的Deep Learning课程时,Andrew在介绍深层网络之前也介绍了浅层网络的基本原理,包括导数公式的推导。我现在终于理解了这些公式是如何来的了。对比了之前Machine Learning的课件和笔记,我认为此次课程中使用的符号标记方式更容易理解和推导。
在这一篇笔记中,我会主要记录浅层神经网络的forward propagation & backward propagation计算方法。
Forward Propagation
Backward Propagation
在神经网络的学习中,我们往往能听到这个词汇。听起来很玄乎,其实他并不神秘。
Backward Propagation,中文翻译为反向传播。它是用来计算导数的。下图为Logistic Regression的计算图:
则有下图:
纠错
- 上图应为
- 应为
先看Andrew给出的计算结果:
分步求导
损失函数
这个就很简单了
至此全部得证。
矩阵求导
在计算的时候,会发现这里有一个矩阵求导的问题。是列向量,是型矩阵,是列向量。
网上搜到的矩阵求导方法的帖子有很多,但都没有很好的解释为什么。
根据我自己的理解,可以看作个列向量。关于的导数就是对所有列向量的导数的stack。
因为
所以得证。
Vectorization
Forward propagation
Backward propagation
np.sum(A, axis=1, keepdims=True) 求取矩阵A各行的和
axis: =1 按行求和,=0 按列求和,没有axis则全矩阵求和
keepdims: =True 求和出来后仍然保存矩阵结构,即按行求和,则得到列向量,按列求和得到行向量,全矩阵求和得到一个1x1矩阵。
分析
先看single training example:
训练样本按照下面的方法stack,也类似可得如下:
最直观的b应该是,因为
那为什么要按照行求和再按m求均值呢?因为为模型参数,与样本无关。针对每个样本b, db应当相同。所以要按上面这么算。
总结
在浅层神经网络中,正向传播求节点值,反向传播利用链式法则求导数。在向量化的时候,针对所有的样本,向量按照列组合成矩阵,即矩阵的一列对应一个样本。