吴恩达【神经网络和深度学习】Week3——浅层神经网络

news2025/1/10 16:36:21

文章目录

  • Shallow Neural Network
    • 1、Neural Networks Overview
    • 2、Neural Network Representation
    • 3、Computing a Neural Network's Output
    • 4、Vectorizing Across Multiple Examples
    • 5、Explanation for Vectorized Implementation
    • 6、Activation Functions
    • 7、Why do you need Non-Linear Activation Functions?
    • 8、Derivatives of activation functions
    • 9、Gradient descent for neural networks
    • 10、Backpropagation intuition(optional)
    • 11、Random Initialization
    • 12、Quiz
    • 13、LAB

文章参考 Coursera吴恩达《神经网络与深度学习》课程笔记(4)-- 浅层神经网络

Shallow Neural Network

1、Neural Networks Overview

上周学过的逻辑回归可以作为神经网络其中的一个节点,神经网络要多一些隐藏层,下图为多了一层hidden layer 的情形。

在这里插入图片描述
这样从计算上来说,神经网络的正向传播和反向传播过程只是比逻辑回归多了一次重复的计算。正向传播过程分成两层,第一层是输入层到隐藏层,用上标[1]来表示:
z [ 1 ] = W [ 1 ] x + b [ 1 ] , a [ 1 ] = σ ( z [ 1 ] ) z^{[1]}=W^{[1]}x +b^{[1]},a^{[1]}=\sigma (z^{[1]}) z[1]=W[1]x+b[1],a[1]=σ(z[1])
第二层是隐藏层到输出层,用上标[2]来表示:
z [ 2 ] = W [ 2 ] x + b [ 2 ] , a [ 2 ] = σ ( z [ 2 ] ) z^{[2]}=W^{[2]}x +b^{[2]},a^{[2]}=\sigma (z^{[2]}) z[2]=W[2]x+b[2],a[2]=σ(z[2])
在写法上值得注意的是,方括号上标[i]表示当前所处的层数;圆括号上标(i)表示第i个样本。
反向传播同理,在计算dw,db时也要计算两次。

2、Neural Network Representation

下面我们以图示的方式来介绍单隐藏层的神经网络结构。如下图所示,单隐藏层神经网络就是典型的浅层(shallow)神经网络。
在这里插入图片描述

在结构上,从左到右,可以分成三层:输入层(Input layer),隐藏层(Hidden layer)和输出层(Output layer)。输入层和输出层,顾名思义,对应着训练样本的输入和输出,很好理解。隐藏层是抽象的非线性的中间层,这也是其被命名为隐藏层的原因。

在写法上,我们通常把输入矩阵X记为 a [ 0 ] a^{[0]} a[0],把隐藏层输出记为 a [ 1 ] a^{[1]} a[1],上标从0开始。下标用来表示第几个神经元,注意下标从1开始。例如 a 1 [ 1 ] a_1^{[1]} a1[1]表示隐藏层第1个神经元, a 1 [ 1 ] a_1^{[1]} a1[1]表示隐藏层第2个神经元,,等等。这样,隐藏层有4个神经元就可以将其输出 a [ 1 ] a^{[1]} a[1]写成矩阵的形式。

关于隐藏层对应的参数问题, W [ 1 ] W^{[1]} W[1]是(4,3), b [ 1 ] b^{[1]} b[1]是(4,1), W [ 2 ] W^{[2]} W[2]是(1,4), b [ 2 ] b^{[2]} b[2]是(1,1)。

这种单隐藏层神经网络也被称为两层神经网络(2 layer NN)。之所以叫两层神经网络是因为,通常我们只会计算隐藏层输出和输出层的输出,输入层是不用计算的。这也是我们把输入层层数上标记为0的原因。

3、Computing a Neural Network’s Output

对于单个神经元节点来说,他负责的功能如下所示,即完成 z 和 a z 和a za的计算。
在这里插入图片描述
对于两层神经网络,就需要完成每一个神经元的计算
在这里插入图片描述
为了提高程序运算速度,我们引入向量化和矩阵运算的思想,将上述表达式转换成矩阵运算的形式 (注意在 W x Wx Wx过程中是利用 w w w的的转置):
在这里插入图片描述
即以下的四个式子:
在这里插入图片描述

4、Vectorizing Across Multiple Examples

上一部分我们只是介绍了单个样本的神经网络正向传播矩阵运算过程。而对于m个训练样本,我们也可以使用矩阵相乘的形式来提高计算效率。
我们需要把 x ( i ) x^{(i)} x(i)依次计算出 y ^ ( i ) \hat y^{(i)} y^(i)
在这里插入图片描述
具体到每一个参数上就是:
在这里插入图片描述
我们先对x进行处理,
X = [ ∣ ∣ … … ∣ x ( 1 ) x ( 2 ) … … x ( m ) ∣ ∣ … … ∣ ] X= \left[ \begin{matrix} | & | & ……| \\ x^{(1)} & x^{(2)} & …… x^{(m)} \\ |&| &……| \\ \end{matrix} \right] X= x(1)x(2)…………x(m)……
之后利用 Z [ 1 ] = W [ 1 ] X + b [ 1 ] Z^{[1]}=W^{[1]}X+b^{[1]} Z[1]=W[1]X+b[1]得到:
Z [ 1 ] = [ ∣ ∣ … … ∣ z [ 1 ] ( 1 ) z [ 1 ] ( 2 ) … … z [ 1 ] ( 3 ) ∣ ∣ … … ∣ ] Z^{[1]}= \left[ \begin{matrix} | & | & ……| \\ z^{[1](1)} & z^{[1](2)} & ……z^{[1](3)} \\ |&| &……| \\ \end{matrix} \right] Z[1]= z[1](1)z[1](2)…………z[1](3)……
然后 A [ 1 ] = σ ( Z [ 1 ] ) A^{[1]}=\sigma ( Z^{[1]}) A[1]=σ(Z[1])
A [ 1 ] = [ ∣ ∣ … … ∣ a [ 1 ] ( 1 ) a [ 1 ] ( 2 ) … … a [ 1 ] ( 3 ) ∣ ∣ … … ∣ ] A^{[1]}= \left[ \begin{matrix} | & | & ……| \\ a^{[1](1)} & a^{[1](2)} & ……a^{[1](3)} \\ |&| &……| \\ \end{matrix} \right] A[1]= a[1](1)a[1](2)…………a[1](3)……
之后 Z [ 2 ] = W [ 2 ] A [ 1 ] + b [ 2 ] , A [ 2 ] = σ ( Z [ 2 ] ) Z^{[2]}=W^{[2]}A^{[1]}+b^{[2]},A^{[2]}=\sigma ( Z^{[2]}) Z[2]=W[2]A[1]+b[2],A[2]=σ(Z[2])

5、Explanation for Vectorized Implementation

Andrew又手写了一下上一节公式的分量化具体推导
在这里插入图片描述

6、Activation Functions

在这里插入图片描述
首先我们来比较sigmoid函数和tanh函数。对于隐藏层的激活函数,一般来说,tanh函数要比sigmoid函数表现更好一些。因为tanh函数的取值范围在[-1,+1]之间,隐藏层的输出被限定在[-1,+1]之间,可以看成是在0值附近分布,均值为0。这样从隐藏层到输出层,数据起到了归一化(均值为0)的效果。因此,隐藏层的激活函数,tanh比sigmoid更好一些。而对于输出层的激活函数,因为二分类问题的输出取值为{0,+1},所以一般会选择sigmoid作为激活函数(但是只有二分类问题的输出层用sigmoid,其他一律用tanh更好)。

观察sigmoid函数和tanh函数,我们发现有这样一个问题,就是当|z|很大的时候,激活函数的斜率(梯度)很小。因此,在这个区域内,梯度下降算法会运行得比较慢。在实际应用中,应尽量避免使z落在这个区域,使|z|尽可能限定在零值附近,从而提高梯度下降算法运算速度。

为了弥补sigmoid函数和tanh函数的这个缺陷,就出现了ReLU激活函数。ReLU激活函数在z大于零时梯度始终为1;在z小于零时梯度始终为0;z等于零时的梯度可以当成1也可以当成0,实际应用中并不影响。对于隐藏层,选择ReLU作为激活函数能够保证z大于零时梯度始终为1,从而提高神经网络梯度下降算法运算速度。但当z小于零时,存在梯度为0的缺点,实际应用中,这个缺点影响不是很大。为了弥补这个缺点,出现了Leaky ReLU激活函数,能够保证z小于零是梯度不为0。
在这里插入图片描述
最后总结一下,如果是分类问题,输出层的激活函数一般会选择sigmoid函数。但是隐藏层的激活函数通常不会选择sigmoid函数,tanh函数的表现会比sigmoid函数好一些。实际应用中,通常会会选择使用ReLU或者Leaky ReLU函数,保证梯度下降速度不会太小。其实,具体选择哪个函数作为激活函数没有一个固定的准确的答案,应该要根据具体实际问题进行验证(validation)。

7、Why do you need Non-Linear Activation Functions?

在这里插入图片描述
经过推导我们发现仍是输入变量x的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是输入x的线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。

另外,如果所有的隐藏层全部使用线性激活函数,只有输出层使用非线性激活函数,那么整个神经网络的结构就类似于一个简单的逻辑回归模型,而失去了神经网络模型本身的优势和价值。

8、Derivatives of activation functions

  1. g ( z ) = 1 1 + e − z g(z)=\frac {1}{1+e^{-z}} g(z)=1+ez1
    d d z g ( z ) = g ( z ) ( 1 − g ( z ) ) = a ( 1 − a ) \frac{ d }{ dz }g(z)=g(z)(1-g(z))=a(1-a) dzdg(z)=g(z)(1g(z))=a(1a)
  2. g ( z ) = t a n h ( z ) = e z − e − z e z + e − z g(z)=tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} g(z)=tanh(z)=ez+ezezez
    d d z g ( z ) = 1 − ( g ( z ) ) 2 \frac{ d }{ dz }g(z)=1-(g(z))^2 dzdg(z)=1(g(z))2
  3. g ( z ) = m a x ( 0 , z ) g(z)=max(0,z) g(z)=max(0,z)
    g ′ ( z ) = { 0 , z < 0 1 , z ≥ 0 g^{'}(z)= \left\{ \begin{array}{ll} 0,z <0 \\ 1, z \geq 0 \end{array} \right. g(z)={0,z<01,z0
  4. g ( z ) = m a x ( 0.01 z , z ) g(z)=max(0.01z,z) g(z)=max(0.01z,z)
    g ′ ( z ) = { 0.01 , z < 0 1 , z ≥ 0 g^{'}(z)= \left\{ \begin{array}{ll} 0.01,z <0 \\ 1, z \geq 0 \end{array} \right. g(z)={0.01,z<01,z0

9、Gradient descent for neural networks

由于涉及到两层网络,反向传播计算要比逻辑回归更复杂,对于单个样本和m个样本的总结如下(最后一层按照sigmoid来用):
在这里插入图片描述
Notice:计算 d Z [ 1 ] dZ^{[1]} dZ[1]用的*不是矩阵乘法,是元素乘法

    # X(2,400),Y(1,400)
    dZ2 = A2 - Y
    dW2 = np.dot(dZ2,A1.T) / m  # (1,4)
    db2 = np.sum(dZ2,axis=1,keepdims = True) / m # (1,1)
    dZ1 = np.dot(W2.T,dZ2)*(1 - np.power(A1, 2)) #(4,400)*(4,400)
    dW1 = np.dot(dZ1,X.T)/m
    db1 = np.sum(dZ1,axis=1,keepdims = True) / m

10、Backpropagation intuition(optional)

使用computation graph进行的具体推导,看总结的公式即可。

11、Random Initialization

在这里插入图片描述
对于这样一个网络,如果把参数全部初始化为0:
W [ 1 ] = [ 0 0 0 0 ] W^{[1]}=\left[ \begin{matrix} 0 & 0 \\ 0 & 0 \\ \end{matrix} \right] W[1]=[0000]
W [ 2 ] = [ 0 0 ] W^{[2]}=\left[ \begin{matrix} 0 & 0 \\ \end{matrix} \right] W[2]=[00]
这样使得隐藏层第一个神经元的输出等于第二个神经元的输出,因此,这样的结果是隐藏层两个神经元对应的权重行向量和每次迭代更新都会得到完全相同的结果,完全对称。这样隐藏层设置多个神经元就没有任何意义了。
解决方法:

W_1 = np.random.randn((2,2))*0.01
b_1 = np.zero((2,1))
W_2 = np.random.randn((1,2))*0.01
b_2 = 0

这里我们将和乘以0.01的目的是尽量使得权重W初始化比较小的值。之所以让W比较小,是因为如果使用sigmoid函数或者tanh函数作为激活函数的话,W比较小,得到的|z|也比较小(靠近零点),而零点区域的梯度比较大,这样能大大提高梯度下降算法的更新速度,尽快找到全局最优解。如果W较大,得到的|z|也比较大,附近曲线平缓,梯度较小,训练过程会慢很多。

当然,如果激活函数是ReLU或者Leaky ReLU函数,则不需要考虑这个问题。但是,如果输出层是sigmoid函数,则对应的权重W最好初始化到比较小的值。

12、Quiz

  1. 在这里插入图片描述
    搞混了,tanh在x=0处的导数是确定的,为1,在0处不可导的是relu,人为设置即可,一般设为0.

13、LAB

Reminder: The general methodology to build a Neural Network is to:

  1. Define the neural network structure ( # of input units, # of hidden units, etc).
  2. Initialize the model’s parameters
  3. Loop:
    • Implement forward propagation
    • Compute loss
    • Implement backward propagation to get the gradients
    • Update parameters (gradient descent)

In practice, you’ll often build helper functions to compute steps 1-3, then merge them into one function called nn_model(). Once you’ve built nn_model() and learned the right parameters, you can make predictions on new data.

最终版本:(按照如下方式拆分函数)

# GRADED FUNCTION: nn_model

def nn_model(X, Y, n_h, num_iterations = 10000, print_cost=False):
    """
    Arguments:
    X -- dataset of shape (2, number of examples)
    Y -- labels of shape (1, number of examples)
    n_h -- size of the hidden layer
    num_iterations -- Number of iterations in gradient descent loop
    print_cost -- if True, print the cost every 1000 iterations
    
    Returns:
    parameters -- parameters learnt by the model. They can then be used to predict.
    """
    
    np.random.seed(3)
    n_x = layer_sizes(X, Y)[0]
    n_y = layer_sizes(X, Y)[2]
    
    # Initialize parameters
    #(≈ 1 line of code)
    # parameters = ...
    # YOUR CODE STARTS HERE
    parameters = initialize_parameters(n_x, n_h, n_y)
    # YOUR CODE ENDS HERE
    
    # Loop (gradient descent)

    for i in range(0, num_iterations):
         
        #(≈ 4 lines of code)
        # Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".
        # A2, cache = ...
        
        # Cost function. Inputs: "A2, Y". Outputs: "cost".
        # cost = ...
 
        # Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".
        # grads = ...
 
        # Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".
        # parameters = ...
        
        # YOUR CODE STARTS HERE
        A2, cache = forward_propagation(X, parameters)
        cost = compute_cost(A2, Y)
        grads = backward_propagation(parameters, cache, X, Y)
        parameters = update_parameters(parameters, grads)
        # YOUR CODE ENDS HERE
        
        # Print the cost every 1000 iterations
        if print_cost and i % 1000 == 0:
            print ("Cost after iteration %i: %f" %(i, cost))

    return parameters

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

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

相关文章

年底固定资产盘点的正确招数

企业年终盘点的必要性 年终盘点的最终目的是摸清资产现状&#xff0c;掌握资产情况&#xff0c;为日常管理和来年采购预算做有力数据支撑&#xff0c;指导我们接下来应该怎么去做&#xff0c;对任何一家企业的管理都有着重要意义。 随着企业规模的扩大&#xff0c;员工和企业设…

SCI论文解读复现【NO.4】FINet:基于合成雾和改进YOLOv5的绝缘子数据集和检测基准(代码已复现)

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文&am…

Redisson获取/释放分布式锁流程中使用的方法以及watchDog机制相关源码分析

Redisson获取/释放分布式锁原理以及watchDog机制相关源码分析使用到的重点类继承结构RedissonLockExpirationEntry获取锁的代码逻辑tryLock()tryLock(long waitTime, long leaseTime, TimeUnit unit)tryAcquire(long waitTime, long leaseTime, TimeUnit unit, long threadId)t…

变量作用域 和 多文件编程

变量作用域 目录&#xff1a;变量作用域概念typedef声明局部变量全局变量静态变量c存储类auto 自动存储类static 静态存储register 注册存储类extern 外部存储类多文件编程多文件编程概念步骤include <> 和 #include ""的区别防止头文件重复包含使用宏定义避免…

编写playbook ansible(5)

目录 题目&#xff1a; 1.按照要求定义以下变量。&#xff08;可以在多个位置下定义实现相应操作即可&#xff09; 2.编写任务模块在node1和node2主机中根据以上变量值创建对应文本文件以及用户名和安装软件包。 题目&#xff1a; 1.按照要求定义以下变量。&#xff08;可以…

2. 向量、向量索引、向量修改、向量运算

课程视频链接&#xff1a;https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频&#xff0c;笔记顺序做了些调整【个人感觉逻辑顺畅】&#xff0c;并删掉一些不重要的内容 系列笔记目录【持续更新】&#xff1a;https://blog.csdn.net/weixin_42214698/category_…

RMQ问题的ST算法实现(详细解析+图片演示+ST模板代码)

文章目录RMQ问题问题引入ST算法倍增ST递推公式查询任意区间的最值代码实现RMQ问题 RMQ&#xff08;Range Minimum/Maximum Query&#xff09;问题&#xff0c;又叫做区间最值问题&#xff0c;即对于长度为n的数列A&#xff0c;回答若干询问RMQ(A,i,j)(i,j<n)&#xff0c;返…

Triumph X 的 I LOVE KARACTER——NFT 系列来啦!

I LOVE KARACTER 是一个由韩国角色组成的元宇宙世界&#xff0c;其主要商业模式&#xff08;BM&#xff09;是一个基于角色的元宇宙模型代理&#xff0c;可以在元宇宙宣传中心使用选定的角色作为模型。 为庆祝与 The Sandbox 的合作&#xff0c;Triumph X 发布了 I LOVE KARACT…

Vivado 综合约束实用命令(更新中……)

引言本文记录一些用于 Vivado 综合约束的实用命令&#xff0c;欢迎补充~本文会适当结合一些特定设计进行解释&#xff0c;并结合相关工程进行具体的综合实现分析&#xff0c;不只是理论知识还有实际操作。演示使用的Vivado 版本&#xff1a;2018.3FPGA芯片型号&#xff1a;xc7a…

基于Java+SpringBoot+vue+elementui药品商城采购系统详细设计实现

基于JavaSpringBootvueelementui药品商城采购系统详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

【vue2】常见指令的用法与示例

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vue指令的声明与使用&#xff08;v-text、v-html、v-on、v-bind、v-for、v-model、v-if、…

C++继承与类的静态成员

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能。这样产生的新类&#xff0c;称派生类&#xff08;或子类&#xff09;&#xff0c;被继承的类…

【多标签文本分类】《基于标签语义注意力的多标签文本分类》

阅读摘要&#xff1a;   为了建立标签的语义信息和文档的内容信息之间的联系并加以利用&#xff0c;文章提出了一种基于标签语义注意力的多标签文本分类(LAbel Semantic Attention Multi-label Classification,简称 LASA)方法。 参考文献&#xff1a;   [1] 基于标签语义注…

【nowcoder】笔试强训Day17

目录 一、选择题 二、编程题 2.1杨辉三角的变形 2.2计算某字符出现次数 一、选择题 1.一个查询语句执行后显示的结果为&#xff1a; 1班 80 2班 75 3班 NULL &#xff0c;则最有可能的查询语句是&#xff08;&#xff09; A.SELECT AVG(成绩) FROM 成绩表 WHERE class<…

WindowManager

1 Window、WindowManager 和 WMS Window 是一个抽象类&#xff0c;具体的实现类为 PhoneWindow&#xff0c;它对 View 进行管理。WindowManager 是一个接口类&#xff0c;继承自接口ViewManager&#xff0c;它是用来管理 Window 的&#xff0c;它的实现类为 WindowManagerImpl…

[Leetcode] 二叉树的深度、平衡二叉树

题目链接&#xff1a;二叉树的最大深度 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/二叉树的最小深度 https://leetcode.cn/problems/minimum-depth-of-binary-tree/平衡二叉树 https://leetcode.cn/problems/balanced-binary-tree1.二叉树的最大…

微信小程序实现上下左右滑动触发联动选项卡、绝对值、事件、parse、stringify、Math、atan、abs、findIndex

文章目录序言1、HTML部分2、JavaScript部分&#xff08;上下左右滑动均触发&#xff09;3、JavaScript部分&#xff08;左右滑动触发&#xff09;4、效果演示序言 最近在写原生微信小程序项目的时候遇到了左右滑动内容更新数据&#xff0c;同时改变tabBar的高亮效果。于是就写了…

B. Camp Schedule(KMPnext数组)

Problem - 1137B - Codeforces 在全国范围内广为人知的春季编程训练营即将开始。因此&#xff0c;所有友好的策展人和教师团队开始组成营地的时间表。经过不断的讨论&#xff0c;他们想出了一个时间表&#xff0c;可以表示为一个二进制字符串&#xff0c;其中第i个符号是 "…

前后端的身份认证

1、Web 开发模式 目前主流的 Web 开发模式有两种&#xff0c;分别是&#xff1a; 基于服务端渲染的传统 Web 开发模式基于前后端分离的新型 Web 开发模式 1.1、服务端渲染的 Web 开发模式 服务端渲染的概念&#xff1a;服务器发送给客户端的 HTML 页面&#xff0c;是在服务器…

【Linux】进程间通信(万字详解) —— 下篇

&#x1f387;Linux&#xff1a; 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持…