《动手学深度学习PyTorch版》打卡_Task3,过拟合,欠拟合,梯度消失,梯度爆炸

Olinda ·
更新时间:2024-11-14
· 980 次阅读

        最近参加了伯禹平台和Datawhale等举办的《动手学深度学习PyTorch版》课程,对过拟合,欠拟合,梯度消失,梯度爆炸做下笔记。

过拟合和欠拟合 模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting) 模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合 解决方法 权重衰减

权重衰减等价于 L2 范数正则化(regularization)。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,是应对过拟合的常用手段。带有L2L2范数惩罚项的新损失函数为:

其中超参数λ>0。当权重参数均为0时,惩罚项最小。当λ较大时,惩罚项在损失函数中的比重较大,这通常会使学到的权重参数的元素较接近0。当λ设为0时,惩罚项完全不起作用。上式中L2范数平方|w|^2展开后得到w1^2+w2^2。 有L2范数惩罚项后,在小批量随机梯度下降中,我们将线性回归一节中权重w1和w2的迭代方式更改为

可见,L2范数正则化令权重w1和w2先自乘小于1的数,再减去不含惩罚项的梯度。因此,L2范数正则化又叫权重衰减。权重衰减通过惩罚绝对值较大的模型参数为需要学习的模型增加了限制,这可能对过拟合有效。

Dropout(丢弃法)

当对该隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为p,那么有p的概率hi会被清零,有1−p的概率hi会除以1−p做拉伸。丢弃概率是丢弃法的超参数。具体来说,设随机变量ξi为0和1的概率分别为p和1−p。使用丢弃法时我们计算新的隐藏单元h′i

由于E(ξi)=1−p,因此

即丢弃法不改变其输入的期望值。在测试模型时,我们为了拿到更加确定性的结果,一般不使用丢弃法

梯度消失和梯度爆炸

当神经网络的层数较多时,模型的数值稳定性容易变差,容易出现梯度消失和梯度爆炸的情况。

假设使用softmax来做为激活函数,神经网络层数为3层:

ai:表示第i层经过激活函数后的输出

hi:表示w(i)*a(i-1)

那么有

h(i) = w(i)*a(i-1)

a(i) = softmax(h(i))

在BP过程中就有了:

用s表示:a(i)对h(i)的导数,即softmax函数的导数

用w表示:h(i)对a(i-1)的导数,即w(i)

那么在对底层神经求导时会不断出现:s*w*s*w*s*w...这个结构

由于s的取值范围是0-1/4

所以只有w>4就可能会造成梯度爆炸,w<4就可能会造成梯度消失

解决办法 随机初始化模型参数

在神经网络中,通常需要随机初始化模型参数。下面我们来解释这样做的原因。

回顾多层感知机一节描述的多层感知机。为了方便解释,假设输出层只保留一个输出单元o1(删去o2和o3以及指向它们的箭头),且隐藏层使用相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有1个隐藏单元在发挥作用。因此,正如在前面的实验中所做的那样,我们通常将神经网络的模型参数,特别是权重参数,进行随机初始化。

Xavier随机初始化

有一种比较常用的随机初始化方法叫作Xavier随机初始化。 假设某全连接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布:

假设x服从[a,b]上的均匀分布,则x的概率密度函数如下:

它的设计主要考虑到,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。

选择合适的激活函数

使用ReLU或者其变种代替softmax

批量归一化 更好的优化器
作者:kanatappi



动手学 pytorch 过拟合 欠拟合 梯度

需要 登录 后方可回复, 如果你还没有账号请 注册新账号