梯度消失
梯度消失是指在深层神经网络中,随着网络层数的增加,梯度在反向传播过程中逐渐减小,最终变得非常接近于零,导致前面的隐藏层学习缓慢甚至停止更新,从而影响整个网络的性能。
梯度消失问题主要出现在使用某些特定的激活函数(如Sigmoid或Tanh)或者初始化权重过大或过小的情况下。这些激活函数在输入接近饱和区域时,梯度变得非常小,接近于零。在反向传播过程中,梯度会通过乘法传递到前面的层,导致梯度逐渐减小,从而使得前面的隐藏层的权重更新缓慢,甚至无法更新。
梯度消失的解决办法
-
使用适当的激活函数:选择具有更好梯度传递性质的激活函数,如ReLU、Leaky ReLU等,可以缓解梯度消失问题。
-
使用合适的权重初始化方法:权重初始化时避免过大或过小,可以使用Xavier初始化、He初始化等方法来确保合适的权重范围。
-
使用批归一化(Batch Normalization):BatchNormalization的作用是通过规范化的手段,将越来越偏的分布拉回到标准化的分布,使得激活函数的输入值落在激活函数对输入比较敏感的区域,从而使梯度变大,加快学习收敛速度,避免梯度消失的问题。
-
使用残差连接(Residual Connections):残差连接可以通过引入跨层的直接连接,使得梯度能够更轻松地传递到前面的隐藏层,缓解梯度消失问题。
模型不收敛的原因
注意,收敛并不意味着模型达到了全局最优解,有可能会陷入局部最优解。因此,收敛并不保证模型达到了最佳性能,但它表明模型已经趋于稳定,并且进一步训练的效果可能不会显著改善。
超参数的问题
学习率过大或者过小
当学习率过大时,参数的更新幅度会变得非常大,那么模型可能在最优解附近震荡,而无法稳定收敛到最优解,并且大的学习率可能导致参数跳过全局最优解。
当学习率过小时,参数的更新幅度会变得非常小,接近于零。这将导致模型的参数在训练过程中变化缓慢,而损失函数可能会停留在较高的值。
数据集问题
数据集中存在噪声、标签错误、数据不平衡等问题,都可能对模型的训练产生负面影响。
模型问题
模型复杂度过高:如果模型的复杂度过高,容量过大,而训练数据较少,可能导致过拟合现象,模型无法收敛。
Relu、Sigmoid、tanh及Softmax
适用场景
Relu和tanh多用于神经网络的隐藏层,Sigmoid多用于二分类的预测层,Softmax多用于多分类的预测层。
Relu的优点
Relu在大于0的部分梯度为常数,所以不会有梯度消失现象。Relu的导数计算的更快。
Relu在小于0的部分梯度为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。
神经网络中权重共享
卷积神经网络
在卷积层中,使用相同的卷积核对输入图像的不同区域进行卷积操作。这样可以提取图像的局部特征,并共享权重以减少参数数量。
循环神经网络
在循环层中,同一时间步和不同时间步之间的权重矩阵是共享的。这样可以利用先前时间步的信息来影响后续时间步的计算。
pytorch
整体架构
-
Tensor(张量):PyTorch中的Tensor类似于NumPy的多维数组,是PyTorch的核心数据结构。它可以表示输入数据、模型参数和计算结果。
-
Module(模块):Module是PyTorch中构建神经网络模型的基本单元。通过继承
torch.nn.Module
类,可以定义自定义的神经网络层、模型架构和正向传播函数。 -
Autograd(自动求导):Autograd是PyTorch的自动微分引擎,用于计算张量的导数。通过构建计算图并跟踪每个操作的梯度,Autograd可以自动计算梯度并实现反向传播。
-
Optimizer(优化器):PyTorch提供了多种优化器,如SGD、Adam等,用于优化模型的参数。优化器根据计算得到的梯度更新模型的参数,以最小化损失函数
新加一个层需要哪些步骤
-
定义一个新的层类:创建一个继承自
torch.nn.Module
的新类,实现该层的构造函数和正向传播函数。在正向传播函数中,定义该层的操作和计算逻辑。 -
将新层添加到模型中:在模型的构造函数中,实例化新的层对象,并将其作为成员变量添加到模型中。这样,模型就可以在正向传播过程中使用新的层。
卷积是怎么实现
卷积在PyTorch中通过torch.nn.Conv2d
类实现。该类提供了二维卷积操作,可以配置卷积核的大小、步幅、填充等参数。通过将输入张量和卷积核传递给卷积层,可以执行卷积运算并生成输出张量。
多卡机制,数据并行还是模型并行
在PyTorch中,有两种常见的多卡并行训练策略:数据并行和模型并行。
-
数据并行(Data Parallelism):数据并行将训练数据划分为多个小批次,并将每个小批次分配给不同的GPU进行处理。每个GPU上的模型副本独立地处理自己的小批次,并计算梯度。然后,梯度被收集和聚合,并用于更新模型的参数。
-
模型并行(Model Parallelism):模型并行将模型的不同部分分配到不同的GPU上进行处理。每个GPU负责处理模型的一部分,并将结果传递给其他GPU进行下一步计算。模型并行通常在需要处理大型模型的情况下使用。
分类损失为啥用交叉熵
一般情况下,最后一个输出层的节点个数与分类任务的目标数相等。假设最后的节点数为N,那么对于每一个样本,神经网络可以得到一个N维的数组作为输出结果,数组中每一个维度会对应一个类别。在最理想的情况下,如果一个样本属于k,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是神经网络最期望的输出结果,交叉熵就是用来判定实际的输出与期望的输出的接近程度。