丢弃法:
丢弃法是一种常用的正则化技术,可以在训练神经网络时防止过拟合。其基本思想是在训练过程中随机将一部分神经元的输出置为0,这样可以减少神经元之间的复杂依赖关系,使得神经网络更加健壮。
在丢弃法中,每个神经元的输出都有一定的概率被置为0。通常情况下,丢弃概率是一个超参数,取值范围为0到1之间,表示神经元被保留的概率。丢弃法可以被看作是在神经网络中添加了噪声,这种噪声有助于减少神经元之间的共适应关系,从而提高泛化性能。
dropout 函数将以 drop_prob 的概率丢弃 X中的元素.
def dropout(X, drop_prob):
X = X.float()
assert 0 <= drop_prob <= 1
keep_prob = 1 - drop_prob # 检查丢弃概率drop_prob是否在合法范围[0,1]内。
# 这种情况下把全部元素都丢弃
if keep_prob == 0:
return torch.zeros_like(X)
Y = torch.randn(X.shape)
print(Y)
mask = (Y < keep_prob).float() # 其中mask的元素值为1表示对应位置的元素被保留,值为0表示对应位置的元素被丢弃。
return mask * X / keep_prob # 对剩余的元素进行缩放,使得它们的期望值保持不变
对于 mask = (Y < keep_prob).float() 这行代码,其实可以直接把torch.randn(X.shape) 替换成Y。但是疑惑这行代码,是否会在最后保留1-drop_prob比例的神经元。所以决定打印出Y,观察保留情况。
可见即使drop_prob值取得很高(0.8),保留下来的神经元也不止0.2。因为对于随机正太分布有负数,也有随机性,总体保留的比例是高于1-drop_prob的。
权重衰减(l2正则)
权重衰减等价于 范数正则化。正则化通过为模型损失函数添加惩罚项使学出的 模型参数值较⼩,是应对过拟合的常⽤⼿段。
l2范数正则化在模型原损失函数基础上添加 范数惩罚项,从⽽得到训练所需要最⼩化的函数。 范 数惩罚项指的是模型权重参数每个元素的平⽅和与⼀个正的常数的乘积。
下⾯定义 范数惩罚项。这⾥只惩罚模型的权重参数:
def l2_penalty(w):
return (w**2).sum() / 2
然后再计算loss的时候加入:
l = loss(net(X, w, b), y) + lambd * l2_penalty(w)
归一化 和 标准化
数据归一化的目的是使得各特征对目标变量的影响一致,会将特征数据进行伸缩变化,所以数据归一化是会改变特征数据分布的。
数据标准化为了不同特征之间具备可比性,经过标准化变换之后的特征数据分布没有发生改变。就是当数据特征取值范围或单位差异较大时,最好是做一下标准化处理
对于哪些数据和模型需要标准化:
需要做数据归一化/标准化 线性模型,如基于距离度量的模型包括KNN(K近邻)、K-means聚类、感知机和SVM。另 外,线性回归类的几个模型一般情况下也是需要做数据归一化/标准化处理的。
不需要做数据归一化/标准化 决策树、基于决策树的Boosting和Bagging等集成学习模型对于特征取值大小并不敏感, 如随机森林、XGBoost、LightGBM等树模型,以及朴素贝叶斯,以上这些模型一般不需 要做数据归一化/标准化处理
关于噪声
训练集加入噪声:
在实际场景中,由于各种原因,训练集中的数据可能存在一定的噪声,例如测量误差、数据缺失、人为标注错误等。 如果模型过于依赖训练集中的数据,就容易受到噪声的干扰,从而导致泛化性能较差。
加入噪声可以帮助模型更好地适应实际场景中的不确定性,使其具有更好的泛化能力。 具体来说,加入噪声可以帮助模型学习到数据中的一些隐含规律,而不是过度拟合到噪声上。 此外,加入噪声还可以帮助模型对数据中的异常情况进行更好的处理,使其更加鲁棒。
标签加入噪声:
在一些复杂的数据集中,标签信息可能存在一定程度的噪声,例如由于人为误差或者数据采集的不确定性,标签可能会存在一定的错误。 如果模型过于依赖训练集中的标签信息,可能会导致过拟合现象,即在训练集上表现良好,但在测试集上表现较差。
标签平滑技术的主要思想是通过加入噪声来降低模型对训练集标签信息的依赖程度,从而提高模型的泛化能力。 具体来说,标签平滑会将标签信息转换为一个概率分布,然后在这个概率分布上加入一定程度的噪声, 使得模型不再过于自信地预测每个样本的标签,从而防止过拟合的出现。