吴恩达深度学习笔记:深层神经网络(Deep Neural Networks)4.1-4.4

news2025/1/10 23:57:29

目录

  • 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)
    • 第四周:深层神经网络(Deep Neural Networks)
      • 4.1 深层神经网络(Deep L-layer neural network)
      • 4.2 前向传播和反向传播(Forward and backward propagation)
      • 4.3 深层网络中的前向传播(Forward propagation in a Deep Network)
      • 4.4 核对矩阵的维数(Getting your matrix dimensions right)

第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)

第四周:深层神经网络(Deep Neural Networks)

4.1 深层神经网络(Deep L-layer neural network)

目前为止我们学习了只有一个单独隐藏层的神经网络的正向传播和反向传播,还有逻辑回归,并且你还学到了向量化,这在随机初始化权重时是很重要。

本周所要做的是把这些理念集合起来,就可以执行你自己的深度神经网络。
复习下前三周的课的内容:
1.逻辑回归,结构如下图左边。一个隐藏层的神经网络,结构下图右边:
在这里插入图片描述
注意,神经网络的层数是这么定义的:从左到右,由 0 开始定义,比如上边右图, x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3,这层是第 0 层,这层左边的隐藏层是第 1 层,由此类推。如下图左边是两个隐藏层的神经网络,右边是 5 个隐藏层的神经网络。

在这里插入图片描述
严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。记住以下要点:

有一个隐藏层的神经网络,就是一个两层神经网络。记住当我们算神经网络的层数时,我们不算输入层,我们只算隐藏层和输出层。

但是在过去的几年中,DLI(深度学习学院 deep learning institute)已经意识到有一些函数,只有非常深的神经网络能学会,而更浅的模型则办不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。

我们再看下深度学习的符号定义:
在这里插入图片描述
上图是一个四层的神经网络,有三个隐藏层。我们可以看到,第一层(即左边数过去第二层,因为输入层是第 0 层)有 5 个神经元数目,第二层 5 个,第三层 3 个。

我们用 L 表示层数,上图:𝐿 = 4,输入层的索引为“0”,第一个隐藏层 n [ 1 ] n^{[1]} n[1] = 5,表示有 5个隐藏神经元,同理 n [ 2 ] n^{[2]} n[2] = 5, n [ 3 ] n^{[3]} n[3] = 3, n [ 4 ] n^{[4]} n[4]= n [ L ] n^{[L]} n[L] =1(输出单元为 1)。而输入层, n [ 0 ] = n x = 3 n^{[0]} =n_x = 3 n[0]=nx=3

在不同层所拥有的神经元的数目,对于每层 l 都用 a [ l ] a^{[l]} a[l]来记作 l 层激活后结果,我们会在后面看到在正向传播时,最终能你会计算出 a [ l ] a^{[l]} a[l]

通过用激活函数 g计算 z [ l ] z^{[l]} z[l],激活函数也被索引为层数l,然后我们用 w [ l ] w^{[l]} w[l]来记作在 l 层计算 z [ l ] z^{[l]} z[l]值的权重。类似的, z [ l ] z^{[l]} z[l]里的方程b[l]也一样。

最后总结下符号约定:
输入的特征记作𝑥,但是𝑥同样也是 0 层的激活函数,所以 x = a [ 0 ] x = a^{[0]} x=a[0]
最后一层的激活函数,所以 a [ L ] a^{[L]} a[L]是等于这个神经网络所预测的输出结果。

4.2 前向传播和反向传播(Forward and backward propagation)

之前我们学习了构成深度神经网络的基本模块,比如每一层都有前向传播步骤以及一个相反的反向传播步骤,这次视频我们讲讲如何实现这些步骤。

先讲前向传播,输入 a [ l − 1 ] a^{[l−1]} a[l1],输出是 a [ l ] a^{[l]} a[l],缓存为 z [ l ] z^{[l]} z[l];从实现的角度来说我们可以缓存下 w [ l ] w^{[l]} w[l] b [ l ] b^{[l]} b[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])
向量化实现过程可以写成: 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 [ 0 ] A^{[0]} A[0]也就是X,来初始化;初始化的是第一层的输入值。 a [ 0 ] a^{[0]} a[0]对应于一个训练样本的输入特征,而 A [ 0 ] A^{[0]} A[0]对应于一整个训练样本的输入特征,所以这就是这条链的第一个前向函数的输入,重复这个步骤就可以从左到右计算前向传播。

下面讲反向传播的步骤:输入为𝑑𝑎[𝑙],输出为𝑑𝑎[𝑙−1],𝑑𝑤[𝑙], 𝑑𝑏[𝑙]
在这里插入图片描述

所以反向传播的步骤可以写成:
(1) d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]} = da^{[l]}∗ g^{[l]'}(z^{[l]}) dz[l]=da[l]g[l](z[l])
(2) d w [ l ] = d z [ l ] ⋅ a [ l − 1 ] dw^{[l]} = dz^{[l]}⋅ a^{[l−1]} dw[l]=dz[l]a[l1]
(3) d b [ l ] = d z [ l ] db^{[l]} = dz^{[l]} db[l]=dz[l]
(4) d a [ l − 1 ] = w [ l ] T ⋅ d z [ l ] da^{[l−1]} = w^{[l]T}⋅ dz^{[l]} da[l1]=w[l]Tdz[l]
(5) d z [ l ] = w [ l + 1 ] T d z [ l + 1 ] ∗ g [ l ] ′ ( z [ l ] ) dz^{[l]} = w^{[l+1]T}dz^{[l+1]}*g^{[l]'}(z^{[l]}) dz[l]=w[l+1]Tdz[l+1]g[l](z[l])
式子(5)由式子(4)带入式子(1)得到,前四个式子就可实现反向函数。

向量化实现过程可以写成:
(6) d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) dZ^{[l]} = dA^{[l]}∗ g^{[l]'}(Z^{[l]}) dZ[l]=dA[l]g[l](Z[l])
(7) d W [ l ] = 1 m d Z [ l ] ⋅ A [ l − 1 ] T dW^{[l]} =\frac{1}{m}dZ^{[l]}⋅A^{[l−1]T} dW[l]=m1dZ[l]A[l1]T
(8) d b [ l ] = 1 m n p . s u m ( d z [ l ] , a x i s = 1 , k e e p d i m s = T r u e ) db^{[l]} =\frac{1}{m}np.sum(dz[l], axis = 1, keepdims =True) db[l]=m1np.sum(dz[l],axis=1,keepdims=True)
(9) d A [ l − 1 ] = W [ l ] T . d Z [ l ] dA^{[l−1]} = W^{[l]T}. dZ[l] dA[l1]=W[l]T.dZ[l]

总结一下:
在这里插入图片描述
第一层你可能有一个 ReLU 激活函数,第二层为另一个 ReLU 激活函数,第三层可能是sigmoid 函数(如果你做二分类的话),输出值,用来计算损失;这样你就可以向后迭代进行反向传播求导来求 d w [ 3 ] , d b [ 3 ] , d w [ 2 ] , d b [ 2 ] , d w [ 1 ] , d b [ 1 ] dw^{[3]},db^{[3]} ,dw^{[2]} ,db^{[2]} ,dw^{[1]} ,db^{[1]} dw[3]db[3]dw[2]db[2]dw[1]db[1]。在计算的时候,缓存会把 z [ 1 ] , z [ 2 ] , z [ 3 ] z^{[1]},z^{[2]},z^{[3]} z[1],z[2],z[3]传递过来,然后回传 d a [ 2 ] , d a [ 1 ] da^{[2]},da^{[1]} da[2]da[1] ,可以用来计算 d a [ 0 ] da^{[0]} da[0],但我们不会使用它,这里讲述了一个三层网络的前向和反向传播,还有一个细节没讲就是前向递归——用输入数据来初始化,那么反向递归(使用 Logistic 回归做二分类)——对 A [ l ] A^{[l]} A[l] 求导。

4.3 深层网络中的前向传播(Forward propagation in a Deep Network)

跟往常一样,我们先来看对其中一个训练样本 x 如何应用前向传播,之后讨论向量化的版本。

第一层需要计算 z [ 1 ] = w [ 1 ] x + b [ 1 ] , a [ 1 ] = g [ 1 ] ( z [ 1 ] ) z^{[1]} = w^{[1]}x + b^{[1]},a^{[1]} = g^{[1]}(z^{[1]}) z[1]=w[1]x+b[1]a[1]=g[1](z[1])(x可以看做 a [ 0 ] a^{[0]} a[0]
第二层需要计算 z [ 2 ] = w [ 2 ] a [ 1 ] + b [ 2 ] , a [ 2 ] = g [ 2 ] ( z [ 2 ] ) z^{[2]} = w^{[2]}a^{[1]} + b^{[2]},a^{[2]} = g^{[2]}(z^{[2]}) z[2]=w[2]a[1]+b[2]a[2]=g[2](z[2])
以此类推,第四层为 z [ 4 ] = w [ 4 ] a [ 3 ] + b [ 4 ] , a [ 4 ] = g [ 4 ] ( z [ 4 ] ) z^{[4]} = w^{[4]}a^{[3]} + b^{[4]},a^{[4]} = g^{[4]}(z^{[4]}) z[4]=w[4]a[3]+b[4]a[4]=g[4](z[4])
前向传播可以归纳为多次迭代 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])

在这里插入图片描述
向量化实现过程可以写成: Z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] , A [ l ] = g [ l ] ( Z [ l ] ) ( A [ 0 ] = X ) Z^{[l]} = W^{[l]}a^{[l−1]} + b^{[l]},A^{[l]} = g^{[l]}(Z^{[l]}) (A^{[0]} = X) Z[l]=W[l]a[l1]+b[l]A[l]=g[l](Z[l])(A[0]=X)

这里只能用一个显式 for 循环,𝑙从 1 到𝐿,然后一层接着一层去计算。下一节讲的是避免代码产生 BUG,我所做的其中一件非常重要的工作。

4.4 核对矩阵的维数(Getting your matrix dimensions right)

当实现深度神经网络的时候,其中一个我常用的检查代码是否有错的方法就是拿出一张纸过一遍算法中矩阵的维数。
𝑤的维度是(下一层的维数,前一层的维数),即 w [ l ] : ( n [ l ] , n [ l − 1 ] ) w^{[l]}: (n^{[l]},n^{[l−1]}) w[l]:(n[l],n[l1])
𝑏的维度是(下一层的维数,1),即: b [ l ] : ( n [ l ] , 1 ) b^{[l]}: (n^{[l]},1) b[l]:(n[l],1)
z [ l ] , a [ l ] : ( n [ l ] , 1 ) z^{[l]},a^{[l]}:(n^{[l]}, 1) z[l],a[l]:(n[l],1);
d w [ l ] dw^{[l]} dw[l] w [ l ] w^{[l]} w[l]维度相同, d b [ l ] db^{[l]} db[l] b [ l ] b^{[l]} b[l]维度相同,且w和b向量化维度不变,但𝑧,𝑎以及𝑥的维度会向量化后发生变化。

在这里插入图片描述
向量化后:
Z [ l ] Z^{[l]} Z[l]可以看成由每一个单独的 Z [ l ] Z^{[l]} Z[l]叠加而得到, Z [ l ] = ( z [ l ] [ 1 ] , z [ l ] [ 2 ] , z [ l ] [ 3 ] , … , z [ l ] [ m ] ) Z^{[l]} = (z^{[l][1]},z^{[l][2]},z^{[l][3]},…,z^{[l][m]}) Z[l]=(z[l][1]z[l][2]z[l][3]z[l][m]),𝑚为训练集大小,所以 Z [ l ] Z^{[l]} Z[l]的维度不再是 ( n [ l ] , 1 ) (n^{[l]}, 1) (n[l],1),而是 ( n [ l ] , m ) (n^{[l]}, m) (n[l],m)
A [ l ] : ( n [ l ] , m ) , A [ 0 ] = X = ( n [ l ] , m ) A^{[l]}:(n^{[l]}, m),A^{[0]} = X = (n^{[l]}, m) A[l](n[l],m)A[0]=X=(n[l],m)

在这里插入图片描述
在你做深度神经网络的反向传播时,一定要确认所有的矩阵维数是前后一致的,可以大大提高代码通过率。下一节我们讲为什么深层的网络在很多问题上比浅层的好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3dmax渲染十几个小时怎么办?3dmax怎么多机渲染

当使用3ds Max进行渲染作业时,如果发现单张图像的渲染时间长达十数小时,这可能是由于计算机硬件配置较低或渲染场景过于复杂所致。为了缩短渲染时间并提高效率,我们可以考虑采用多台计算机进行协同渲染。下面,让我们一起探讨如何通…

Webots常用的执行器(Python版)

文章目录 1. RotationalMotor2. LinearMotor3. Brake4. Propeller5. Pen6. LED 1. RotationalMotor # -*- coding: utf-8 -*- """motor_controller controller."""from controller import Robot# 实例化机器人 robot Robot()# 获取基本仿真步长…

【编译原理】Antlr 入门使用

前面文章我们学习了编译器前端的词法和语法分析工具,本篇我们来看看如何借助 Antlr 工具,快速生成词法和语法分析代码。 一、安装 mac 环境: 1)安装 brew install antlr2)配置 classpath (把 Antlr 的 J…

MySQL -- 07_最流行的查询需求分析(一些分组排序查询、开窗函数 dense_rank、distinct 去重函数 等~)

目录 最流行的查询需求分析07演示数据准备的SQL需求演示36、查询每一门课程成绩都在70分以上的姓名、课程名称和分数group by min() in() 函数 37、查询不及格的课程及学生普通表连接查询 38、查询课程编号为01语文且课程成绩在80分以上的学生的学号和姓名普通表连接查询 39、…

使用axios进行前后端数据传输

最近在和朋友合作写一个新的项目,前后端进行了分离,既然是分离的,肯定需要交互,今天这篇文章详细介绍一下数据交互的一种常见方式:使用axios,希望对大家有所帮助。 前端:以LoginPage.vue登录页面为例&…

扬帆出海扩规模,仍是比亚迪未来的发展关键?

又到了新能源车企公布阶段性成果的时期。 日前,乘联会预估2024年3月全国新能源乘用车厂商批发销量82万辆,同比增长33%,环比增长84%。其中,比亚迪继续领跑,3月销量超30万辆,环比增长147.8%,而这…

OpenHarmony实战:瑞芯微RK3566移植案例(上)

本文章是基于瑞芯微RK3566芯片的khdvk_3566b开发板,进行标准系统相关功能的移植,主要包括产品配置添加,内核启动、升级,音频ADM化,Camera,TP,LCD,WIFI,BT,vib…

中科院发布大模型想象增强法IAG,无需外部资源,想想就能变强

在人工智能领域,尤其是自然语言处理(NLP)的子领域——问答系统(QA)中,知识的获取和利用一直是推动技术进步的核心问题。近年来,大语言模型(LLMs)在各种任务中展现出了惊人…

【C语言】扫雷【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、扫雷游戏规则 尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几,则说明该数字旁边的8个位置中有几个雷,如果挖开的是地雷,则会输掉游戏。 二、代码思路&…

Laravel 项目如何运行

如有一个 Laravel 项目,在配置好 PHP 版本和运行环境后,可以直接在项目下直接运行: php artisan serve 来启动你的项目。 通过浏览器查看 当项目运行后,默认的启动端口为 8000,可以通过浏览器来进行查看运行的 Larav…

C++性能测试工具

使用示例main.cpp // g-13 -O3 -stdc17 main.cpp profile.cpp #include <iostream> #include <chrono> #include <stdint.h> #include <mutex> // std::mutex#include "profile.h" #include "profile_rdtsc.h"std::mut…

GlusterFS分布式文件系统

一、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选&#xff0c;根据需要选择使用)组成。没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性 二、GlusterFS特点 2.1 扩展性和高性能 Glu…

Tensorboard以及Transforms初步学习

一.前情提要 1.本文是代码结合知识点&#xff0c;注释即为知识点 2.主要详细讲解Tensorboard以及Transforms代码以及基础知识 3.若想深入学习&#xff0c;建议阅读 P3. Python学习中的两大法宝函数&#xff08;当然也可以用在PyTorch&#xff09;_哔哩哔哩_bilibili 二.简述…

Scala中如何使用Jsoup库处理HTML文档?

在当今互联网时代&#xff0c;数据是互联网应用程序的核心。对于开发者来说&#xff0c;获取并处理数据是日常工作中的重要一环。本文将介绍如何利用Scala中强大的Jsoup库进行网络请求和HTML解析&#xff0c;从而实现爬取京东网站的数据&#xff0c;让我们一起来探索吧&#xf…

云智慧发布对象关系型数据库CloudPanguDB,打破传统技术壁垒

近日&#xff0c;云智慧推出关系型数据库CloudPanguDB&#xff08;中文名称&#xff1a;盘古数据库&#xff09;&#xff0c;旨在通过高兼容性能和创新技术架构&#xff0c;降低企业项目整体运营成本。 无论是处理海量复杂数据&#xff0c;还是构建清晰有序的数据结构关系&…

c++ 谷歌glog日志库使用

效果如图&#xff1a; 本次使用qt环境演示&#xff0c;相关库文件和头文件下载链接&#xff1a;https://download.csdn.net/download/bangtanhui/89108477 将相关库文件和头文件&#xff0c;丢到工程目录下 然后需要在工程pro文件当中引入库文件和头文件&#xff1a; …

创建型模式--2.简单工厂模式【人造恶魔果实工厂1】

1. 工厂模式的特点 在海贼王中&#xff0c;作为原王下七武海之一的多弗朗明哥&#xff0c;可以说是新世界最大的流氓头子&#xff0c;拥有无上的权利和无尽的财富。他既是德雷斯罗萨国王又是地下世界的中介&#xff0c;控制着世界各地的诸多产业&#xff0c;人造恶魔果实工厂就…

Java Web这一路走来

大部分Java应用都是Web或网络应用&#xff0c;MVC框架在Java框架中有着举足轻重的地位&#xff0c;一开始的Web应用并不现在这样子的&#xff0c;一步一步走来&#xff0c;每一步都经历了无数的血和泪的教训&#xff0c;以史为镜可以知兴替。 1. 草莽时代 早期的Java服务端技…

使用ollydbg还原密码程序的密码

前言&#xff1a;我们上次用ida pro破解了程序密码这次我们换个工具来还原程序密码 第一步 和上次一样把找到的程序拖到ollydbg里面 第二步 右键点击查找所有引用字符串 第三步 找到报错代码双击进入 第五步 找到上面的jnz双击将其改成jz 第六步 将所修改的保存点击空白…

FPGA(Verilog)实现uart传输协议传输数据(含仿真)

目录 实现功能&#xff1a; 1.接收uart串行数据&#xff0c;输出并行数据(1byte)。 2.输入并行数据(1byte)&#xff0c;输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 模块封装-port设置 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数…