吴恩达深度学习_第一课(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

相关文章

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499