吴恩达深度学习_第一课(3)《浅层神经网络》

2023-10-08 04:20

本文主要是介绍吴恩达深度学习_第一课(3)《浅层神经网络》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

神经网络概览

符号变化

变量上标是圆括号 (1),(2),(3)…(i) 表示第 i 个样本的数据:x(1),x(2)
变量上标是方括号[1],[2],[3]…[i] 表示第 i 层layer的数据:x[1],x[2]

举个例子:
在这里插入图片描述
x作为输入进入第一层,配合W[1]和b[1]进行计算,得到第一层结果a[1];a[1]作为第二层的输入,配合W[2]和b[2]进行计算,得到第二层结果a[2],并计算本次前向传播的损失函数。

类似于单层逻辑回归中的反向传播需要计算dz和da
在这里插入图片描述
在神经网络中,根据对某层参数w和b的偏导,也有dz[2],da[2],dw[2],db[2]
在这里插入图片描述

神经网络表示

神经元结构

单个结点中包含当前层的w和b,并在本结点内使用激活函数激活输出值。
在这里插入图片描述

神经网络结构

神经网络大体主要有输入层、隐藏层、输出层。
在这里插入图片描述
输入层的向量x,即激活值(第0层作为输入,没有激活函数)可以写成a[0]
隐藏层的激活值为a[1],例如这里的四个节点,分别记作a1[1],a2[1],a3[1],a4[1],类似右边这个4维矩阵的存储形式
隐藏层输出值作为输出层的输入值,激活后的激活值为a[2],等于预测值 y ^ \widehat{y} y
通常输入层(第0层)不计入总层数,因此,上图为2层网络
在这里插入图片描述
这里w[1].shape是(4,3),其中4是因为有4个隐藏单元,3是因为有3个输入特征。

计算神经网络的前向输出

神经元在第1层运算本层激活值的运算:
在这里插入图片描述
具体维度运算:
思想:当某层有多个结点时,纵向堆叠本层结点的运算结果:Z,a
在这里插入图片描述
(4,3)的原因:因为x有三个变量x1,x2,x3,所以w也是(3,1)列向量,为了能点乘需要w.T(1,3),又因为w[1]是w1,w2,w3,w4竖着拼起来组合,所以w[1]是(4,3)
在手写的表示中,W[1]使用大写W,而不是w。已经默认为参数向量转置再拼起来组成的矩阵,不需要类似w加上转置符号写成W[1] T

  • 下图右侧列出本网络两层结构的公式。在这里插入图片描述
    W[1]是内部转置的(4,3)矩阵,最终输出为a[1](4,1)。
    因为第2层只有一个结点,输入4个参数,所以W[2]在内部对w(4,1)转置,得到W[2](1,4),计算得到z[2](1,1),最终输出 y ^ \widehat{y} y =a[2](1,1)

单个样本向下一层传输时,输出尽量调整为纵向形式,也方便下一层直接使用纵向形式。

多个样本尽量将单个样本横着拼成一个矩阵,包括输出也尽量横着拼,类似上周作业里面的样本矩阵 X_train:(12288,209)

多个样本的向量化

列出所有情况及符号说明

若有m个样本,会产生m个预测值 y ^ \widehat{y} y ,下面紫色标记解释a[2](i)的意义:方括号是第2层,圆括号是第i个样本
在这里插入图片描述

向量化处理

在这里插入图片描述

红色输入矩阵X中,将图片所有像素值nx纵向排列形成单个样本的输入值,将不同样本的输入值x(1),x(2)…横向拼成矩阵X

紫色输出矩阵Z[1]代表第1层隐藏层的输出,每一列代表某单个样本在第1层的输出结果,多个样本的输出结果向量z[1](1),z[1](2)横向拼接成矩阵Z

在这里插入图片描述

绿色激活值矩阵A[1]代表第1层隐藏层的激活值输出,每一列a[1](1),a[1](2)…分别代表某单个样本的激活值,每列的激活值横向拼成矩阵A
横向是训练样本training example,纵向是隐藏层单元hidden unit
以线代中的矩阵为例,矩阵中[0][0]位置的值是第1个样本经过第1隐藏层的第1个神经元的激活值;[1][0]位置的值是第1个样本经过第1隐藏层的第2个神经元的激活值;[0][1]位置的值是第2个样本经过第1隐藏层的第1个神经元的激活值…

向量化实现的解释

下图表示在第1隐藏层,各样本输出的向量表示。(别忘了 W[1]里面是已经转置过的参数w向量)
在这里插入图片描述

激活函数

为什么需要激活函数

如果使用线性激活函数,神经网络只是把输入线性组合进行输出,无论多深,都只是进行线性计算,会导致隐藏层失效,成为最简单的逻辑回归函数。

通常使用线性激活函数的地方是输出层

常用激活函数

在之前惯用sigmoid函数的隐藏层和输出层,可以使用别的函数,可以是非线性函数。
在这里插入图片描述
通常使用g(z)表示,并且可以用g[1],g[2]…区别不同层的激活函数。

tanh函数:类似将sigmoid函数简单平移,但是几乎所有场合都比sigmoid更加优越,因为平均值更加接近0,更便于后续运算。tanh与sigmoid共有缺点:当z极大/极小,斜率趋于0,拖慢梯度下降

ReLU函数:在输入是负值的情况下,使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解过拟合。是最常用的激活函数

一些经验:

  • 输出为0 / 1,仅在二元分类,sigmoid函数适合作为输出层激活函数,其他时候几乎不用
  • 不确定隐藏层用哪个,使用ReLU

神经网络的梯度下降

回顾一下大致思想:计算预测值,计算损失函数及成本函数,计算偏导,梯度下降更新参数…循环往复 在这里插入图片描述

分为前向传播,反向传播。正向传播容易分析,反向传播的导数公式推导可看可不看。
在这里插入图片描述
公式推导:类似逻辑回归,需要推导da[2],dz[2],db[2],dw[2],da[1],db[1],dz[1],dw[1]这些导数值。
在这里插入图片描述
左侧da[1],dz[1]的链式推导如下(省略等式右边的偏导符号;没有考虑矩阵,所以没有转置):
在这里插入图片描述

另外的dw[1],db[1] 直接类似 dw[2],db[2]求法即可。
在这里插入图片描述
至于为什么dz[1]中的w[2]要转置,是因为w[2]维度是(n[2],n[1]),dz[2]维度和z[2]维度一致,都是(n[2],m),z[1]维度也是(n[1],m)。因此对w[2]进行转置。(维度原因参考下一周课程)

随机初始化

神经网络中若参数矩阵初始化为0,会导致梯度下降失效

在这里插入图片描述

第一隐藏层的w和b都被初始化为0,会导致计算出来a1和a2相等,翻过来导致两个第一隐藏层单元 对 第二隐藏层输出单元的影响一致,且永远一致,无法体现多个隐藏单元的效果。导致退化为多层单个神经元网络。

对于上面这个网络的正确做法:
w1=np.random.radn((2,2))*0.01
b1=np.zero((2,1))
w2=np.random.radn((1,2))*0.01
b2=0

在这里插入图片描述

使用乘0.01是为了防止梯度消失/梯度爆炸

数据线性可分/不可分

所谓可分是指可以没有误差地分开

简单的说就是如果用一个线性函数可以将两类样本完全分开,就称这些样本是线性可分的。
比如二维空间中的直线、三维空间中的平面以及高维空间中的线性函数

判断是否线性可分:

不同样本集用凸包包起来,判断不同凸包的边是否有交叉。(凸包概念:如果给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集合中所有的点。)

这篇关于吴恩达深度学习_第一课(3)《浅层神经网络》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162653

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实