当前位置:   article > 正文

【深度学习】深度学习基础

【深度学习】深度学习基础

李宏毅深度学习笔记

局部极小值与鞍点

鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。
鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(critical point)。损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
在这里插入图片描述

判断临界值种类的方法
走到临界点的时候,这个临界点到底是局部极小值还是鞍点,是一个值得去探讨的问题。因为如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。

主要是通过计算海森矩阵来判断是哪种临界点(太复杂了看不懂)

但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点。还有一些其他逃离鞍点的方法的运算量都比要算海森矩阵小很多。

从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。

批量(批量梯度下降法和随机梯度下降法)

实际上在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。
在这里插入图片描述
在把数据分为批量的时候,我们还会进行随机打乱。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。

不同批量大小之间对比

  • 批量大小为训练数据的大小,这种使用全批量(full batch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
  • 批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向是曲曲折折的 。

批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次
参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值。

考虑并行运算,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算
损失和梯度花费的时间不一定比使用小批量的计算时间长 。批量大小从 1 到 1000,需要耗费的时间几乎是一样的,因为在实际上 GPU 可以做并行运算,这 1000 笔数据是并行处理的,所以 1000笔数据所花的时间并不是一笔数据的 1000 倍。当然 GPU 并行计算的能力还是存在极限的,当批量大小很大的时候,时间还是会增加的。
因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比较大的
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的。但实际上有噪声的的梯度反而可以帮助训练

批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度降就无法再更新参数了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一
个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1 计算梯度;选到第二个批量的时候,用 L2 计算梯度。假设用 L1 算梯度的时候,梯度是零,就会卡住。但 L2 的函数跟 L1 又不一样,L2 不一定会卡住,可以换下个批量的损失 L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
在这里插入图片描述

总结:
在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距。除非大的批量非常大,才会显示出差距。但是一个回合需要的时间,小的批量比较长,大的批量反而是比较快的,所以从一个回合需要的时间来看,大的批量是较有优势的。 而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
在这里插入图片描述

动量

动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法

引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
在这里插入图片描述
η 是学习率,λ 是前一个方向的权重参数,也是需要调的

自适应学习率

要走到一个临界点其实是比较困难的,多数时候训练在还没有走到临界点的时候就已经停止了。

情景:梯度并没有真的变得很小,但是损失不再下降了,如下图的情况
在这里插入图片描述
学习率决定了更新参数的时候的步伐,学习率设太大,步伐太大就无法慢慢地滑到山谷里面,可以试着把学习率设小一点。

在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。

AdaGrad(Adaptive Gradient)是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。AdaGrad 可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大

RMSprop(Root Mean Squared propagation),同一个参数的同个方向,学习率也是需要动态调整的

Adam (Adaptive moment estimation),是最常用的优化的策略或者优化器(optimizer)。Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了

学习率调度

加上自适应学习率以后,使用AdaGrad 方法优化的结果如图所示。一开始优化的时候很顺利,在左转的时候,有 AdaGrad 以后,可以再继续走下去,走到非常接近终点的位置。走到 BC 段时,因为横轴方向的梯度很小,所以学习率会自动变大,步伐就可以变大,从而不断前进。接下来的问题走到图 中红圈的地方,快走到终点的时候突然“爆炸”了
在这里插入图片描述

在这里插入图片描述

通过学习率调度(learning rate scheduling)可以解决这个问题。之前的学习率调整方法中 η 是一个固定的值,而在学习率调度中 η 跟时间有关。
学习率调度中最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rate annealing)。随着参数的不断更新,让 η 越来越小。

预热,是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。残差网络里面是有预热的,在残差网络里面,学习率先设置成 0.01,再设置成 0.1,并且其论文还特别说明,一开始用 0.1 反而训练不好。除了残差网络,BERT 和 Transformer 的训练也都使用了预热。

分类问题

引入独热向量来表示类

如果有三个类,标签 y 就是一个三维的向量,比如类 1 是 [1, 0, 0]T,类 2 是 [0, 1, 0]T,类3 是 [0, 0, 1]T。如果每个类都用一个独热向量来表示,就没有类 1 跟类 2 比较接近,类 1 跟类 3 比较远的问题。如果用独热向量计算距离的话,类两两之间的距离都是一样的

带有 softmax 的分类
y 是独热向量,所以其里面的值只有 0 跟 1,但是 ˆy 里面有任何值。既然目标只有 0 跟 1,但 ˆy 有任何值,可以先把它归一化到 0 到 1 之间,这样才能跟标签的计算相似度。

一般有两个类的时候,我们不套 softmax,而是直接取 sigmoid。当只有两个类的时候,sigmoid 和 softmax 是等价的。

分类问题损失函数
常用交叉熵,相较于均方误差,交叉熵是被更常用在分类上
在这里插入图片描述
做分类时,选均方误差的时候,如果没有好的优化器,有非常大的可能性会训练不起来。改变损失函数可以改变优化的难度

批量归一化

https://blog.csdn.net/grizzly_whisper/article/details/134250154

批量归一化(Batch Normalization,通常简称为BatchNorm或BN)是一种用于深度神经网络的正则化技术,旨在加速训练并提高模型的稳定性和性能。它的主要思想是对每个批量的输入进行归一化,以使神经网络的每一层保持稳定的统计分布。

批量归一化的主要步骤包括:
1、对每个批量输入进行均值和方差的计算:对于每个批量中的数据,计算其均值和方差,通常是在每个通道上进行的。
2、对输入数据进行标准化:将输入数据减去均值,并除以标准差,以使数据的分布接近标准正态分布。
3、缩放和平移:对标准化后的数据进行线性变换,将其缩放(乘以一个尺度参数)并平移(加上一个偏移参数),以允许模型学习适当的平移和缩放。
4、反向传播:在训练过程中,通过反向传播来更新批量归一化层的参数,以便网络适应数据的分布。

批量归一化的主要优点包括:
1、提高训练速度:通过标准化输入数据,批量归一化有助于加速训练,因为它减少了梯度下降的收敛时间,允许使用更大的学习率。
2、增强模型稳定性:批量归一化可以减少训练过程中的内部协变量偏移,从而提高模型的稳定性和鲁棒性。
3、减少过拟合:批量归一化作为正则化技术之一,可以减少模型的过拟合风险,因为它降低了网络对训练数据中微小变化的敏感性。
4、可以使模型更深:批量归一化使得更深的神经网络更容易训练,因为它减少了梯度消失和梯度爆炸问题。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号