李宏毅深度学习笔记
局部极小值与鞍点
鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。
鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(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、可以使模型更深:批量归一化使得更深的神经网络更容易训练,因为它减少了梯度消失和梯度爆炸问题。