深度学习记录

一、基础概念

1、术语

1.1 batch_size、epoch、itration

batch_size决定了模型在训练过程中一次处理的数据量大小。 batch_size对训练的影响:
(1)训练速度:较大的batch_size通常意味着每次迭代处理更多的数据,因此可以减少总的迭代次数,从而加快训练速度。然而,当batch_size过大时,可能会导致GPU或CPU内存不足,从而降低训练速度
(2)收敛性:较小的batch_size通常意味着每次迭代使用更少的数据,因此模型在训练过程中会引入更多的随机性。这种随机性有助于模型跳出局部最优解,从而找到更好的全局最优解。然而,如果batch_size过小,可能会导致模型在训练过程中震荡较大,难以收敛
(3)泛化能力:较小的batch_size有助于模型学习到更多的数据分布信息,从而提高泛化能力。然而,如果batch_size过小,可能会导致模型在训练集上表现良好,但在验证集或测试集上表现较差,即出现过拟合现象。

举例:
一个dataset中有2000张图片,设置batchsize=500。
则一个epoch中的iteration = 2000/500 = 4,
则一个epoch中跑完一整个dataset需要迭代4个batch。

1.2 Pipeline,baseline

Pipeline你土味一点你把它翻译成一条龙服务;专业一点,叫它综合解决方案,就行。
baseline意思是基线,这个概念是作为算法提升的参照物而存在的,相当于一个基础模型,可以以此为基准来比较对模型的改进是否有效。一般是自己算法优化和调参过程中自己和自己比较,目标是越来越好

1.3 Benchmark(基准测试)

是指通过一系列的测试和评估,来衡量计算机硬件或软件性能的过程。一个算法之所以被称为benchmark,是因为它的性能已经被广泛研究,人们对它性能的表现形式、测量方法都非常熟悉,因此可以作为标准方法来衡量其他方法的好坏。
通常指的是一种对算法、模型或方法性能的标准化评估和比较方法。用于衡量和比较不同机器学习算法或模型的表现,以确定哪个方法在特定任务或数据集上表现最佳。

2、深度学习中模型的各种问题

2.1 网络退化

当网络达到一定深度后,模型性能会暂时陷入一个瓶颈很难增加,当网络继续加深,模型在测试集的性能会下降,这就是网络退化

2.2 梯度爆炸和梯度消失

2.3 过拟合和欠拟合

2.4 幻觉

3、模型判别标准

3.1 泛化能力

3.2 量化指标

3.2.1 TP、FP、TN、FN(参考图片理解)、Precision查准率、Recall查全率、

TP(真正例,真的正例):被模型预测为正类的正样本
TN(真反例,真的反例):被模型预测为负类的负样本
FP(假正例,假的正例):被模型预测为正类的负样本
FN(假反例,假的反例):被模型预测为负类的正样本
在这里插入图片描述
Precision:查准率
看查的(预测的)的结果中有百分之多少是正确的
Precision表征的是预测正确的正样本的准确度,查准率等于预测正确的正样本数量/所有预测为正样本数量。Precision越大说明误检的越少,Precision越小说明误检的越多。
在这里插入图片描述
Recall:召回、查全率
看的预测的全不全,占正样本数量(ground truth)的百分比
Recall表征的是预测正确的正样本的覆盖率,查全率等于预测正确的正样本数量/所有正样本的总和,TP+FN实际就是Ground Truth的数量。Recall越大说明漏检的越少,Recall越小说明漏检的越多。
在这里插入图片描述

3.2.2 t-test检验

在这里插入图片描述
显著性水平是数学界约定俗成的,一般有α =0.05,0.025.0.01这三种情况。代表着显著性检验的结论错误率必须低于5%或2.5%或1%(统计学中,通常把在现实世界中发生几率小于5%的事件称之为“不可能事件”)

首先进行levene检验,确定两总体方差是否相等。如果返回结果的p值远大于0.05,那么我们认为两总体具有方差齐性。

stats.levene(A, B)					 

使用ttest_ind函数进行独立样本t检验,函数的最后一个参数为判断两个样本的方差是否相同,如果不同,设为False进行独立样本t检验。得到的p若远大于0.05,认为原假设成立。

stats.ttest_ind(A,B,equal_var=True)				# 进行独立样本t检验
3.2.3 标准误差(Standard Error of the Mean,SEM)

σ 是样本标准差,N 是样本数。
sem=np.std(scores, ddof=1) / np.sqrt(len(scores))
在这里插入图片描述

4、训练损失优化

4.1 正则化

4.1.1 L1 正则化

**L1 正则化:**也称为 Lasso 正则化,它通过在模型的损失函数中增加权重的 L1 范数(权重向量的绝对值之和)来实现正则化。L1 正则化倾向于产生稀疏权重矩阵,即将一些权重推向零,从而实现特征选择的效果。

4.1.2 L2 正则化

L2 正则化:也称为 Ridge 正则化,它通过在模型的损失函数中增加权重的 L2 范数(权重向量的平方和)来实现正则化。L2 正则化会使权重值变得较小,但不会直接导致权重稀疏,因此不具有特征选择的作用,但可以有效地控制模型的复杂度。

4.1.3 Elastic Net 正则化

Elastic Net 正则化:Elastic Net 是 L1 和 L2 正则化的组合,它在损失函数中同时使用 L1 和 L2 范数,可以综合两者的优点。

4.1.4 Dropout

Dropout:Dropout 是一种特殊的正则化技术,通过在训练过程中随机地丢弃(将其权重置为零)网络中的部分神经元,以及它们的连接,来减少神经网络的复杂度。这样可以防止神经元之间的共适应性,从而减少过拟合。
在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。
Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p(伯努利分布)停止工作(失活),这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

4.1.5 早停(Early Stopping)

早停(Early Stopping):早停是一种简单而有效的正则化方法,它在训练过程中监视模型在验证集上的性能,一旦验证集上的性能开始下降,就停止训练。这样可以避免模型在训练集上过拟合。

4.1.6 数据增强(Data Augmentation)

数据增强(Data Augmentation):数据增强是通过对训练数据进行变换来增加数据的多样性,从而减少过拟合的风险。例如,在图像分类任务中可以进行随机裁剪、旋转、翻转等操作来增加训练数据的数量和多样性。

4.1.7 批量归一化(Batch Normalization)

批量归一化(Batch Normalization):批量归一化是一种通过对每个批次的输入进行归一化来加速训练并减少过拟合的技术。它可以使得每一层的输入分布稳定,从而更容易优化模型。

4.1.8 权重衰减(Weight Decay)

权重衰减(Weight Decay):权重衰减是一种通过在损失函数中增加权重的平方和或绝对值之和来实现正则化的技术。它等价于对权重参数进行 L2 正则

5、resnet中的残差连接

随着网络深度的增加,带来了许多问题,梯度消散,梯度爆炸。更好的优化方法,更好的初始化策略,BN层,Relu等各种激活函数,都被用过了,但是仍然不够,改善问题的能力有限,直到残差连接被广泛使用。
好处:主要有两点,一是解决梯度消失的问题,二是解决权重矩阵的退化问题。
深度学习依靠误差的链式反向传播来进行参数更新,如:
在这里插入图片描述
但它有隐患,一旦其中某一个导数很小,多次连乘后梯度可能越来越小,这就是常说的梯度消散,对于深层网络,传到浅层几乎就没了。但是如果使用了残差,每一个导数就加上了一个恒等项1,dh/dx=d(f+x)/dx=1+df/dx。此时就算原来的导数df/dx很小,这时候误差仍然能够有效的反向传播,这就是核心思想。

6、ViT为什么要分patch?

适应transformer模型;简化计算;捕捉小块的局部信息,再通过自注意力机制将局部信息结合。

7、位置编码

one-hot编码
标准位置编码(transformer编码)
旋转位置编码(RoPE)
线性偏差注意力ALiBi

8、 Layer Normalization和Batch Normalization

Layer Normalization的思想与Batch Normalization非常类似,
只是Batch Normalization是在每个神经元对一个mini batch大小的样本进行规范化。例:[16,20,512]对这320个字整体做归一化(16为batch_size,20为句子长度,512为d_model,代表字编码维度);
而Layer Normalization则是在每一层对单个样本的所有神经元节点进行规范化。例:[16,20,512]对这320个字每个字单独做归一化。
Transformer模型一般使用LayerNorm,Transformer模型中的注意力机制会使不同位置的特征之间存在依赖关系。Batchnorm是对一个batch中的所有样本的每个特征进行归一化,这会破坏注意力机制所学习到的位置信息。而LayerNorm是对每个样本的每个特征进行归一化,这样可以保留位置信息。此外,Batchnorm在训练过程中需要计算每个batch的均值和方差,这在Transformer模型中会带来很大的计算开销。而LayerNorm只需要计算每个样本的均值和方差,计算开销更小。

9、transformer多头可以学习到不同维度的特征和信息

为什么可以学习到不同维度的信息呢?
答案是:多头注意力机制的组成是有单个的self attention,由于self attention通过产生QKV矩阵来学习数据特征,那每一个self attention最终会产生一个维度上的输出特征,所以当使用多头注意力机制的时候,模型就可以学习到多维度的特征信息,这使得模型可以从多个维度更好的理解数据。同时多头注意力机制还是并行计算的,这也符合现在硬件架构,提升计算效率。

10、 train.py 、val.py

###train.py
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model.to(device)#表示将构建的模型分配到相应的设备上
mytensor = my_tensor.to(device)#表示将构建的张量分配到相应的设备上
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001, betas=(0.9, 0.98), eps=1e-9)
criterion = nn.CrossEntropyLoss(ignore_index=0)
model.train()

for epoch in range(epoch_num):
	
	for source , target in train_batch_data:
		source, target =source.to(device), source.to(device)
		optimizer.zero_grad()#梯度归零
		#因为训练的过程通常使用mini-batch方法,所以如果不将梯度清零的话,梯度会与上一个batch的数据相关,因此该函数要写在反向传播和梯度下降之前。
		
		output=
		loss = criterion(output, target)
		loss.backward()#反向传播计算每个参数的梯度值
		optimizer.step()#通过梯度下降执行一步参数更新
		#step()函数的作用是执行一次优化步骤,通过梯度下降法来更新参数的值。因为梯度下降是基于梯度的,所以在执行optimizer.step()函数前应先执行loss.backward()函数来计算梯度。

		count += len(src)
        epoch_count_loss.append(loss.item())
        print(f"Epoch {epoch+1}, Iteration {count}\\{len(train_source)} iteration Loss:{loss.item():.4f}")
        print(f"Epoch {epoch+1}, avg_loss={sum(epoch_count_loss)/len(epoch_count_loss):8f}  ")
        torch.save(transformer.state_dict(), f'weights/transformer_{epoch}.pth')
val_batch_gen = batch_generator2(val_source, val_target, source_vocab, target_vocab, batch_size=256, shuffle=True)
transformer.eval()
val_loss = []
for src, tgt in val_batch_gen:
    with torch.no_grad():
        src, tgt = src.to(device), tgt.to(device)
        optimizer.zero_grad()
        #--------------tgt
        #这里验证集伴随着训练集,验证loss是为了验证训练的loss,是否真实,一一对应。
        #用来判断是否过拟合,所以可以给tgt
        output = transformer(src, tgt)
        loss = criterion(output.contiguous().view(-1, test_tgt_voc_size), tgt.contiguous().view(-1))
    val_loss.append(loss.item())
val_loss = sum(val_loss)/len(val_loss)
print(f"val Loss:{val_loss:.8f}")

10.1 model.train()和model.eval()

在这里插入图片描述

10.2 torch.save()和model.state_dict()

torch.save()来保存模型的state_dict
state_dict是Python的字典对象,可用于保存模型参数、超参数以及优化器(torch.optim)的状态信息。需要注意的是,只有具有可学习参数的层(如卷积层、线性层等)才有state_dict。

11、优化方法

11.1 SGD(Stochastic gradient descent)随机梯度下降

SGD通过计算每个样本的梯度来更新参数,并在每次更新中随机选择一个或一批样本。
在这里插入图片描述

优点:
1.低计算成本:SGD每次仅使用一个样本或一批样本进行模型参数更新,相比于使用全部样本的批量梯度下降(BGD),计算成本更低。
2. 随机性导致的避免局部极小值:SGD通过随机选择样本来计算梯度,这使得它具有一定的随机性,有助于避免陷入局部极小值。
缺点:
1.不稳定性:由于SGD每次更新只使用一个样本或一批样本,更新方向可能受噪声的干扰而波动较大。
2. 需要调整学习率:对于SGD,合适的学习率的选择至关重要。学习率过可能导致振荡,学习率过收敛速度缓慢
3. 可能陷入局部极小值:由于SGD的随机特性,可能导致在训练过程中陷入局部极小值,并无法跳出。这也是SGD相对于其他优化方法的一个缺点。

11.2 Momentum 动量法

传统的梯度下降法会存在的问题,即训练轨迹会呈现锯齿状,这无疑会大大延长训练时间。同时,由于存在摆动现象,学习率只能设置的较小,才不会因为步伐太大而偏离最小值。
出现锯齿状的原因是:
1、每一轮迭代使用的训练数据一般是小批量的,没有使用全部的训练数据,因此更新方向会发生锯齿状甚至随机震荡状;
2、某些梯度分量的值比另外一些分量的值要大的多,导致个别分量主导了梯度的更新方向,而期望的梯度更新方向却行进的非常缓慢,这正是Momentum算法要解决的问题.

引入一个动量项,使更新方向在梯度变化较大的维度上具有一定的惯性,从而加速收敛并减少震荡。
该算法将一段时间内的梯度向量进行了加权平均,分别计算得到梯度更新过程中 w 和 b 的大致走向,一定程度上消除了更新过程中的不确定性因素(如摆动现象),使得梯度更新朝着一个越来越明确的方向前进。

11.3学习率衰减(Learning Rate Decay):

随着训练的进行,逐渐减小学习率,有助于在接近损失函数最小值时平稳收敛。

11.4 Adagrad(Adaptive Gradient)自适应梯度\自适应学习率优化算法

自适应学习率的方法,根据参数在每次迭代中的梯度大小自适应地调整学习率。
在这里插入图片描述

这里通过累积梯度平方和r 来调整学习率 η 。ϵ 是一个很小的常数,用于防止分母为零。这样的调整使得学习率对于出现频繁的特征会更小,而对于稀疏特征会更大,有助于提高模型在稀疏数据上的性能。
Adagrad 的核心想法就是,如果一个参数的梯度一直都非常大,那么其对应的学习率就变小一点,防止震荡;若一个参数的梯度一直都非常小,那么这个参数的学习率就变大一点,使得其能够更快地更新,这就是Adagrad算法加快深层神经网络的训练速度的核心。

11.5 RMSprop(Root Mean Square Propagation)

Adagrad 也存在一个问题:随着参数更新的累积,学习率会越来越小,最终导致学习过程提前结束
RMSProp 通过**引入一个衰减系数β (通常设置为 0.9)**来解决这个问题,使得历史信息能够指数级衰减,从而避免了学习率持续下降的问题。
在这里插入图片描述

11.6 Adam

Momentum 善于处理梯度的方向和大小,而 RMSProp 善于调整学习率以应对数据的稀疏性。
Adam 算法的关键在于同时计算梯度的一阶矩(均值)和二阶矩(未中心的方差)的指数移动平均,并对它们进行偏差校正,以确保在训练初期时梯度估计不会偏向于 0。
在这里插入图片描述

12、损失函数

12.1 交叉损失熵

在这里插入图片描述

相对熵(KL散度)

在这里插入图片描述
两个分布差异越大,KL散度越大。实际应用需要两个分布尽可能的相等,于是就需要KL散度尽可能的小。
相对熵和交叉熵的关系:
D(p||q) = H§-H(p,q)

交叉熵

在这里插入图片描述

13、激活函数

13.1 饱和激活函数

趋近于无穷时,导数为0

Sigmoid(Logistic 函数)

在这里插入图片描述
在这里插入图片描述
缺点:
容易造成梯度消失。我们从导函数图像中了解到sigmoid的导数都是小于0.25的,那么在进行反向传播的时候,梯度相乘结果会慢慢的趋向于0。
函数输出不是以 0 为中心的,梯度可能就会向特定方向移动,从而降低权重更新的效率
Sigmoid 函数执行指数运算,计算机运行得较慢,比较消耗计算资源

Tanh

在这里插入图片描述
在这里插入图片描述

13.2 非饱和激活函数

ReLU

在这里插入图片描述
在这里插入图片描述
什么情况下适合使用ReLU?
ReLU解决了梯度消失的问题,当输入值为正时,神经元不会饱和
由于ReLU线性、非饱和的性质,在SGD中能够快速收敛
计算复杂度低,不需要进行指数运算
缺点
与Sigmoid一样,其输出不是以0为中心
Dead ReLU 问题。输入为负时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新
训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,那么这个含有ReLU的神经节点就会死亡,再也不会被激活。所以,要设置一个合适的较小的学习率,来降低这种情况的发生

Leaky Relu 、ELU、PReLU、RReLU

14、注意力机制

14.1 cSE模块(通道维度的SE注意力机制)

参考:https://blog.csdn.net/qq_43456016/article/details/132186624

14.2 sSE模块(空间维度的SE注意力机制

参考:https://blog.csdn.net/qq_43456016/article/details/132186624

14.3 scSE模块(混合维度的SE注意力机制)

参考:https://blog.csdn.net/qq_43456016/article/details/132186624

15、模态对齐技术

参考文章

1、Dropout参考:原文链接:https://blog.csdn.net/PETERPARKERRR/article/details/121888093
2、resnet中的残差连接:https://zhuanlan.zhihu.com/p/42833949
3、batch_size、epoch、itration(原文链接:https://blog.csdn.net/qq_41813454/article/details/138356058)
4、Pipeline,baseline:https://blog.csdn.net/qq_38463737/article/details/120743532
5、位置编码;https://blog.csdn.net/v_JULY_v/article/details/134085503
6、Layer Normalization和Batch Normalization:原文链接:https://blog.csdn.net/linchuhai/article/details/97028488
7、transformer多头可以学习到不同维度的特征和信息:原文链接:https://blog.csdn.net/qq_39333636/article/details/134649271
8、正则化:原文链接:https://blog.csdn.net/a910247/article/details/137604232
9、优化方法:原文链接:https://blog.csdn.net/m0_70911440/article/details/134750670
10、动量法(Momentum)原文链接:https://blog.csdn.net/gaoxueyi551/article/details/105238182
11、Adagrad:原文链接:https://blog.csdn.net/m0_48923489/article/details/136854257
和https://blog.csdn.net/qq_45193872/article/details/124153859
12、Adam:https://blog.csdn.net/m0_48923489/article/details/136863726
13、交叉损失函数:https://blog.csdn.net/chao_shine/article/details/89925762
14、激活函数:https://blog.csdn.net/qq_42691298/article/details/126590726
15、 torch.save()和model.state_dict():https://blog.csdn.net/DeliaPu/article/details/124666157
16、benchmark:https://blog.csdn.net/qq_37791134/article/details/84962058
17、TP、FP、TN、FN、查准、查全:https://blog.csdn.net/dongjinkun/article/details/109899733、https://zhuanlan.zhihu.com/p/498846393
18、t检验:https://blog.csdn.net/qq_40932679/article/details/116980016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值