吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.9-3.11

目录

  • 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)
    • 第三周:浅层神经网络(Shallow neural networks)
      • 3.9 神 经 网 络 的 梯 度 下 降 ( Gradient descent for neural networks)
      • 3.10(选修)直观理解反向传播(Backpropagation intuition)
      • 3.11 随机初始化(Random+Initialization)

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

第三周:浅层神经网络(Shallow neural networks)

3.9 神 经 网 络 的 梯 度 下 降 ( Gradient descent for neural networks)

在这个视频中,我会给你实现反向传播或者说梯度下降算法的方程组,在下一个视频我们会介绍为什么这几个特定的方程是针对你的神经网络实现梯度下降的正确方程。

你的单隐层神经网络会有 W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] W^{[1]},b^{[1]},W^{[2]},b^{[2]} W[1],b[1],W[2],b[2]这些参数,还有个𝑛𝑥表示输入特征的个数, n [ 1 ] n^{[1]} n[1]表示隐藏单元个数, n [ 2 ] n^{[2]} n[2]表示输出单元个数。

矩阵 W [ 1 ] W^{[1]} W[1]的维度就是 ( n [ 1 ] , n [ 0 ] ) (n^{[1]},n^{[0]}) (n[1],n[0]) b [ 1 ] b^{[1]} b[1]就是 n [ 1 ] n^{[1]} n[1]维向量,可以写成 ( n [ 1 ] , 1 ) (n^{[1]}, 1) (n[1],1),就是一个的列向量。 矩阵 W [ 2 ] W^{[2]} W[2]的维度就是 ( n [ 2 ] , n [ 1 ] ) (n^{[2]}, n^{[1]}) (n[2],n[1]) b [ 2 ] b^{[2]} b[2]的维就是 ( n [ 2 ] , 1 ) (n^{[2]}, 1) (n[2],1)维度。

你还有一个神经网络的成本函数,假设你在做二分类任务,那么你的成本函数等于:
Cost function: 公式: J ( W [ 1 ] , b [ 1 ] , W [ 2 ] , b [ 2 ] ) = 1 m ∑ i = 1 m L ( y ^ , y ) J(W[1], b[1], W[2], b[2]) =\frac{1}{m}\sum_{i=1}^{m}L(\hat{y} , y) J(W[1],b[1],W[2],b[2])=m1i=1mL(y^,y)
loss function 和之前做 logistic 回归完全一样。

训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是初始化成全零。当你参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:
在这里插入图片描述
正向传播方程如下(之前讲过):forward propagation:
在这里插入图片描述
反向传播方程如下:back propagation:
在这里插入图片描述
上述是反向传播的步骤,注:这些都是针对所有样本进行过向量化,Y是1 ×m的矩阵;这里 np.sum 是 python 的 numpy 命令,axis=1 表示水平相加求和,keepdims 是防止python 输出那些古怪的秩数(n, ),加上这个确保阵矩阵 d b [ 2 ] db^{[2]} db[2]这个向量输出的维度为(n, 1)这样标准的形式。

目前为止,我们计算的都和 Logistic 回归十分相似,但当你开始计算反向传播时,你需要计算,是隐藏层函数的导数,输出在使用 sigmoid 函数进行二元分类。这里是进行逐个元素乘积,因为 W [ 2 ] T d z [ 2 ] W^{[2]T}dz^{[2]} W[2]Tdz[2] ( z [ 1 ] ) (z[1]) (z[1])这两个都为 ( n [ 1 ] , m ) (n^{[1]}, m) (n[1],m)矩阵;

还有一种防止 python 输出奇怪的秩数,需要显式地调用 reshape 把 np.sum 输出结果写成矩阵形式。

以上就是正向传播的 4 个方程和反向传播的 6 个方程,这里我是直接给出的,在下个视频中,我会讲如何导出反向传播的这 6 个式子的。如果你要实现这些算法,你必须正确执行正向和反向传播运算,你必须能计算所有需要的导数,用梯度下降来学习神经网络的参数;你也可以许多成功的深度学习从业者一样直接实现这个算法,不去了解其中的知识。

3.10(选修)直观理解反向传播(Backpropagation intuition)

这个视频主要是推导反向传播。
下图是逻辑回归的推导:
回想一下逻辑回归的公式(参考公式 3.2、公式 3.5、公式 3.6、公式 3.15) 公式 3.38:
在这里插入图片描述
所以回想当时我们讨论逻辑回归的时候,我们有这个正向传播步骤,其中我们计算𝑧,然后𝑎,然后损失函数𝐿。
在这里插入图片描述
神经网络的计算中,与逻辑回归十分类似,但中间会有多层的计算。下图是一个双层神经网络,有一个输入层,一个隐藏层和一个输出层。

前向传播:
计算 z [ 1 ] z^{[1]} z[1] a [ 1 ] a^{[1]} a[1],再计算 z [ 2 ] z^{[2]} z[2] a [ 2 ] a^{[2]} a[2],最后得到 loss function。
反向传播:
向后推算出 d a [ 2 ] da^{[2]} da[2],然后推算出 d z [ 2 ] dz^{[2]} dz[2],接着推算出 d a [ 1 ] da^{[1]} da[1],然后推算出 d z [ 1 ] dz^{[1]} dz[1]。我们不需要对x求导,因为x是固定的,我们也不是想优化x。向后推算出 d a [ 2 ] da^{[2]} da[2],然后推算出 d z [ 2 ] dz^{[2]} dz[2]的步骤可以合为一步:

公式 3.40: d z [ 2 ] = a [ 2 ] − y dz^{[2]} = a^{[2]} − y dz[2]=a[2]y d W [ 2 ] = d z [ 2 ] a [ 1 ] T dW^{[2]} = dz^{[2]}a^{[1]T} dW[2]=dz[2]a[1]T(注意:逻辑回归中;为什么 a [ 1 ] T a^{[1]T} a[1]T多了个转置:dw中的W(视频里是 W i [ 2 ] W_i^{[2]} Wi[2])是一个列向量,而 W [ 2 ] W^{[2]} W[2]是个行向量,故需要加个转置);

公式 3.41: d b [ 2 ] = d z [ 2 ] db^{[2]} = dz^{[2]} db[2]=dz[2]
公式3.42:KaTeX parse error: Double superscript at position 36: …^{[2]}∗ g^{[1]}'̲(z^{[1]}) 注意:这里的矩阵:W[2]的维度是:( n [ 2 ] , n [ 1 ] n^{[2]},n^{[1]} n[2]n[1])。
z [ 2 ] z^{[2]} z[2] d z [ 2 ] dz^{[2]} dz[2]的维度都是:( n [ 2 ] , 1 n^{[2]},1 n[2],1),如果是二分类,那维度就是(1,1)。

z [ 1 ] z^{[1]} z[1] d z [ 1 ] dz^{[1]} dz[1]的维度都是:( n [ 1 ] , 1 n^{[1]},1 n[1],1)。
证明过程: 见公式 3.42,

其中 W [ 2 ] T d z [ 2 ] W^{[2]T}dz^{[2]} W[2]Tdz[2]维度为:( n [ 1 ] , n [ 2 ] n^{[1]}, n^{[2]} n[1],n[2])、( n [ 2 ] , 1 n^{[2]}, 1 n[2],1)相乘得到( n [ 1 ] , 1 n^{[1]}, 1 n[1],1),和 z [ 1 ] z^{[1]} z[1]维度相同,KaTeX parse error: Double superscript at position 8: g^{[1]}'̲(z^{[1]})的维度为( n [ 1 ] , 1 n^{[1]}, 1 n[1],1),这就变成了两个都是( n [ 1 ] , 1 n^{[1]}, 1 n[1],1)向量逐元素乘积。
实现后向传播有个技巧,就是要保证矩阵的维度相互匹配。最后得到 d W [ 1 ] 和 d b [ 1 ] dW^{[1]}和db^{[1]} dW[1]db[1],公式 3.43: d W [ 1 ] = d z [ 1 ] x T dW^{[1]} = dz^{[1]}x^T dW[1]=dz[1]xT, d b [ 1 ] = d z [ 1 ] db^{[1]} = dz^{[1]} db[1]=dz[1]可以看出 d W [ 1 ] 和 d W [ 2 ] dW^{[1]} 和dW^{[2]} dW[1]dW[2] 非常相似,其中x扮演了 a [ 0 ] a^{[0]} a[0]的角色, x T x^T xT等同于 a [ 0 ] T a^{[0]T} a[0]T
在这里插入图片描述
下图写了主要的推导过程:
在这里插入图片描述
吴恩达老师认为反向传播的推导是机器学习领域最难的数学推导之一,矩阵的导数要用链式法则来求,如果这章内容掌握不了也没大的关系,只要有这种直觉就可以了。还有一点,就是初始化你的神经网络的权重,不要都是 0,而是随机初始化,下一章将详细介绍原因。

3.11 随机初始化(Random+Initialization)

当你训练神经网络时,权重随机初始化是很重要的。对于逻辑回归,把权重初始化为 0当然也是可以的。但是对于一个神经网络,如果你把权重或者参数都初始化为 0,那么梯度下降将不会起作用。

让我们看看这是为什么。有两个输入特征, n [ 0 ] n^{[0]} n[0] = 2,2 个隐藏层单元 n [ 1 ] n^{[1]} n[1]就等于 2。 因此与一个隐藏层相关的矩阵,或者说 W [ 1 ] W^{[1]} W[1]是 22 的矩阵,假设把它初始化为 0 的 22 矩阵, b [ 1 ] b^{[1]} b[1]也等于 [ 00 ] T [0 0]^T [00]T,把偏置项𝑏初始化为 0 是合理的,但是把w初始化为 0 就有问题了。 那这个问题如果按照这样初始化的话,你总是会发现 a 1 [ 1 ] a_1^{[1]} a1[1] a 2 [ 1 ] a_2^{[1]} a2[1]相等,这个激活单元和这个激活单元就会一样。因为两个隐含单元计算同样的函数,当你做反向传播计算时,这会导致 d z 1 [ 1 ] dz_1^{[1]} dz1[1] d z 2 [ 1 ] dz_2^{[1]} dz2[1]也会一样,对称这些隐含单元会初始化得一样,这样输出的权值也会一模一样,由此 W [ 2 ] W^{[2]} W[2]等于[0 0];
在这里插入图片描述
图 3.11.1 但是如果你这样初始化这个神经网络,那么这两个隐含单元就会完全一样,因此他们完全对称,也就意味着计算同样的函数,并且肯定的是最终经过每次训练的迭代,这两个隐含单元仍然是同一个函数,令人困惑。dW会是一个这样的矩阵,每一行有同样的值因此我们做权重更新把权重 W [ 1 ] ⟹ W [ 1 ] − α d W W^{[1]} ⟹ W^{[1]} − αdW W[1]W[1]αdW每次迭代后的𝑊[1],第一行等于第二行。

由此可以推导,如果你把权重都初始化为 0,那么由于隐含单元开始计算同一个函数,所有的隐含单元就会对输出单元有同样的影响。一次迭代后同样的表达式结果仍然是相同的,即隐含单元仍是对称的。通过推导,两次、三次、无论多少次迭代,不管你训练网络多长时间,隐含单元仍然计算的是同样的函数。因此这种情况下超过 1 个隐含单元也没什么意义,因为他们计算同样的东西。当然更大的网络,比如你有 3 个特征,还有相当多的隐含单元。

如果你要初始化成 0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,这 个 问 题 的 解 决 方 法 就 是 随 机 初 始 化 参 数 。 你 应 该 这 么 做 : 把 W [ 1 ] W^{[1]} W[1]设 为
np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如 0.01,这样把它初始化为很小的随机数。然后𝑏没有这个对称的问题(叫做 symmetry breaking problem),所以可以把 b 初始化为 0,因为只要随机初始化W你就有不同的隐含单元计算不同的东西,因此不会有 symmetry breaking 问题了。相似的,对于 W [ 2 ] W^{[2]} W[2]你可以随机初始化, b [ 2 ] b^{[2]} b[2]可以初始化为 0。
在这里插入图片描述
你也许会疑惑,这个常数从哪里来,为什么是 0.01,而不是 100 或者 1000。我们通常倾向于初始化为很小的随机数。因为如果你用 tanh 或者 sigmoid 激活函数,或者说只在输出层有一个 Sigmoid,如果(数值)波动太大,当你计算激活值时 z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]} = W^{[1]}x + b^{[1]} z[1]=W[1]x+b[1], a [ 1 ] = σ ( z [ 1 ] ) = g [ 1 ] ( z [ 1 ] ) a^{[1]} =σ(z^{[1]}) = g^{[1]}(z^{[1]}) a[1]=σ(z[1])=g[1](z[1])如果W很大,z就会很大。z的一些值a就会很大或者很小,因此这种情况下你很可能停在 tanh/sigmoid 函数的平坦的地方(见图 3.8.2),这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢。

回顾一下:如果w很大,那么你很可能最终停在(甚至在训练刚刚开始的时候)z很大的值,这会造成 tanh/Sigmoid 激活函数饱和在龟速的学习上,如果你没有 sigmoid/tanh 激活函数在你整个的神经网络里,就不成问题。但如果你做二分类并且你的输出单元是 Sigmoid函数,那么你不会想让初始参数太大,因此这就是为什么乘上 0.01 或者其他一些小数是合理的尝试。对于 w [ 2 ] w^{[2]} w[2]一样,就是 np.random.randn((1,2)),我猜会是乘以 0.01。

事实上有时有比 0.01 更好的常数,当你训练一个只有一层隐藏层的网络时(这是相对浅的神经网络,没有太多的隐藏层),设为 0.01 可能也可以。但当你训练一个非常非常深的神经网络,你可能会选择一个不同于的常数而不是 0.01。下一节课我们会讨论怎么并且何时去选择一个不同于 0.01 的常数,但是无论如何它通常都会是个相对小的数。

好了,这就是这周的视频。你现在已经知道如何建立一个一层的神经网络了,初始化参数,用前向传播预测,还有计算导数,结合反向传播用在梯度下降中。

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

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

相关文章

C#让标题栏闪烁着动起来的方法

目录 1.API函数FlashWindow (1)添加命名空间 (2)声明DllImport方法 (3)FlashWindow函数 2.P/Invoke 3.再来一个示例 在Windows系统中,当程序在后台运行时,如果某个窗体的提示信…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码,于是复制别人的代码直接运行却报错,得到的结果却是:已解决ModuleNotFoundError: No module named ‘cv2’。(当时心里瞬间凉了一大截,最后顺利解决了,顺…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章:软考 系统架构设计师系列知识点之云原生架构设计理论与实践(7) 所属章节: 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本,对于云原生架构的…

脑部肿瘤检测YOLOV8

脑部肿瘤检测,采用YOLOV8训练得到PT模型,然后转换成ONNX,OPENCV调用,支持C/PYTHON/ANDORID开发脑部肿瘤检测YOLOV8

如何在Plesk面板备份网站

本周有一个客户,购买Hostease的Windows虚拟主机,咨询我们的在线客服,询问Windows虚拟主机Plesk面板是否提供备份功能。我们为用户提供教程,用户很快完成了数据备份。在此,我们分享这个操作教程,希望可以对您…

实践笔记-harbor-01搭建(版本:2.9.0)

harbor搭建 1.下载安装包(版本:2.9.0)2.修改配置文件3.安装4.访问harbor5.可能用得上的命令: 环境:centos7 1.下载安装包(版本:2.9.0) 网盘资源:https://pan.baidu.com/s/1fcoJIa4x…

多微信聚合聊天神器,让你的社交更高效!

对于那些拥有多个微信号的用户来说,频繁地在不同微信号和设备之间切换既麻烦又容易搞混。这时候,一款多微信聚合聊天神器——微信管理系统应运而生,为我们带来了极大的便利与高效。 下面一起来看看它都有哪些功能吧! 1、多微信同…

mybatis plus 的方法有些带填充和逻辑删除,有些又不带

有没有人知道这是怎么个规律。逻辑删除看了下都会自动带上,但是主要是删除和修改方法,有些会按照设置的handler自动填充,有些又不会。有大佬知道吗。

C++ | Leetcode C++题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {map<int,int> a;//提供一对一的hashvector<int> b(2,-1);//用来承载结果&#xff0c;初始化一个大小为2&#xff0c;值为-1的容…

软文推广4大坑,媒介盒子告诉你

今天媒介盒子来和大家聊聊软文推广中的4个坑&#xff0c;让企业在软文推广过程中少走弯路。 一、 没有目的 在如今这个“内容为王”的时代&#xff0c;对软文推广而言&#xff0c;不管其目的性是增强用户参与度、提升品牌认知度还是促成转化等&#xff0c;但总归一个原则&…

AI工作站设计方案:903-多路PCIe3.0的单CPU 学习型AI工作站

多路PCIe3.0的单CPU 学习型AI工作站 一、机箱功能和技术指标&#xff1a; 系统 系统型号 ORI-SR500 主板支持 EEB(12*13)/CEB(12*10.5)/ATX(12*9.6)/Mi cro ATX 前置硬盘 最大支持2个3.5寸1个2.5寸SATA 硬盘2个2.5寸SATA 硬盘 &#xff08;背部&#xff09; 电源类型 C…

探索父进程和子进程

文章目录 通过系统调用查看进程PID父进程、子进程 通过系统调用创建进程-fork初识为什么fork给父进程返回子进程的PID&#xff0c;给子进程返回0fork函数如何做到返回两个值一个变量为什么同时会有两个返回值&#xff1f;bash总结 通过系统调用查看进程PID getpid()函数可以获…

【二叉树】Leetcode 101. 对称二叉树【简单】

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解题思路 判断一棵二叉树是否是轴对称的&#xff0c;可以通过递归方式进行判断。 1、定义一个递归函数isMirr…

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权&#xff1a; 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。 授权&#xff1a;经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…

vue3组合式函数

vue3的组合式函数的作用是封装和复用响应式状态的函数。只能在setup 标签的script标签汇总或者setup函数中使用。 普通的函数只能调用一次&#xff0c;但是组合式函数接受到响应式参数&#xff0c;当该值发生变化时&#xff0c;也会触发相关函数的重新加载。 如下 定义了一个…

Ubuntu如何配置有线网(只显示VPN和代理时)

Step 1: 将managed的值改为true Step 2&#xff1a; 加入如下的字段&#xff0c; Step 3: reboot

阿里云CentOS7安装MySQL8

创建目录 [rootnode1 ~]# mkdir /usr/local/mysql [rootnode1 ~]# cd /usr/local/mysql/ 下载安装包 到MySQL官网查看需要下载的版本&#xff0c;并获取到下载地址 https://downloads.mysql.com/archives/community/下载 [rootnode1 mysql]# wget https://downloads.mysql…

做现货白银,要直面实时行情走势!

现货白银拥有完善的交易机制&#xff0c;它每天的实时行情走势中充满着交易获利的机会&#xff0c;但不见得每一位投资者都有把握住的能力。在各种资讯都触手可及的今天&#xff0c;投资者可以轻松地获得现与货白银相关的交易技巧&#xff0c;然而交易的智慧&#xff0c;则需要…

【供应海力士H58GG6MK6GX037存储芯片

17566722766 长期供应各进口原装存储芯片&#xff1a; H58GG6MK6GX037 K3UH7H70AM-AGCL K3UHAHA0AM-AGCL H9HKNNNFBMAVAR-NEH K54GG6AYRHX263 K3UH7H70BH-AGCL K3UHAHA0BM-AGCL K3LK3K30EM-BGCN K3LK4K40BM-BGCN K3LK7K70BM-BGCP K3LK4K40CM-BGCP H9JKNNNFB3AECR-…

基于java+SpringBoot+Vue的校园台球厅人员与设备管理系统设计与实现

基于javaSpringBootVue的校园台球厅人员与设备管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 校园台球厅人员与设备管理系统是一个为校园…