吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.1-2.2

目录

  • 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)
    • 第二周:优化算法 (Optimization algorithms)
      • 2.1 Mini-batch 梯度下降(Mini-batch gradient descent)
      • 2.2 理解 mini-batch 梯度下降法(Understanding mini-batch gradient descent)

第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)

第二周:优化算法 (Optimization algorithms)

2.1 Mini-batch 梯度下降(Mini-batch gradient descent)

本周将学习优化算法,这能让你的神经网络运行得更快。机器学习的应用是一个高度依赖经验的过程,伴随着大量迭代的过程,你需要训练诸多模型,才能找到合适的那一个,所以,优化算法能够帮助你快速训练模型。

其中一个难点在于,深度学习没有在大数据领域发挥最大的效果,我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢。因此,你会发现,使用快速的优化算法,使用好用的优化算法能够大大提高你和团队的效率,那么,我们首先来谈谈 mini-batch 梯度下降法。

在这里插入图片描述
你之前学过,向量化能够让你有效地对所有𝑚个样本进行计算,允许你处理整个训练集,而无需某个明确的公式。

所以我们要把训练样本放大巨大的矩阵𝑋当中去,𝑋 = [ x ( 1 ) x ( 2 ) x ( 3 ) … … x ( m ) ) x^{(1)} x^{(2)} x^{(3)} … … x^{(m)}) x(1)x(2)x(3)……x(m))]。𝑌也是如此,𝑌 = [ y ( 1 ) y ( 2 ) y ( 3 ) … … y ( m ) y^{(1)} y^{(2)} y^{(3)} … … y^{(m)} y(1)y(2)y(3)……y(m)]。

所以𝑋的维数是(𝑛𝑥, 𝑚),𝑌的维数是(1, 𝑚),向量化能够让你相对较快地处理所有𝑚个样本。如果𝑚很大的话,处理速度仍然缓慢。比如说,如果𝑚是 500 万或 5000 万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理 500 万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个 500 万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快,准确地说,这是你可以做的一些事情。

你可以把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的 x ( 1 ) x^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000)取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从 x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000),然后再取 1000个样本,以此类推。

接下来我要说一个新的符号,把 x ( 1 ) x^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000)称为 X 1 X^{{1}} X1 x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000)称为 X 2 X^{{2}} X2,如果你的训练样本一共有 500 万个,每个 mini-batch 都有 1000 个样本,也就是说,你有 5000 个mini-batch,因为 5000 乘以 1000 就是 5000 万。

你共有 5000 个 mini-batch,所以最后得到是 X 5000 X^{{5000}} X5000,对𝑌也要进行相同处理,你也要相应地拆分𝑌的训练集,所以这是 Y 1 Y^{{1}} Y1,然后从 y ( 1001 ) y^{(1001)} y(1001) y ( 2000 ) y^{(2000)} y(2000),这个叫 Y 2 Y^{{2}} Y2,一直到 Y 5000 Y^{{5000}} Y5000。mini-batch的数量𝑡组成了 X t X^{{t}} Xt Y t Y^{{t}} Yt,这就是1000个训练样本,包含相应的输入输出对。

在这里插入图片描述
在继续课程之前,先确定一下我的符号,之前我们使用了上角小括号(𝑖)表示训练集里的值,所以 x ( i ) x^{(i)} x(i)是第𝑖个训练样本。我们用了上角中括号[𝑙]来表示神经网络的层数, z [ l ] z^{[l]} z[l]表示神经网络中第𝑙层的𝑧值,我们现在引入了大括号𝑡来代表不同的mini-batch,所以我们有 X t X^{{t}} Xt Y t Y^{{t}} Yt,检查一下自己是否理解无误。
在这里插入图片描述
X t X^{{t}} Xt Y t Y^{{t}} Yt的维数:如果 X 1 X^{{1}} X1是一个有 1000 个样本的训练集,或者说是 1000 个样本的𝑥值,所以维数应该是(𝑛𝑥, 1000), X 2 X^{{2}} X2的维数应该是(𝑛𝑥, 1000),以此类推。因此所有的子集维数都是(𝑛𝑥, 1000),而这些( Y t Y^{{t}} Yt的维数都是(1,1000)。

解释一下这个算法的名称,batch 梯度下降法指的是我们之前讲过的梯度下降法算法,就是同时处理整个训练集,这个名字就是来源于能够同时看到整个 batch 训练集的样本被处理,这个名字不怎么样,但就是这样叫它。

相比之下,mini-batch 梯度下降法,指的是我们在下一张幻灯片中会讲到的算法,你每次同时处理的单个的 mini-batch X t X^{{t}} Xt Y t Y^{{t}} Yt,而不是同时处理全部的𝑋和𝑌训练集。

那么究竟 mini-batch 梯度下降法的原理是什么?在训练集上运行 mini-batch 梯度下降法,你运行 for t=1……5000,因为我们有 5000 个各有 1000 个样本的组,在 for 循环里你要做得基本就是对 X t X^{{t}} Xt Y t Y^{{t}} Yt执行一步梯度下降法。假设你有一个拥有1000个样本的训练集,而且假设你已经很熟悉一次性处理完的方法,你要用向量化去几乎同时处理 1000 个样本。

在这里插入图片描述
首先对输入也就是 X t X^{{t}} Xt,执行前向传播,然后执行 z [ 1 ] = W [ 1 ] X + b [ 1 ] z^{[1]} = W^{[1]}X + b^{[1]} z[1]=W[1]X+b[1],之前我们这里只有,但是现在你正在处理整个训练集,你在处理第一个 mini-batch,在处理 mini-batch 时它变成了 X t X^{{t}} Xt,即 z [ 1 ] = W [ 1 ] X ( t ) + b [ 1 ] z^{[1]} = W^{[1]}X^{(t)} + b^{[1]} z[1]=W[1]X(t)+b[1],然后执行 A [ 1 ] k = g [ 1 ] ( Z [ 1 ] ) A^{[1]k} = g^{[1]}(Z^{[1]}) A[1]k=g[1](Z[1]),之所以用大写的𝑍是因为这是一个向量内涵,以此类推,直到 A [ L ] = g [ L ] ( Z [ L ] ) A^{[L]} = g^{[L]}(Z^{[L]}) A[L]=g[L](Z[L]),这就是你的预测值。注意这里你需要用到一个向量化的执行命令,这个向量化的执行命令,一次性处理 1000 个而不是 500 万个样本。

接下来你要计算损失成本函数𝐽,因为子集规模是 1000, J = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) J =\frac{1}{1000}\sum_{i=1}^l{L(\hat{y}^{(i)},y^{(i)})} J=10001i=1lL(y^(i),y(i)) ,说明一下,这 L ( y ^ ( i ) , y ( i ) ) L(\hat{y}^{(i)},y^{(i)}) L(y^(i),y(i))指的是来自于 mini-batch X t X^{{t}} Xt Y t Y^{{t}} Yt中的样本。

如果你用到了正则化,你也可以使用正则化的术语:

J = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) + λ 2 ∗ 1000 ∑ l ∣ ∣ w [ l ] ∣ ∣ F 2 J =\frac{1}{1000}\sum_{i=1}^l{L(\hat{y}^{(i)},y^{(i)})} + \frac{λ}{2*1000}\sum_{l}{||w^{[l]}||_F^2} J=10001i=1lL(y^(i),y(i))+21000λl∣∣w[l]F2,因为这是一个 mini-batch 的损失,所以我将𝐽损失记为上角标𝑡,放在大括号里( J = 1 1000 ∑ i = 1 l L ( y ^ ( i ) , y ( i ) ) + λ 2 ∗ 1000 ∑ l ∣ ∣ w [ l ] ∣ ∣ F 2 J =\frac{1}{1000}\sum_{i=1}^l{L(\hat{y}^{(i)},y^{(i)})} + \frac{λ}{2*1000}\sum_{l}{||w^{[l]}||_F^2} J=10001i=1lL(y^(i),y(i))+21000λl∣∣w[l]F2)。

你也会注意到,我们做的一切似曾相识,其实跟之前我们执行梯度下降法如出一辙,除了你现在的对象不是𝑋,𝑌,而是 X t X^{{t}} Xt Y t Y^{{t}} Yt。接下来,你执行反向传播来计算𝐽{𝑡}的梯度,你只是使用 X t X^{{t}} Xt Y t Y^{{t}} Yt,然后你更新加权值,𝑊实际上是 W [ l ] W^{[l]} W[l],更新为 W [ l ] : = W [ l ] − α d W [ l ] W^{[l]}: = W^{[l]} − αdW^{[l]} W[l]:=W[l]αdW[l],对𝑏做相同处理, b [ l ] : = b [ l ] − α d b [ l ] b[l]: = b^{[l]} − αdb^{[l]} b[l]:=b[l]αdb[l]

这是使用 mini-batch 梯度下降法训练样本的一步,我写下的代码也可被称为进行“一代”(1 epoch)的训练。一代这个词意味着只是一次遍历了训练集。

在这里插入图片描述
使用 batch 梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用 mini-batch 梯度下降法,一次遍历训练集,能让你做 5000 个梯度下降。当然正常来说你想要多次遍历训练集,还需要为另一个 while 循环设置另一个 for 循环。所以你可以一直处理遍历训练集,直到最后你能收敛到一个合适的精度。

如果你有一个丢失的训练集,mini-batch 梯度下降法比 batch 梯度下降法运行地更快,所以几乎每个研习深度学习的人在训练巨大的数据集时都会用到,下一个视频中,我们将进一步深度讨论 mini-batch 梯度下降法,你也会因此更好地理解它的作用和原理。

2.2 理解 mini-batch 梯度下降法(Understanding mini-batch gradient descent)

在上周视频中,你知道了如何利用 mini-batch 梯度下降法来开始处理训练集和开始梯度下降,即使你只处理了部分训练集,即使你是第一次处理,本视频中,我们将进一步学习如何执行梯度下降法,更好地理解其作用和原理。
在这里插入图片描述
使用 batch 梯度下降法时,每次迭代你都需要历遍整个训练集,可以预期每次迭代成本都会下降,所以如果成本函数𝐽是迭代次数的一个函数,它应该会随着每次迭代而减少,如果𝐽在某次迭代中增加了,那肯定出了问题,也许你的学习率太大。

使用 mini-batch 梯度下降法,如果你作出成本函数在整个过程中的图,则并不是每次迭代都是下降的,特别是在每次迭代中,你要处理的是 X t X^{{t}} Xt Y t Y^{{t}} Yt,如果要作出成本函数 J t J^{{t}} Jt的图,而 J t J^{{t}} Jt只和 X t X^{{t}} Xt, Y t Y^{{t}} Yt有关,也就是每次迭代下你都在训练不同的样本集或者说训练不同的 mini-batch,如果你要作出成本函数𝐽的图,你很可能会看到这样的结果,走向朝下,但有更多的噪声,所以如果你作出 Y t Y^{{t}} Yt的图,因为在训练 mini-batch 梯度下降法时,会经过多代,你可能会看到这样的曲线。没有每次迭代都下降是不要紧的,但走势应该向下,噪声产生的原因在于也许 X t X^{{t}} Xt Y t Y^{{t}} Yt是比较容易计算的 mini-batch,因此成本会低一些。不过也许出于偶然, X 2 X^{{2}} X2 Y 2 Y^{{2}} Y2是比较难运算的 mini-batch,或许你需要一些残缺的样本,这样一来,成本会更高一些,所以才会出现这些摆动,因为你是在运行 mini-batch 梯度下降法作出成本函数图。

你需要决定的变量之一是 mini-batch 的大小,𝑚就是训练集的大小,极端情况下:

如果 mini-batch 的大小等于𝑚,其实就是 batch 梯度下降法,在这种极端情况下,你就有了 mini-batch X 1 X^{{1}} X1 Y 1 Y^{{1}} Y1,并且该 mini-batch 等于整个训练集,所以把 mini-batch 大小设为𝑚可以得到 batch 梯度下降法。

在这里插入图片描述
另一个极端情况,假设 mini-batch 大小为 1,就有了新的算法,叫做随机梯度下降法,每个样本都是独立的 mini-batch,当你看第一个 mini-batch,也就是 X 1 X^{{1}} X1 Y 1 Y^{{1}} Y1,如果 mini-batch 大小为 1,它就是你的第一个训练样本,这就是你的第一个训练样本。接着再看第二个 mini-batch,也就是第二个训练样本,采取梯度下降步骤,然后是第三个训练样本,以此类推,一次只处理一个。
在这里插入图片描述
看在两种极端下成本函数的优化情况,如果这是你想要最小化的成本函数的轮廓,最小值在那里,batch 梯度下降法从某处开始,相对噪声低些,幅度也大一些,你可以继续找最小值。

相反,在随机梯度下降法中,从某一点开始,我们重新选取一个起始点,每次迭代,你只对一个样本进行梯度下降,大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此。

实际上你选择的 mini-batch 大小在二者之间,大小在 1 和𝑚之间,而 1 太小了,𝑚太大了,原因在于如果使用 batch 梯度下降法,mini-batch 的大小为𝑚,每个迭代需要处理大量训练样本,该算法的主要弊端在于特别是在训练样本数量巨大的时候,单次迭代耗时太长。如果训练样本不大,batch 梯度下降法运行地很好。

在这里插入图片描述
相反,如果使用随机梯度下降法,如果你只要处理一个样本,那这个方法很好,这样做没有问题,通过减小学习率,噪声会被改善或有所减小,但随机梯度下降法的一大缺点是,你会失去所有向量化带给你的加速,因为一次性只处理了一个训练样本,这样效率过于低下,所以实践中最好选择不大不小的 mini-batch 尺寸,实际上学习率达到最快。你会发现两个好处,一方面,你得到了大量向量化,上个视频中我们用过的例子中,如果 mini-batch 大小为1000 个样本,你就可以对 1000 个样本向量化,比你一次性处理多个样本快得多。另一方面,你不需要等待整个训练集被处理完就可以开始进行后续工作,再用一下上个视频的数字,每次训练集允许我们采取 5000 个梯度下降步骤,所以实际上一些位于中间的 mini-batch 大小效果最好。

在这里插入图片描述
用 mini-batch 梯度下降法,我们从这里开始,一次迭代这样做,两次,三次,四次,它不会总朝向最小值靠近,但它比随机梯度下降要更持续地靠近最小值的方向,它也不一定在很小的范围内收敛或者波动,如果出现这个问题,可以慢慢减少学习率,我们在下个视频会讲到学习率衰减,也就是如何减小学习率。

如果 mini-batch 大小既不是 1 也不是𝑚,应该取中间值,那应该怎么选择呢?其实是有指导原则的。

首先,如果训练集较小,直接使用 batch 梯度下降法,样本集较小就没必要使用 minibatch 梯度下降法,你可以快速处理整个训练集,所以使用 batch 梯度下降法也很好,这里的少是说小于 2000 个样本,这样比较适合使用 batch 梯度下降法。不然,样本数目较大的话,一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果 minibatch 大小是 2 的𝑛次方,代码会运行地快一些,64 就是 2 的 6 次方,以此类推,128 是 2 的7 次方,256 是 2 的 8 次方,512 是 2 的 9 次方。所以我经常把 mini-batch 大小设成 2 的次方。在上一个视频里,我的 mini-batch 大小设为了 1000,建议你可以试一下 1024,也就是2 的 10 次方。也有 mini-batch 的大小为 1024,不过比较少见,64 到 512 的 mini-batch 比较常见。

最后需要注意的是在你的 mini-batch 中,要确保𝑋{𝑡}和𝑌{𝑡}要符合 CPU/GPU 内存,取决于你的应用方向以及训练集的大小。如果你处理的 mini-batch 和 CPU/GPU 内存不相符,不管你用什么方法处理数据,你会注意到算法的表现急转直下变得惨不忍睹,所以我希望你对一般人们使用的 mini-batch 大小有一个直观了解。事实上 mini-batch 大小是另一个重要的变量,你需要做一个快速尝试,才能找到能够最有效地减少成本函数的那个,我一般会尝试几个不同的值,几个不同的 2 次方,然后看能否找到一个让梯度下降优化算法最高效的大小。希望这些能够指导你如何开始找到这一数值。

你学会了如何执行 mini-batch 梯度下降,令算法运行得更快,特别是在训练样本数目较大的情况下。不过还有个更高效的算法,比梯度下降法和 mini-batch 梯度下降法都要高效的多,我们在接下来的视频中将为大家一一讲解。

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

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

相关文章

【科研】常用的实验结果评价指标(2) —— MAE 是什么? !

了解MAE 提示:先说概念,后续再陆续上代码 文章目录 了解MAE前言一、MAE 基本概念1. MAE 是什么?2. MAE 的起源3. MAE 的计算公式 二、MAE的适用场景是什么?三、MAE 的劣势,或 不适用于那些场景或者数据?四、…

一个小调整,竟然让交换机、路由器的CPU占用率降低了50%

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 在信息时代下,不仅仅在网络工程领域,高CPU占用率都是一个非常常见的问题,…

JavaScript中带日期的操作

当我们把日期转换为Number类型的时候,就会变成时间戳(毫秒) const future new Date(2037, 10, 19, 15, 23); console.log(Number(future)); // console.log(future); //与上行代码等效● 所以我们就可以利用时间戳去做点东西,例…

Spring整合其他技术

文章目录 Spring整合mybatis思路分析Mybatis程序核心对象分析整合Mybatis 代码实现 Spring整合Junit修改成警告 Spring整合mybatis 思路分析 Mybatis程序核心对象分析 上面图片是mybatis的代码,上述有三个对象,分别是sqlSessionFactory,sqlS…

7nm项目之模块实现——02 Placeopt分析

一、Log需要看什么 1.log最后的error 注意:warnning暂时可以不用过于关注,如果特别的warning出现问题,在其他方面也会体现 2.run time 在大型项目实际开发中,周期一般较长,可能几天过这几周,所以这就需要…

Linux - make与makefile

文章目录 什么是make和makefile如何使用依赖关系 和 依赖方法伪目标 写个程序-进度条换行和回车的区别 什么是make和makefile make是一个命令 makefile是一个文件 这就是make和makefile的本质 make和 ll , pwd ,su 一样都是命令 makefile和 test , test.c 一样都是…

【408精华知识】计算机系统结构

感觉教材和网络上对于计算机系统的结构描述都比较模糊,我自己对其进行了总结,并且画出图,不过因为学习的还是不够深入和全面,有的地方肯定是有问题的,烦请大家批评指正,我会进行修改~ 文章目录 零、结构图总…

比大小(打擂台)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明比较大小函数max; int max(int a, int b);int main() {//初始化变量值&#xff1b;int i, n, m, a[10];//填充数组&#xff1b;printf("请输入10个数…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

C++基础语法之数组

一、一维数组 在C中&#xff0c;一维数组是一系列具有相同数据类型的元素的集合。它们在内存中是连续存储的&#xff0c;可以通过索引访问每个元素。 一维数组的声明形式如下&#xff1a; 数据类型 数组名[常量表达式] 例如&#xff1a; // 声明一个能存储10个整数的数组 in…

振弦式应变计的灵敏系数k范围探讨

振弦式应变计是一种广泛应用于工程结构健康监测的重要设备&#xff0c;其灵敏系数k是衡量其性能的关键指标。本文将探讨振弦式应变计的灵敏系数k的一般范围&#xff0c;并分析影响灵敏系数的因素。 一、振弦式应变计的工作原理 振弦式应变计通过测量振弦在受力作用下的振动频率…

创建短链性能测试

压测条件 创建短链接参数固定&#xff0c;拆分了两个不同的接口进行压测。 线程池组属性如下所示&#xff1a; 完整的jmx文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <jmeterTestPlan version"1.2" properties"…