第四周 深层神经网络

目录

 

4.1    深层神经网络的表示

4.2    深度网络中的前向传播

4.3    核对矩阵的维数

4.4    为什么使用深层表示

4.5    搭建深层神经网络块

4.6    前向和反向传播

前向传播:

 反向传播:

4.7    参数 VS 超参数


4.1    深层神经网络的表示

说几层神经网络一般不将输入层计算在内。例如上面的是一个4层神经网络,它包含3个隐含层一个输出层。

计算时为了统一符号将输入层表示为第0层。n^{[0]}=n_{-x}  、x=a^{[0]}X=A^{[0]}

L=4 层数

n^{[3]}=3 第三层的节点数

a^{[2]} 第二层的激活值  

W^{[2]}b^{[2]} 第二层的参数

4.2    深度网络中的前向传播

跟前面的只含一个隐含层的神经网络的计算类似,只不过多计算几层。公式都一样

单样本:

z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]}

a^{[l]}=g^{[l]}(z^{[l]})

全部样本:小写变大写

Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}

A^{[l]}=g^{[l]}(Z^{[l]})

注意:在编码前在纸上推算一遍,保证矩阵维度不会出错。

多层时可以使用for 循环实现,例如这里是4层,for循环4次就可以了。

4.3    核对矩阵的维数

这里有一个技巧要记住:

单个样本时 z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]} 、 a^{[l]}=g^{[l]}(z^{[l]})

第l层的权重的参数W^{[l]}的维度是:   \left ( n^{[l]} ,n^{[l-1]}\right )  就是 (这一层的节点数,前一层的节点数)

由公式推出 这一层的z^{[l]} 的维度是:\left ( n^{[l]},1 \right )         就是   (这一层的节点数,1)

同理 这一层的输出 a^{[l]} 的维度也是:\left ( n^{[l]},1 \right )

m个样本时:Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}、  A^{[l]}=g^{[l]}(Z^{[l]})

第l层的权重的参数W^{[l]}的维度是:   \left ( n^{[l]} ,n^{[l-1]}\right )  和单个样本时样本相同

不同的来了:这一层的 Z^{[l]} 维度是:\left ( n^{[l]},m \right )   就是(这一层的节点数,样本个数m)

             其实还是一个意思,第二个参数是样本数,因为上面的是单样本,所以为 1

同理 这一层的输出 A^{[l]} 的维度也是:\left ( n^{[l]},m \right )

b^{[l]}的维度单样本和多样本相同,始终是 \left ( n^{[l]},1 \right )  就是 (这一层的节点数,1)

利用上面的公式可以快速判断每一层的参数和输出矩阵的维度。

插入一点:上面的是前向传播 ,反向传播是 dW 和 db的维度分别与 W 和 b的维度是相同的。dZ 和dA 分别与Z和A的维度相同。(其实就是它们各自的变化量,维度当然与原先矩阵相同,要不相同怎么进行对应元素的加减运算呢)

4.4    为什么使用深层表示

以人脸识别为例:

这里的深层神经网络是指深层卷积神经网络。

刚开始检测一些小的特征。如前几层是边缘探测器,检测图像的微小边缘,如图中1所指向的方块。

然后将小的特征组合成更大的特征,如2指向的方块

最后检测出人脸。

一句话:较早的前几层学习一些低层次的简单特征,等到后几层,就能把简单的特征结合起来去探测更加复杂的东西。

题外话:深度学习以前称为“有很多隐含层的神经网络”,突然有一天有人发现用“深度学习”这个名字比较高大上,然后,这个常人看起来不觉明历的名字就火了。。。。

4.5    搭建深层神经网络块

图中红色方框里面的内容就是我们的一个神经网络层(块)的前向和后向传播的块表示方法。

这一层前向传播:输入的是a^{[l-1]}  输出的是a^{[l]} 。需要的参数是W^{[l]}b^{[l]}。中间的输出是z^{[l]}。因为我们的目的要的是输出a^{[l]},所以把这个z^{[l]}称为中间输出,又因为在反向传播中我们需要用到z^{[l]},所以这时我们把z^{[l]}存到一个叫cache的变量中。

反向传播:输入的是da^{[l]} 输出的是da^{[l-1]}。需要的参数是 上面的 z^{[l]} 和 W^{[l]}b^{[l]}。然后计算出dz^{[l]}。中间输出dW^{[l]}db^{[l]}

比较两个块中间计算需要的参数,不难发现反向传播比正向传播多了一个z^{[l]}。所以为了方便也把W^{[l]}b^{[l]}写到cache中,这样反向计算参数只需要一个cache就行。

4.6    前向和反向传播

前向和反向传播计算时都要先联想上面我们的传播块,确认输入是什么 要输出什么

前向传播:

单个样本 多个样本

z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]}

a^{[l]}=g^{[l]}(z^{[l]})

Z^{[l]}=W^{[l]}A^{[l-1]}+b^{[l]}

A^{[l]}=g^{[l]}(Z^{[l]})

 反向传播:

在进行反向传播的时候按照两点思想:1,按照前向传播的公式推出各个变量的导数 2、注意维度问题 dW和W 、dA和A、db和b的维度是相同的,所以反向传播时会有矩阵的转置

联想4.5的反向传播块:

这里有一个技巧:我们要求的是=左边的变量,所以=后面的变量矩阵乘积的维度必须要和=前面的变量维度相同,这就要求=后面的部分变量矩阵转置。(时刻清楚各个矩阵的维度应该是什么)
 

单个样本 m个样本

dz^{[l]}=da^{[l]}*g^{[l]'}(z^{[l]})

dW^{[l]}=dz^{[l]}a^{[l-1]T}

db^{[l]}=dz^{[l]}

da^{[l-1]}=W^{[l]T}dz^{[l]}

dZ^{[l]}=dA^{[l]}*g^{[l]'}(Z^{[l]})

dW^{[l]}=\frac{1}{m}dZ^{[l]}A^{[l-1]T}

db^{[l]}=\frac{1}{m}np.sum(dZ^{[l]},axis=1,keepdims=True)

dA^{[l-1]}=W^{[l]T}dZ^{[l]}


tips:我们的反向传播是从输出端开始的,所以我们的dA^{[l]}是要我们亲自计算的。如下,老吴以一个三层的输出端为sigmoid的网络为例画出了整个的流程。第一步:前向传播计算出损失函数l(\hat{y},y) 第二步:计算每个样本的da^{[l]},横向排列成dA^{[l]}。这样我们就得到了反向传播的第一个值dA^{[l]},然后再计算dZ^{[l]}。当然前面我们已经验算过,如果激活函数是sigmoid 那么我们可以直接知道它的dZ^{[l]}=A^{[l]}-Y

tips:吴恩达这里说了一句话值得思考:为什么我们写了几行代码就可以得到如此复杂的函数,实现如此复杂的功能?:::因为,算法的复杂性来源于(大量)数据,而不是你写的代码。

4.7    参数 VS 超参数

‘’超参数‘’是需要我们人为设定的参数,‘’参数‘’是我们要求的参数。‘’超参数‘’的选择控制着参数‘’

例如我们目前已知的超参数:学习率、求梯度下降循环次数、隐含层层数、每个隐含层的节点数、各个层的激活函数

    我们目前已知的参数就是:w和b

超参数:一种控制实际参数的参数

猜你喜欢

转载自blog.csdn.net/wdx1993/article/details/83313772
今日推荐