4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授


←上一篇 ↓↑ 下一篇→
4.4 为什么使用深层表示 回到目录 4.6 前向和反向传播

搭建深层神经网络块 (Building Blocks of Deep Neural Networks)

这周的前几个视频和之前几周的视频里,你已经看到过正向反向传播的基础组成部分了,它们也是深度神经网络的重要组成部分,现在我们来用它们建一个深度神经网络。

4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授_第1张图片

这是一个层数较少的神经网络,我们选择其中一层(方框部分),从这一层的计算着手。在第 l l l 层你有参数 W [ l ] W^{[l]} W[l] b [ l ] b^{[l]} b[l] ,正向传播里有输入的激活函数,输入是前一层 a [ l − 1 ] a^{[l-1]} a[l1] ,输出是 a [ l ] a^{[l]} a[l] ,我们之前讲过 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]}) z[l]=w[l]a[l1]+b[l], a[l]=g[l](z[l]) ,那么这就是你如何从输入 a [ l − 1 ] a^{[l-1]} a[l1] 走到输出 a [ l ] a^{[l]} a[l] 的。之后你就可以把 z [ l ] z^{[l]} z[l] 的值缓存起来,我在这里也会把这包括在缓存中,因为缓存的 [ i ] ^{[i]} [i] 对以后的正向反向传播的步骤非常有用。

然后是反向步骤或者说反向传播步骤,同样也是第 l l l 层的计算,你会需要实现一个函数输入为 d a [ l ] da^{[l]} da[l] ,输出 d a [ l − 1 ] da^{[l-1]} da[l1] 的函数。一个小细节需要注意,输入在这里其实是 d a [ l ] da^{[l]} da[l] 以及所缓存的 z [ l ] z^{[l]} z[l] 值,之前计算好的 z [ l ] z^{[l]} z[l] 值,除了输出 d a [ l − 1 ] da^{[l-1]} da[l1] 的值以外,也需要输出你需要的梯度 d w [ l ] dw^{[l]} dw[l] d b [ l ] db^{[l]} db[l] ,这是为了实现梯度下降学习。

这就是基本的正向步骤的结构,我把它成为称为正向函数,类似的在反向步骤中会称为反向函数。总结起来就是,在 l l l 层,你会有正向函数,输入 a [ l − 1 ] a^{[l-1]} a[l1] 并且输出 a [ l ] a^{[l]} a[l] ,为了计算结果你需要用 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l] ,以及输出到缓存的 z [ l ] z^{[l]} z[l] 。然后用作反向传播的反向函数,是另一个函数,输入 d a [ l ] da^{[l]} da[l] ,输出 d a [ l − 1 ] da^{[l-1]} da[l1] ,你就会得到对激活函数的导数,也就是希望的导数值 d a [ l ] da^{[l]} da[l] a [ l − 1 ] a^{[l-1]} a[l1] 是会变的,前一层算出的激活函数导数。在这个方块(第二个)里你需要 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l] ,最后你要算的是 d z [ l ] dz^{[l]} dz[l] 。然后这个方块(第三个)中,这个反向函数可以计算输出 d w [ l ] dw^{[l]} dw[l] d b [ l ] db^{[l]} db[l] 。我会用红色箭头标注标注反向步骤,如果你们喜欢,我可以把这些箭头涂成红色。

4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授_第2张图片

然后如果实现了这两个函数(正向和反向),然后神经网络的计算过程会是这样的:

4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授_第3张图片

把输入特征 a [ 0 ] a^{[0]} a[0] ,放入第一层并计算第一层的激活函数,用 a [ 1 ] a^{[1]} a[1] 表示,你需要 w [ 1 ] w^{[1]} w[1] [ 1 ] ^{[1]} [1] 来计算,之后也缓存 z [ l ] z^{[l]} z[l] 值。之后喂到第二层,第二层里,需要用到 w [ 2 ] w^{[2]} w[2] b [ 2 ] b^{[2]} b[2] ,你会需要计算第二层的激活函数 a [ 2 ] a^{[2]} a[2] 。后面几层以此类推,直到最后你算出了 a [ L ] a^{[L]} a[L] ,第 L L L 层的最终输出值 y ^ \hat{y} y^ 。在这些过程里我们缓存了所有的 z z z 值,这就是正向传播的步骤。

4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授_第4张图片

对反向传播的步骤而言,我们需要算一系列的反向迭代,就是这样反向计算梯度,你需要把 d a [ L ] da^{[L]} da[L] 的值放在这里,然后这个方块会给我们 d a [ L − 1 ] da^{[L-1]} da[L1] 的值,以此类推,直到我们得到 d a [ 2 ] da^{[2]} da[2] d a [ 1 ] da^{[1]} da[1] ,你还可以计算多一个输出值,就是 d a [ 0 ] da^{[0]} da[0] ,但这其实是你的输入特征的导数,并不重要,起码对于训练监督学习的权重不算重要,你可以止步于此。反向传播步骤中也会输出 d w [ l ] dw^{[l]} dw[l] d b [ l ] db^{[l]} db[l] ,这会输出 d w [ 3 ] dw^{[3]} dw[3] d b [ 3 ] db^{[3]} db[3] 等等。目前为止你算好了所有需要的导数,稍微填一下这个流程图。

神经网络的一步训练包含了,从 a [ 0 ] a^{[0]} a[0] 开始,也就是 x x x 然后经过一系列正向传播计算得到 y ^ \hat{y} y^ ,之后再用输出值计算这个(第二行最后方块),再实现反向传播。现在你就有所有的导数项了, w w w 也会在每一层被更新为 w = w − α d w w=w-\alpha dw w=wαdw b b b 也一样, b = b − α b b=b-\alpha b b=bαb ,反向传播就都计算完毕,我们有所有的导数值,那么这是神经网络一个梯度下降循环。

继续下去之前再补充一个细节,概念上会非常有帮助,那就是把反向函数计算出来的 z z z 值缓存下来。当你做编程练习的时候去实现它时,你会发现缓存可能很方便,可以迅速得到 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[l] 的值,非常方便的一个方法,在编程练习中你缓存了 z z z ,还有 w w w b b b 对吧?从实现角度上看,我认为是一个很方便的方法,可以将参数复制到你在计算反向传播时所需要的地方。好,这就是实现过程的细节,做编程练习时会用到。

现在你们见过实现深度神经网络的基本元件,在每一层中有一个正向传播步骤,以及对应的反向传播步骤,以及把信息从一步传递到另一步的缓存。下一个视频我们会讲解这些元件具体实现过程,我们来看下一个视频吧。

课程PPT

4.5 搭建深层神经网络块-深度学习-Stanford吴恩达教授_第5张图片


←上一篇 ↓↑ 下一篇→
4.4 为什么使用深层表示 回到目录 4.6 前向和反向传播

你可能感兴趣的:(深度学习DL)