pytorch l2正则化_特征值与特征向量,过拟合,L1与L2正则化

特征值与特征向量

特征值的基本定义:设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量。

A的所有特征值的全体,叫做A的谱,记为λ(A)

使用特征值求特征向量

A为n阶矩阵,根据关系式Ax=λx,可写出(λE-A)x=0,继而写出特征多项式|λE-A|=0,可求出矩阵A有n个特征值(包括重特征值)。将求出的特征值λi代入原特征多项式,求解方程(λiE-A)x=0,所求解向量x就是对应的特征值λi的特征向量。

特征向量

第一性质

线性变换的特征向量是指在变换下方向不变,或者简单地乘以一个缩放因子的非零向量。

特征向量对应的特征值是它所乘的那个缩放因子。

特征空间就是由所有有着相同特征值的特征向量组成的空间,还包括零向量,但要注意零向量本身不是特征向量 [1] 。

线性变换的主特征向量是最大特征值对应的特征向量。

特征值的几何重次是相应特征空间的维数。

有限维向量空间上的一个线性变换的谱是其所有特征值的集合。

例如,三维空间中的旋转变换的特征向量是沿着旋转轴的一个向量,相应的特征值是1,相应的特征空间包含所有和该轴平行的向量。该特征空间是一个一维空间,因而特征值1的几何重次是1。特征值1是旋转变换的谱中唯一的实特征值。

过拟合出现的原因及对应的解决方案

过拟合的定义

给定一个假设空间H,一个假设h属于H,如果存在其他的假设h’属于H,使得在训练样例上h的错误率比h’小,但在整个实例分布上h’比h的错误率小,那么就说假设h过度拟合训练数据.

判断标准

8d0631847de8082a25730cb4e7de6f73.png

ac2fa4cc5df4efa805c6f8684316b36c.png

第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。

出现的原因

1. 训练集的数量级和模型的复杂度不匹配。训练集的数量级要小于模型的复杂度;

2. 训练集和测试集特征分布不一致;

3. 样本里的噪音数据干扰过大,大到模型过分记住了噪音特征,反而忽略了真实的输入输出间的关系;

4. 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。

问题是,如果我们发现了过拟合问题,应该如何处理?

  1. 尝试减少特征的数量
  2. 尝试获得更多的特征
  3. 尝试增加多项式的特征
  4. 尝试减少正则化程度λ
  5. 尝试增加正则化程度λ

解决方案

1. simpler model structure

调小模型复杂度,使其适合自己训练集的数量级(缩小宽度和减小深度)

2. data augmentation

训练集越多,过拟合的概率越小。在计算机视觉领域中,增广的方式是对图像旋转,缩放,剪切,添加噪声等。

3. regularization

参数太多,会导致我们的模型复杂度上升,容易过拟合,也就是我们的训练误差会很小。 正则化是指通过引入额外新信息来解决机器学习中过拟合问题的一种方法。这种额外信息通常的形式是模型复杂性带来的惩罚度。 正则化可以保持模型简单,另外,规则项的使用还可以约束我们的模型的特性。

L1与L2正则化

59d8fcc8d25ec2e1d62b21813d62c5fe.png

L1 正则化公式也很简单,直接在原来的损失函数基础上加上权重参数的绝对值

L2 正则化公式非常简单,直接在原来的损失函数基础上加上权重参数的平方和

L1 与 L2 解的稀疏性

9a857e14e6eaa8ecc5717c66f3facc3c.png

以二维情况讨论,上图左边是 L2 正则化,右边是 L1 正则化。从另一个方面来看,满足正则化条件,实际上是求解蓝色区域与黄色区域的交点,即同时满足限定条件和 Ein 最小化。对于 L2 来说,限定区域是圆,这样,得到的解 w1 或 w2 为 0 的概率很小,很大概率是非零的。

对于 L1 来说,限定区域是正方形,方形与蓝色区域相交的交点是顶点的概率很大,这从视觉和常识上来看是很容易理解的。也就是说,方形的凸点会更接近 Ein 最优解对应的 wlin 位置,而凸点处必有 w1 或 w2 为 0。这样,得到的解 w1 或 w2 为零的概率就很大了。所以,L1 正则化的解具有稀疏性。

扩展到高维,同样的道理,L2 的限定区域是平滑的,与中心点等距;而 L1 的限定区域是包含凸点的,尖锐的。这些凸点更接近 Ein 的最优解位置,而在这些凸点上,很多 wj 为 0。

正则化参数 λ

43b5297ce1b962a647acaded022630bb.png

以 L2 为例,若 λ 很小,对应上文中的 C 值就很大。这时候,圆形区域很大,能够让 w 更接近 Ein 最优解的位置。若 λ 近似为 0,相当于圆形区域覆盖了最优解位置,这时候,正则化失效,容易造成过拟合。相反,若 λ 很大,对应上文中的 C 值就很小。这时候,圆形区域很小,w 离 Ein 最优解的位置较远。w 被限制在一个很小的区域内变化,w 普遍较小且接近 0,起到了正则化的效果。但是,λ 过大容易造成欠拟合。欠拟合和过拟合是两种对立的状态。

PyTorch中,可以使用批正则化(Batch Normalization)来加速神经网络的训练收敛速度并提高模型的泛化能力。批正则化是一种在神经网络层之间插入的操作,对每个特征维度进行归一化处理。 要在PyTorch中使用批正则化,可以使用`torch.nn.BatchNorm1d`或`torch.nn.BatchNorm2d`类,这取决于你需要对一维数据(如全连接层)还是二维数据(如卷积层)进行批正则化。 以下是一个简单的示例,演示如何在PyTorch中使用批正则化: ```python import torch import torch.nn as nn # 定义一个包含批正则化的网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(10, 20) self.bn1 = nn.BatchNorm1d(20) self.fc2 = nn.Linear(20, 10) self.bn2 = nn.BatchNorm1d(10) def forward(self, x): x = self.fc1(x) x = self.bn1(x) x = torch.relu(x) x = self.fc2(x) x = self.bn2(x) x = torch.relu(x) return x # 初始化网络并进行训练 net = Net() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(net.parameters(), lr=0.01) # 在训练过程中使用批正则化 for epoch in range(10): for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 在上述示例中,我们定义了一个简单的包含批正则化层的网络,并在训练过程中使用了批正则化。 请注意,批正则化在训练和测试阶段的行为略有不同。在训练时,批正则化使用每个批次的均值和方差进行归一化;而在测试时,它使用整个训练集的移动平均值和方差进行归一化。这种差异可以通过设置`net.train()`和`net.eval()`来处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值