1、过拟合问题
1、数据增强
对图像进行旋转、翻转、裁剪等操作,创造出更多样的数据样本。
2、正则化
凡是能解决模型泛化误差而不是训练误差的方法,都被称为正则化。模型的泛化误差主要是由模型过拟合引起的,所以正则化的各种方法用于解决模型过拟合的问题。
L1和L2正则化:在损失函数中加上惩罚项,强制模型的权重保持较小,避免权重过大导致过拟合。
这句话来解释:让权重可选的参数范围变小。 按常理,可选参数范围大,会训练出一个泛化能力更强的模型,事实上因为可选参数范围更大,导致模型在训练时会选出一套最符合当前数据的参数,导致泛化能力下降,过拟合。
具体做:
L1正则化:产生一个稀疏权值矩阵,即产生一个系数模型,用于特征选择。让一部分特征的系数缩小为0,从而间接实现特征选择,适用于特征之间有关联的情况。
L2正则化:产生参数值较小的模型,能适应不同的数据集,一定程度上防止过拟合,抗扰动能力强。所有系数都减小,但不会为0,缩小了参数范围,适用于特征之间没有关联的情况。
3、丢弃法(dropout))
(1)首先让所有神经元以一定概率p失活,输入输出的神经元保持不变
(2)让输入X通过部分神经元失活的新网络(如上图)进行前向传播,然后计算损失并把损失反向传播,一小批样本执行完这个过程后,根据梯度下降算法更新参数(w,b)
(3)不断重复这一过程:
①恢复失活的神经元;
②重新让所有神经元以一定概率p失活(这次失活的和上次失活的神经元并不一定相同)
③让输入通过部分神经元失活的新网络进行前向传播,然后计算损失并把损失反向传播,新的一批样本执行完这个过程后,根据梯度下降算法更新参数(w,b);
4、交叉验证
通过将数据集分成多份进行多次训练和验证来评估模型的泛化能力。
2、梯度消失、梯度爆炸
梯度: 一个向量,指的是某一函数在该点处的方向导数沿着该点处取得最大值(在该点处沿着该方向斜率最大)
神经网络基于BP算法进行优化权重参数,即通过损失函数计算的误差通过反向传播对参数进行更新,用的连乘形式的链式法则。
梯度消失: 梯度消失是指在进行反向传播时,梯度会随着层数的增加而指数级地减小,直到几乎消失,导致深层的神经网络参数无法有效更新。这主要是因为使用了像sigmoid和tanh这样的激活函数,它们在输入值较大或较小的情况下,梯度值接近于0。因而通过链式法则,导致靠近输入层的权重更新缓慢甚至停滞。
解决方法:
1、改变激活函数:ReLU(输入大于0,梯度就变成1)及其变种(如Leaky ReLU、Parametric ReLU)在输入值为正时,梯度为1因此不会出现梯度消失的问题。
relu:尽管ReLU函数在正区间内是线性的,但是由于其在负区间的值为0,因此ReLU函数是非线性的。这使得神经网络可以拟合和学习非线性函数。
2、批量归一化(Batch Normalization):这种方法可以在每一层都对输入进行归一化处理,使得值集中在0附近,减少梯度消失和爆炸的可能性。
3、梯度裁剪(Gradient Clipping):这是一种针对梯度爆炸的解决方案,当梯度的值超过某个阈值时,将其限制在该阈值内。
4、残差连接(Residual Connection):在深度神经网络中,通过引入跨层的直接连接,使得梯度可以直接反向传播到浅层,从而缓解梯度消失问题。
梯度爆炸: 梯度爆炸与梯度消失相反,是指梯度随着层数的增加而指数级地增大,导致网络参数更新过大,使得网络模型无法收敛。这通常在深度神经网络中更常见。
3、梯度下降方法
1、SGD 随机梯度下降
核心思想:每次迭代中随机选择一个样本(或一小批样本)来估计梯度。
优点:
1、每次只用一小部分样本估计梯度,计算成本低,计算效率高
2、能够逃离局部最小值
缺点:
1、收敛速度慢
2、需要仔细调整学习率,如果学习率太高会导致模型无法收敛, 学习率太低会导致收敛过程非常缓慢。
Adam 优化器
一种自适应优化器,根据历史信息来调整学习率,对参数的更新进行了归一化处理。
1.自适应调整学习率:Adam 优化器可以根据历史梯度信息来自适应地调节学习率,使得在训练初期使用较大的学习率,能够快速收敛,在训练后期使用较小的学习率,能够更加准确地找到损失函数的最小值。
2.调整动量:Adam 优化器能够调整动量参数,以平衡上一次梯度和当前梯度对参数更新的影响,从而避免过早陷入局部极小值。
3.归一化处理:Adam 优化器对参数的更新进行了归一化处理,使得每个参数的更新都有一个相似的量级,从而提高训练效果。
4.防止过拟合:Adam 优化器结合了L2正则化的思想,在更新时对参数进行正则化,从而防止神经网络过度拟合训练数据。
总体来说,Adam 优化器能够快速、准确地最小化损失函数,提高深度神经网络的训练效果和泛化能力。
Adam算法的核心在于计算每个参数的一阶矩(即梯度的均值)和二阶矩(即梯度的未中心化方差)的指数移动平均,并利用这些矩的估计值来调整每个参数的学习率。
4、归一化方法
N是特征数量,C是channel数量
1、batchnorm
目的:为了解决深层神经网络难以训练的问题。
神经网络难以训练是因为每一层的输入的分布 会 在训练期间随着前一层的参数的变化而变换。所以就要求我们用一个很小的学习率对参数初始化,但是这样做会使训练缓慢。
bn的思想是 对每个隐藏层的输入做一个正态标准化处理,对batch做平均,将一个batch中所有数据的每一个特征的分布都控制在0,1的标准分布中(使激活函数的输入均值为0,方差为1)
2、layernorm
与BatchNorm不一样的,LayerNorm不再在特征层面来进行标准化,而是直接对每条数据本身来进行标准化。
5、卷积、池化
1、卷积
- in_channels(输入通道数)。这是输入数据的高度和宽度维度的大小,对于彩色图像(如RGB),这通常是3。
- out_channels(输出通道数)。这是在卷积操作后希望得到的特征图的数量。
- kernel_size(卷积核大小)。这可以是一个整数或一个元组,指定了卷积核的高度和宽度。例如,kernel_size=3表示一个3x3的卷积核,而kernel_size=(3,5)表示高度为3、宽度为5的卷积核。
- stride(步长)。这是卷积核在输入数据上移动的步长。它可以是一个整数或一个元组,分别对应于水平和垂直步长。如果未指定,默认为1。
- padding(填充)。这决定了在输入数据的边缘补充多少0。这可以是整数或元组,分别对应于上下左右的填充。如果未指定,默认为0。
- dilation(扩张率)。这定义了卷积核处理数据时各值之间的间距。对于标准的卷积操作,扩张率为1。
- groups(分组数)。这是输入通道和输出通道之间的分组连接数。默认值为1,表示所有通道全连接。如果分组数小于输入输出通道数的乘积,那么卷积操作将进行分组卷积。
- bias(偏置)。如果为True,则添加偏置项。默认为True。
- padding_mode(填充模式)。这决定了如何计算边界上的填充
卷积的优点
1、权值共享:每个过滤器对应的输出都可以在输⼊图片的不同区域中使用相同参数卷积得到。
2、局部连接: 每⼀个输出仅依赖于⼀小部分输⼊。
3、池化
作用:
对卷积层输出的特征图进行特征选择和信息的过滤。能够实现对特征图的下采样,从而减少下一层的参数和计算量。并且具有防止过拟合,以及保持特征的不变性(平移、旋转、尺度)的作用。缺点是不存在要学习的参数。
average pooling(不常用)、max pooling求的是每一个维度的窗口内的平均/最大值,global average pooling求的是每一个维度的平均值。
Max Padding的作用:如果在卷积核中提取到某个特征,则其中的最大值很⼤; 如果没有,则其 中的最⼤值很小。
使用Conv替换Pool的优点:Conv的参数是可学习的,可以达到保留更多数据信息和防止过滤掉有用信息的作用。
6、激活函数
作用: 加入非线性因素,提高线性模型的表达能力(没有激活函数的模型,无论多少层都是线性模型)
1、sigmoid
优点:
- 其值域为[0,1],非常适合作为模型的输出函数用于输出一个(0,1)范围内的概率值,可用于将预测概率作为输出的模型,比如用于表示二分类的类别或者用于表示置信度 所以 sigmoid非常适合作为神经网络最后一层的输出 输出各类型概率
不足:
- 从其导数的函数图像上可以看到,其导数的最大值只有0.25,而且当x在[-5,5]的范围外时其导数值就已经几乎接近于0了。这种情况会导致训练过程中神经元处于一种饱和状态,反向传播时其权重几乎得不到更新,从而使得模型变得难以训练,这种现象被称为梯度消失问题。
- 其输出不是以0为中心而是都大于0的(这会降低权重更新的效率),这样下一层的神经元会得到上一层输出的全正信号作为输入,所以Sigmoid激活函数不适合放在神经网络的前面层而一般是放在最后的输出层中使用。
- 需要进行指数运算(计算机运行得较慢),计算量大及计算复杂度高,训练耗时;指数的越大其倒数就越小,容易产生梯度消失。
2、relu
1、ReLU 函数在正输入时是线性的,收敛速度快,计算速度快,同时符合恒等性的特点。当输入为正时,由于导数是1,能够完整传递梯度,不存在梯度消失的问题(梯度饱和问题)。
2、计算速度快。ReLU 函数中只存在线性关系且无论是函数还是其导数都不包含复杂的数学运算,因此它的计算速度比 sigmoid 和 tanh 更快。
3、当输入大于0时,梯度为1,能够有效避免链式求导法则梯度相乘引起的梯度消失和梯度爆炸;计算成本低。
4、它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许基于梯度的学习(尽管在 x=0 的时候,导数是未定义的)。当输入为负值的时候,ReLU 的学习速度可能会变得很慢,甚至使神经元直接无效,因为此时输入小于零而梯度为零,从而其权重无法得到更新,在剩下的训练过程中会一直保持静默。
ReLU不足:
1、ReLU的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,也就是神经元不学习了,这种现象叫做“Dead Neuron”。为了解决ReLU函数这个缺点,在ReLU函数的负半区间引入一个泄露(Leaky)值,所以称为Leaky ReLU函数。
2、与Sigmoid一样,其输出不是以0为中心的(ReLU的输出为0或正数)。
3、ReLU在小于0的时候梯度为零,导致了某些神经元永远被抑制,最终造成特征的学习不充分;这是典型的 Dead ReLU 问题,所以需要改进随机初始化,避免将过多的负数特征送入ReLU。
7、损失函数
1、L2 Loss
这是计算损失函数最基本的损失函数,PyTorch中也将其命名为torch.nn.MSELoss。这依赖于两个向量[预测和真实标签]之间的Euclidean距离(欧氏距离)。它有几个别称分别为
- L2 范数损失
- 最小均方值偏差(LSD)
- 最小均方值误差(LSE)
2、Softmax损失函数
分类的损失函数一般都要求算法的每个标量输出输入概率 p在0至1之间且和为1。但是预测值并非总是如此,我们可以使用Softmax 函数(非线性函数)将预测值变为概率在0至1之间且和为1。因此Softmax 函数也称为归一化指数函数,其公式如下:
3、交叉熵损失函数
交叉熵来源于信息论,用来衡量两个概率分布之间的差异。交叉熵的值越小,说明 Q越接近 P。
交叉熵主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。交叉熵损失函数将模型的输出概率分布与真实标签的概率分布做比较,进而度量模型预测的误差