学习时间:2024.07.18
学习来源:花书
1.1 定义
我们训练一个模型是为了期待训练误差能和泛化误差接近。
但是我们如果使用更复杂的模型和更少的样本时,很有可能泛化误差会增大。训练时,我们会对不断降低训练误差,但是很有可能泛化后模型表现依然然查。
- 当训练误差和泛化误差都很大的时候,称为欠拟合。
- 当训练误差很小,但是泛化误差很大的时候,称为过拟合。
1.2 正则化技术
正则化技术使用的前提:当我们拥有尽可能多的高质量数据,我们可以考正则化技术降低过拟合的可能性。
1.3 权重衰减
这是一种广泛使用的正则化技术。
其使用范数乘一个超参数作为惩罚值,减在损失函数中,作为模型训练的损失函数。
-
Q:为什么使用2范数而不是1范数?
A:1范数正则化线性回归称为套索回归,1范数带来的惩罚效果是会将权重集中在一小部分特征上而将其他权重清零,称为特征选择。而二范数正则化线性回归称为岭回归,其惩罚带来的效果是对大参数的压制,从而达到缩小拟合函数的体量的效果。
1.4 暂退法(Dropout)
模型中的泛化能力和灵活性中的权衡称为偏差-方差均衡。
线性模型的灵活性很差(即具有很高的偏差),但是泛化能力很强,对不同的样本都可以得出相似的结果(即方差很小)。而神经网络是另一个极端,其具有极高灵活性的同时很有可能产生非常严重的过拟合(如果训练数据质量很差的话)。
我们期待“好”的预测模型能在未知的数据上有很好的表现。
而在经典泛化理论中,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标。
这里有一个已证明的结果:**具有输入噪声的训练等价于Tikhonov正则化 **。
因此可以在训练中对多层感知机施加噪声来达到增强平滑性的效果。
称为暂退法。
暂退法有效的一种直观理解是,过拟合的原因在于每一层依赖于前一层的激活值。使用暂退法施加噪声的时候,就会破坏这种依赖。
注入噪声的一种思路是杳然每一层的期望值等于没有噪声时的值。意味着注入噪声需要具有无偏性。
有两种实现
- 一种是注入期望为0的高斯噪声。
- 另一种方法是直接训练时随机屏蔽某些层的输出(暂退法名称的由来)。
如果要在代码中实现一个dropout层,一种好的方法是先生成一串和输入数量一样的列表,然后比较其和传入参数的大小,小于这个参数就屏蔽该层输出。
def dropout_layer(X, dropout):
assert 0 <= dropout <= 1
# 在本情况中,所有元素都被丢弃
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留
if dropout == 0:
return X
mask = (torch.rand(X.shape) > dropout).float()
return mask * X / (1.0 - dropout)
其中最后两行代码的含义如下。
-
torch.rand(X.shape):生成一个与输入张量X形状相同的张量,每个元素都是介于0到1之间的均匀分布的随机数。 -
> dropout:生成一个布尔张量,其中元素值大于dropout的元素为True,否则为False。 -
.float():将布尔张量转换为浮点数张量,其中True变为1.0,False变为0.0。 -
mask * X:将掩码mask与输入张量X逐元素相乘,这相当于随机将输入张量X中的部分元素设为0(即“丢弃”这些元素)。 -
/ (1.0 - dropout):对丢弃后的张量进行缩放,以保持输入张量的期望值不变。由于(1.0 - dropout)是剩余元素的比例,因此通过除以这个值,可以使得输出张量的期望值与未应用dropout前的期望值一致。
(当然也可以直接调Dropout这个高级API里有的函数)