当前位置: 首页 > article >正文

有效运作神经网络

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。

文章目录

  • 训练集、验证集、测试集
  • 偏差、方差
  • 正则化
    • 正则化参数
    • 为什么正则化可以减少过拟合
    • Dropout正则化
      • Inverted Dropout
      • 其他的正则化方法
        • 数据增广
        • Early stopping
  • 归一化
  • 梯度消失与梯度爆炸
    • 产生原因
    • 权重初始化
      • He初始化
      • Xavier初始化
  • 梯度检验
    • 梯度的数值逼近
    • 步骤(如上图)
    • 一些建议

训练集、验证集、测试集

  • 训练集:用于训练模型的数据集。通过学习训练集中的数据特征和标签之间的关系,来调整自身的参数,以尽可能准确地对数据进行拟合。
  • 验证集:在模型训练过程中对模型进行评估和调整。在训练过程中,使用验证集可以监控模型的性能,如准确率、损失函数值,根据验证集上的表现来选择最优的模型参数。
  • 测试集:在模型训练和调优完成后,最终评估模型的性能。是一组完全独立于训练集和验证集的数据,测试模型在实际应用中的泛化能力和准确性,判断模型是否能够很好地处理未见过的数据。

一般来说,数据集按照6:2:2或7:2:1的比例划分为训练集、验证集和测试集。对于数据量非常大的数据集,验证集和测试集的比例可以降低,比如95:2.5:2.5;而对于数据量较小的数据集,可以使用上述的原则。

有的时候会遇到这样的场景:训练一个识别猫的模型,训练的时候使用的训练集是大小固定,分辨率较低的图片,但是在测试的时候使用的验证集、测试集是随机大小的,分辨率比较高的图片。这两类图片是不同的,应该确保训练集和验证机、测试集的数据是同一个分布

在训练集上训练数据,尝试使用不同的模型框架;在验证集上评估这些模型,迭代选出适用的模型;最后测试。

偏差、方差

偏差是模型的预测值(期望输出)与真实值之间的差异。高偏差意味着模型过于简单,不能很好地捕捉数据中的复杂模式和特征,导致模型在训练集和测试集上的表现都较差,出现欠拟合现象。
方差描述的是模型对于给定数据集的预测结果的离散程度。如果模型在不同的训练数据集上训练后,得到的模型参数差异很大,导致预测结果波动较大,那么这个模型的方差就很高。高方差通常是因为模型过于复杂,对训练数据中的噪声和特定样本的特征过度拟合,在训练集上表现很好,但在测试集等新数据上表现不佳,出现过拟合现象。

偏差反映的是模型本身的拟合能力。从数学角度看,偏差衡量的是模型的期望预测与真实值之间的偏离程度;方差衡量的是模型预测结果的稳定性。
在这里插入图片描述

  • 左图 - high bias(高偏差):也叫欠拟合。模型过于简单,无法很好地捕捉数据中的规律和特征,导致在训练集上的表现就很差,对数据的拟合程度低。图中用一条简单的直线去划分两类数据点(圆圈和叉叉),明显没有很好地分开数据,在训练集上的误差就较大,更不用说在新数据上的表现了。
  • 中图 - just right(正好):也叫适度拟合。模型复杂度适中,能够较好地学习到数据中的模式,既不会过于简单而无法拟合数据,也不会过于复杂而只对训练数据表现好。图中用一条曲线比较合理地划分了两类数据点,在训练集上有较好的拟合效果,同时也有较好的泛化能力,在新数据上也能有不错的表现。
  • 右图 - high variance(高方差):也叫过拟合。模型过于复杂,把训练数据中的一些偶然的特征也学习了进去,导致在训练集上表现非常好,几乎能完美拟合训练数据,但在新数据上表现很差,泛化能力弱。图中曲线过度地围绕着数据点,甚至把一些可能是误差的数据点也考虑进去了,虽然在训练集上误差极小,但在新数据上难以有好的表现。

在二维中可以直接可视化偏差和方差。但是在更多维中描述较为困难,使用几个指标来描述偏差和方差。
在这里插入图片描述
识别一张猫的图片,假设人的识别率是0%的错误。

  • 在训练集和测试集上错误率分别为1%和11%:说明模型对训练集过拟合,对新的数据表现较差,称为高方差。
  • 在训练集和测试集上错误率分别为15%和16%:说明模型对训练集欠拟合,对新的数据表现也较差,称为高偏差。
  • 在训练集和测试集上错误率分别为15%和30%:说明模型对训练集欠拟合,但是对新的数据表现更差,称为高偏差和高方差。
  • 在训练集和测试集上错误率分别为0.5%和1%:说明模型对训练集和新的数据表现均较好,称为低偏差和低方差。

在这里插入图片描述

图中训练集的紫色部分表现为高方差和高偏差。两边部分几乎是一条直线,欠拟合,表现为高偏差,但是中间部分很灵活,对一些可能的错误点过拟合,(在新的数据上表现较差)表现为高方差。

对于高偏差的问题,尝试选择一个新的网络、花费更多时间去训练或者尝试更先进的优化算法,一直到解决这个问题。当偏差降低到可以接受的范围时,查看验证集性能,检查方差是否有问题。若方差较高,需要更多的数据去验证或寻找更合适的神经网络,但是有的时候并不能找到更多的数据的时候,可以采用正则化来减少过拟合。做到具体问题具体分析,比如算法存在高偏差的问题,采用更多的数据去训练作用则效果不大。

在这里插入图片描述

正则化

正则化参数

在模型的损失函数中添加一个惩罚项,对模型的参数进行约束。

以线性回归模型为例,其原始损失函数为 L ( w , b ) = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2 L(w,b)=n1i=1n(yiy^i)2,添加正则化项后变为 L ( w , b ) = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ 2 m R ( w ) L(w,b)=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^2+ \frac{\lambda}{2m} R(w) L(w,b)=n1i=1n(yiy^i)2+2mλR(w)。其中 λ \lambda λ是正则化系数,用于控制正则化的强度。 2 m 2m 2m是样本数量的2倍,数字2主要是为了求导的方便。 R ( w ) R(w) R(w)是正则化项,它对模型参数 w w w进行约束,使模型参数不会过大,避免模型过于复杂而出现过拟合。

正则化项取 R ( w ) = ∑ j = 1 m w j 2 = w T w R(w)=\sum_{j=1}^{m}w_{j}^{2}=w^Tw R(w)=j=1mwj2=wTw称为L2正则化(岭回归),对模型参数的平方求和。L2正则化使得 参数趋于较小的值,但不会使参数变为0,通过减小参数的量级来降低模型的复杂度,防止过拟合。

L2距离(欧几里得距离)

  • 在二维空间中:假设有两个点 P ( x 1 , y 1 ) P(x_1,y_1) P(x1,y1) Q ( x 2 , y 2 ) Q(x_2,y_2) Q(x2,y2),它们之间的L2距离 d ( P , Q ) d(P,Q) d(P,Q)计算公式为 d ( P , Q ) = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 d(P,Q)=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2} d(P,Q)=(x2x1)2+(y2y1)2 。几何意义是两点之间直线段的长度。
  • 在n 维空间中:对于两个 n 维向量 x = ( x 1 , x 2 , ⋯   , x n ) \mathbf{x}=(x_1,x_2,\cdots,x_n) x=(x1,x2,,xn) y = ( y 1 , y 2 , ⋯   , y n ) \mathbf{y}=(y_1,y_2,\cdots,y_n) y=(y1,y2,,yn),它们之间的L2距离 d ( x , y ) d(\mathbf{x},\mathbf{y}) d(x,y)的计算公式为 d ( x , y ) = ∑ i = 1 n ( y i − x i ) 2 d(\mathbf{x},\mathbf{y})=\sqrt{\sum_{i = 1}^{n}(y_i - x_i)^2} d(x,y)=i=1n(yixi)2

正则化系数 λ \lambda λ是一个超参数,需要通过验证集等方法进行调整。 λ \lambda λ值过小,正则化效果不明显,无法有效防止过拟合; λ \lambda λ值过大,会过度约束模型参数,导致模型过于简单,出现欠拟合。采用交叉验证等方法,在不同的 λ \lambda λ取值下训练模型并在验证集上评估性能指标,选择使验证集性能最优的 λ \lambda λ值。

反向传播的时候,不要忘记对惩罚项的求导。
d w = ( 原损失函数求导的结果 ) + λ m w [ l ] \mathbf{d}w=(原损失函数求导的结果) + \frac{\lambda}{m}w^{[l]} dw=(原损失函数求导的结果)+mλw[l] w [ l ] : = w [ l ] − α d w [ l ] w^{[l]}:=w^{[l]}-\alpha\mathbf{d}w^{[l]} w[l]:=w[l]αdw[l]

为什么正则化可以减少过拟合

在这里插入图片描述
对于该损失函数,若 λ \lambda λ足够大,求导后的 d w \mathbf{d}w dw也大,导致梯度下降的 w w w更小,当接近于0时,相当于将神经网络的多个隐藏单元权重设置为0,整个大的神经网络简化成一个小的神经网络,导致网络欠拟合,更接近于高偏差的神经网络。在调整 λ \lambda λ的过程中,总有个值让神经网络适度拟合。

实际上不是隐藏单元消失了,而是其权重变的更小。
在这里插入图片描述

Dropout正则化

在这里插入图片描述
对于左边的过拟合的神经网络,采用Dropout正则化,在模型训练过程中,Dropout以一定的概率随机 丢弃(设置为 0)神经网络中隐藏层和输入层的一些神经元。右图中,假设有遍历每一层的神经元,假设每个神经元有50%的概率被丢弃。

Inverted Dropout

在普通Dropout中,训练时以概率 p p p随机将神经元的输出设置为0,测试时所有神经元都正常工作,这就导致训练和测试阶段网络的行为存在差异,测试时需要对网络输出进行额外的缩放调整来匹配训练时的预期输出。

反向随机失活(Inverted Dropout)在训练阶段对激活值进行缩放补偿,使测试阶段无需额外调整。具体做法是:在训练时,对于每个神经元,以概率 p p p将其输出设置为0,同时将保留(未被丢弃)的神经元输出除以 1 − p 1 - p 1p 。这样做的效果是,训练阶段神经元输出的期望值与测试阶段所有神经元都正常工作时的期望值保持一致。

假设一个神经元在未应用Dropout时的输出为 x x x ,Dropout概率为 p = 0.5 p = 0.5 p=0.5

  • 普通Dropout训练:该神经元有 0.5 0.5 0.5的概率输出为0, 0.5 0.5 0.5的概率输出为 x x x,其输出的期望值为 0.5 × 0 + 0.5 × x = 0.5 x 0.5\times0 + 0.5\times x = 0.5x 0.5×0+0.5×x=0.5x 。测试时,所有神经元正常工作,输出为 x x x ,因此测试时需要将训练阶段的输出乘以2来匹配测试时的输出。
  • inverted dropout训练:该神经元有 0.5 0.5 0.5的概率输出为0, 0.5 0.5 0.5的概率输出为 x 1 − 0.5 = 2 x \frac{x}{1 - 0.5}=2x 10.5x=2x ,其输出的期望值为 0.5 × 0 + 0.5 × 2 x = x 0.5\times0 + 0.5\times2x = x 0.5×0+0.5×2x=x 。测试时,所有神经元正常工作,输出同样为 x x x ,无需额外调整。

每一层的概率(keep-prob)可以设置为不同的值,1表示全部保留。如果担心某些层比其他层更容易发生拟合,可以将该层的keep-prob设置的比其他层更低,但这样做缺点是需要使用交叉验证搜寻更多的超参数。

Dropout正则化的缺点是损失函数 J J J不再有明确的定义,从而不能很好地绘制损失函数图像。

其他的正则化方法

数据增广

如果想要通过扩增训练数据来解决过拟合问题,但是扩增数据代价较高,这个时候,可以在原有的数据集上添加改变后的数据集来增加训练集(数据增广)。比如对图片进行反转或者裁剪;对文字旋转或者变形。

在这里插入图片描述

Early stopping

在模型训练过程中,模型在训练集上的损失通常会不断降低,而在验证集上的损失会先下降,到达某一时刻后可能开始上升,这表明模型开始过拟合训练数据。Early stopping 会在训练过程中持续监控验证集上的性能指标,当验证集上的性能指标出现过拟合时,就停止训练。
在这里插入图片描述

Early stopping提前停止训练可能导致模型没有充分学习到数据中的所有有用信息,没有达到全局最优解,使得模型性能未达到理论上的最佳状态。

归一化

  • 第一步,零均值化 μ = 1 m ∑ i = 1 m x ( i ) ,   x : = x − μ \mu=\frac{1}{m}\sum_{i=1}^{m}x^{(i)},\ x:=x-\mu μ=m1i=1mx(i), x:=xμ。将数据的均值调整为 0 。有助于使数据在特征空间中分布更加对称,减少数据的偏置影响。
  • 第二步,方差归一化 σ 2 = 1 m ∑ i = 1 m x ( i ) 2 ,   x / = σ 2 \sigma^2=\frac{1}{m}\sum_{i=1}^{m}x^{(i)^{2}},\ x/=\sigma^2 σ2=m1i=1mx(i)2, x/=σ2。调整数据的方差,使不同特征的方差保持一致。如果不同特征的方差差异较大,那么方差大的特征可能会在模型训练中占据主导地位,而方差小的特征的作用可能被忽视。
    在这里插入图片描述

如果没有归一化,损失函数图像像一个狭长的碗,在这样的图上运行梯度下降法,在更新参数时步伐不一致,可能导致在某些方向上过度更新,而在其他方向上更新不足,为了照顾不同的方向,学习率需设置的较小,从而需要更多的迭代次数才能收敛到最优解,增加了训练时间和计算成本;归一化使得损失函数更加对称,算法可以更有效地调整参数,学习率可以设置的更大,花费更低的成本达到最优解。

在这里插入图片描述

梯度消失与梯度爆炸

  • 梯度消失:在深度神经网络的反向传播过程中,梯度值随着网络层数的增加而逐渐变小,趋近于零。使得网络中靠近输入层的神经元的参数更新非常缓慢,甚至几乎不更新,导致模型无法学习到足够的信息,难以收敛到最优解。
  • 梯度爆炸:与梯度消失相反,在反向传播过程中,梯度值随着网络层数的增加而变得越来越大,导致参数更新步长过大,使得模型无法稳定收敛,甚至可能导致参数值变为NaN(非数值)。

产生原因

  • 激活函数选择:如果使用Sigmoid或Tanh等激活函数,它们的导数取值范围是有限的,Sigmoid函数的导数在输入值较大或较小时趋近于0。在深度网络中,经过多层的链式求导后,梯度会不断相乘,导致梯度值变得极小,从而引发梯度消失问题。
  • 网络层数过深:随着网络层数的增加,反向传播时梯度需要经过多次乘法运算,这使得梯度值容易出现指数级的衰减(梯度消失)或增长(梯度爆炸)。
  • 参数初始化不当:如果初始参数设置过大,在反向传播过程中可能会导致梯度爆炸;如果初始参数设置过小,则可能加剧梯度消失问题。

权重初始化

He初始化

当使用ReLU激活函数时,传统的初始化方法(如随机初始化)可能会导致某些神经元在训练初期就处于“死亡”状态(即输入小于0,输出恒为0),或者使得梯度在反向传播过程中迅速消失或爆炸。

He初始化是根据输入层的神经元数量来调整初始化参数的方差,使得每一层的输出方差在正向传播过程中保持大致不变,同时在反向传播时梯度的方差也能保持稳定,从而避免梯度消失和梯度爆炸问题,加速模型的收敛。

对于一个具有 n i n p u t (简写为 n i n ) n_{input}(简写为n_{in}) ninput(简写为nin个输入神经元的全连接层,其权重参数 W W W的每个元素 w i j w_{ij} wij按照以下方式进行初始化:

  • 从均值为0,标准差为 σ = 2 n i n \sigma = \sqrt{\frac{2}{n_{in}}} σ=nin2 的正态分布中随机采样得到,即 w i j ∼ N ( 0 , 2 n i n ) w_{ij} \sim N(0, \frac{2}{n_{in}}) wijN(0,nin2)
  • 也可以从均匀分布 U ( − 6 n i n , 6 n i n ) U(-\sqrt{\frac{6}{n_{in}}}, \sqrt{\frac{6}{n_{in}}}) U(nin6 ,nin6 )中进行采样。

对于卷积层, n i n n_{in} nin表示输入通道数乘以卷积核的高度和宽度。

Xavier初始化

对于一个具有 n i n n_{in} nin 个输入神经元和 n o u t n_{out} nout 个输出神经元的全连接层,其权重参数 W W W 的每个元素 w i j w_{ij} wij 可以按照以下两种方式进行初始化:

  • 正态分布初始化:从均值为 0,标准差为 σ = 2 n i n + n o u t \sigma = \sqrt{\frac{2}{n_{in} + n_{out}}} σ=nin+nout2 的正态分布中随机采样得到,即 w i j ∼ N ( 0 , 2 n i n + n o u t ) w_{ij} \sim N(0, \frac{2}{n_{in} + n_{out}}) wijN(0,nin+nout2)
  • 均匀分布初始化:从均匀分布 U ( − 6 n i n + n o u t , 6 n i n + n o u t ) U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}) U(nin+nout6 ,nin+nout6 ) 中进行采样。

Xavier初始化比较适用于使用Sigmoid、Tanh等传统激活函数的神经网络。

梯度检验

在实现复杂的神经网络和反向传播算法时,代码中可能会出现各种错误,如索引错误、矩阵运算错误等。梯度检验可以帮助我们及时发现这些错误,确保反向传播算法的实现是正确的。

梯度的数值逼近

由导数的定义可知。在微积分中,函数 f ( x ) f(x) f(x) 在某一点 x x x 处的导数可以用极限来近似表示:
f ′ ( x ) ≈ f ( x + ϵ ) − f ( x − ϵ ) 2 ϵ f'(x) \approx \frac{f(x + \epsilon)-f(x - \epsilon)}{2\epsilon} f(x)2ϵf(x+ϵ)f(xϵ)
其中 ϵ \epsilon ϵ 是一个非常小的正数。

在神经网络中,我们通过反向传播算法计算损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的导数 ∂ J ∂ θ \frac{\partial J}{\partial \theta} θJ,梯度检验就是将反向传播计算得到的梯度与使用上述近似公式计算得到的梯度进行比较,如果两者非常接近,则说明反向传播算法的实现是正确的。
在这里插入图片描述

g ( θ ) g(\theta) g(θ) f ( θ ) f(\theta) f(θ)的导数。

可以看出误差是0.0001,不是很大,说明该代码是正确的。

步骤(如上图)

  1. 定义损失函数和参数:明确神经网络的损失函数 J ( θ ) J(\theta) J(θ) 以及需要更新的参数 θ \theta θ
  2. 初始化参数:给参数 θ \theta θ 赋予初始值。
  3. 使用反向传播计算梯度:通过反向传播算法计算损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的梯度 ∇ θ J \nabla_{\theta}J θJ(对损失函数求某个参数的导数)。
  4. 使用数值近似计算梯度:对于参数 θ \theta θ 中的每一个元素 θ i \theta_i θi,分别计算 J ( θ 1 , ⋯   , θ i + ϵ , ⋯   , θ n ) J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n) J(θ1,,θi+ϵ,,θn) J ( θ 1 , ⋯   , θ i − ϵ , ⋯   , θ n ) J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n) J(θ1,,θiϵ,,θn),然后使用近似公式 ∂ J ∂ θ i ≈ J ( θ 1 , ⋯   , θ i + ϵ , ⋯   , θ n ) − J ( θ 1 , ⋯   , θ i − ϵ , ⋯   , θ n ) 2 ϵ \frac{\partial J}{\partial \theta_i} \approx \frac{J(\theta_1, \cdots, \theta_i + \epsilon, \cdots, \theta_n)-J(\theta_1, \cdots, \theta_i - \epsilon, \cdots, \theta_n)}{2\epsilon} θiJ2ϵJ(θ1,,θi+ϵ,,θn)J(θ1,,θiϵ,,θn) 计算梯度的近似值。
  5. 比较两种梯度:计算反向传播得到的梯度 ∇ θ J \nabla_{\theta}J θJ 和数值近似得到的梯度之间的差异,通常使用相对误差来衡量:
    d = ∥ ∇ θ J − ∇ θ J a p p r o x ∥ 2 ∥ ∇ θ J ∥ 2 + ∥ ∇ θ J a p p r o x ∥ 2 d = \frac{\|\nabla_{\theta}J - \nabla_{\theta}J_{approx}\|_2}{\|\nabla_{\theta}J\|_2 + \|\nabla_{\theta}J_{approx}\|_2} d=θJ2+θJapprox2θJθJapprox2
    其中 ∥ ⋅ ∥ 2 \|\cdot\|_2 2 表示向量的 L2 范数(L2距离)。如果相对误差 d d d 非常小(例如小于 1 0 − 7 10^{-7} 107),则说明反向传播算法的实现是正确的;否则,可能存在代码实现错误。

一些建议

  • 梯度检验仅用于调试,不能训练过程中使用。
  • 若算法未能通过梯度检验,检查各个值,比如如 d z \mathbf{d}z dz d w \mathbf{d}w dw d a \mathbf{d}a da,大概定位。
  • 进行梯度检验时要考虑正则化项。
  • 梯度检验不适用于带有随机失活(Dropout)的情况。
  • 刚开始的时候初始化的W和b都很小,趋于0,而模型可能在W和b小的时候可以很好的计算梯度,但是当迭代了一段时间后,W和b变大,模型可能会在这一部分存在问题,因此这个时候在开启梯度检验比较合适。

http://www.kler.cn/a/525688.html

相关文章:

  • ResNet 残差网络
  • 基于阿里云百炼大模型Sensevoice-1的语音识别与文本保存工具开发
  • 【C++动态规划 离散化】1626. 无矛盾的最佳球队|2027
  • 理解PLT表和GOT表
  • 21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS
  • 36、【OS】【Nuttx】OSTest分析(2):环境变量测试
  • 初阶mysql修炼手册
  • Vue.js 组合函数(Composables)
  • 算法随笔_32: 移掉k位数字
  • 供应链系统设计-供应链中台系统设计(十二)- 清结算中心设计篇(一)
  • C语言中的存储类
  • 安卓(android)音乐播放器【Android移动开发基础案例教程(第2版)黑马程序员】
  • VLLM性能调优
  • WPS怎么使用latex公式?
  • Transformer+vit原理分析
  • Linux多路转接poll
  • 解读Linux 6.x版本内核的sys目录作用
  • SQL注入漏洞之错误类型注入 爆破表 字段 列名称 以及mysql版本 以及Limit使用方式解释 以及靶场相关联系
  • 「全网最细 + 实战源码案例」设计模式——桥接模式
  • 7.抽象工厂(Abstract Factory)
  • P1002 [NOIP2002 普及组] 过河卒
  • Leetcode 131 分割回文串(纯DFS)
  • EtherCAT主站IGH-- 23 -- IGH之fsm_slave.h/c文件解析
  • 在Ubuntu下编译VLC
  • 【AI非常道】二零二五年一月(二),AI非常道
  • 正态分布与柯西分布的线性组合与副本随机变量同分布