机器学习06-正则化
0-焦点逻辑脉络
- 1)欠拟合和过拟合的含义
- 2)过拟合的解决办法
- 3)常用的正则化之间的对比
- 4)Dropout在模型练习的时间有效,在模型推测的时间不会用
- 5)L1和L2用在什么地方->损失函数+正则化函数(用来约束损失函数不要由于某个参数的权重而倾斜)->
类比:你赚钱快是不是,我用梯度缴税(正则约束)去治你,再有钱你也麻头皮
- 6)Layer Normalization正则化->多用于文本练习,针对每个句子(样本)举行正则化
- 7)Layer Normalization(层归一化)通过归一化每个样本的特征向量来实现这一点,而不是像Batch Normalization(批归一化)那样归一化整个批次的数据。
- 8)Batch Normalization(批归一化)通过对每个批次的数据举行归一化来实现这一点,具体来说,是对每个特征维度在批次中的分布举行归一化。
1-参考网址
- 1)解读正则化:https://www.bilibili.com/video/BV1Cm421j7dw
- 2)最清晰好懂的 Layernorm 原理解析:https://zhuanlan.zhihu.com/p/751292473
3-大模型练习中的正则化
1.正则化的定义与作用
正则化是机器学习和深度学习中的一种技能,旨在通过在模型的损失函数中添加处罚项来控制模型的复杂度,从而防止模型在练习数据上太过拟合,进步模型的泛化能力。常见的正则化方法包括L1正则化、L2正则化、弹性网络正则化、Dropout、Batch
Normalization等。
2.常见的正则化方法及其应用场景
2.1 L1正则化(Lasso)
原理:通过在损失函数中添加特征权重的绝对值和,使得某些特征权重减小到零,从而实现特征选择。
应用场景:实用于高维数据和稀疏数据,特别是在特征数量大于样本数量时。
优点:可以实现特征选择,减少模型参数数量。
缺点:可能导致模型参数不稳定。
2.2 L2正则化(Ridge)
原理:通过在损失函数中添加特征权重的平方和,鼓励权重匀称分布,减小模型复杂性。
应用场景:实用于一样寻常情况下有较少噪声的数据集。
优点:模型参数稳定,易于表明。
缺点:无法实现特征选择。
2.3 弹性网络正则化(Elastic Net)
原理:结合了L1和L2正则化,通过调治参数来均衡两者的影响。
应用场景:实用于大量特征且存在多重共线性的问题时。
优点:结合了L1和L2正则化的优点,可以同时实现特征选择和参数压缩。
缺点:参数选择较为复杂。
2.4 Dropout
原理:在练习过程中随机忽略神经网络中的一部分神经元,从而减少网络对特定神经元的依赖,进步泛化能力。
应用场景:广泛应用于深度学习中的神经网络模型练习时。
优点:可以有效防止过拟合,进步模型的泛化能力。
缺点:可能会增加练习时间。
2.5 Batch Normalization
原理:通过对每一层的输入举行标准化,加快练习过程并进步模型的泛化能力。
应用场景:广泛应用于深度学习中的各种神经网络模型。
优点:可以加快练习过程,进步模型的稳定性和泛化能力。
缺点:增加了模型的复杂度和计算量。
2.6 早停(Early Stopping)
原理:在练习过程中,当验证集上的性能不再提拔时,提前停止练习,以防止过拟合。
应用场景:实用于各种机器学习和深度学习模型。
优点:简单有效,可以防止过拟合。
缺点:可能会导致模型欠拟合,需要公道选择停止条件。
2.7 权重衰减(Weight Decay)
原理:与L2正则化相似,通过在优化过程中引入权重的平方处罚项来限制权重的大小,从而减少模型的复杂度。
应用场景:广泛应用于深度学习的优化过程中,尤其是针对大规模模型。
优点:能有效防止网络过拟合,尤其是在练习数据有限时。
缺点:与L2正则化类似,无法实现特征选择。
2.8 梯度处罚(Gradient Penalty)
原理:对神经网络的梯度大小举行正则化,目的是约束网络的梯度不至于过大,避免过拟合。
应用场景:在对抗练习、生成对抗网络(GAN)和强化学习中具有广泛应用。
优点:可以促使模型学习到更加平滑的决策界限,从而进步模型的泛化能力。
缺点:增加了模型的复杂度和计算量。
2.9 特征选择和降维
原理:通过选择对推测有效的特征或对数据举行降维(如PCA)来减少模型的输入维度,从而低落模型复杂度。
应用场景:广泛应用于机器学习中的监视学习任务,尤其是高维数据集的处置处罚。
优点:可以减少过拟合,进步模型的可表明性和计算效率。
缺点:可能会丢失一些有效的信息。
3.不同正则化方法的对比
正则化方法原理优点缺点实用场景L1正则化添加权重的绝对值和实现特征选择,减少参数数量参数不稳定高维稀疏数据L2正则化添加权重的平方和参数稳定,易于表明无法实现特征选择一样寻常数据集弹性网络结合L1和L2正则化同时实现特征选择和参数压缩参数选择复杂多重共线性数据Dropout随机忽略神经元防止过拟合,进步泛化能力增加练习时间神经网络模型Batch Normalization输入标准化加快练习,进步稳定性增加复杂度各种神经网络Layer Normalization每一层各特征维度的标准化提拔梯度活动稳定性,适合更深层模型计算成本高RNN、Transformer、小批量数据早停提前停止练习防止过拟合可能欠拟合各种模型权重衰减权重平方处罚防止过拟合无法特征选择大规模模型梯度处罚梯度大小正则化学习平滑决策界限增加复杂度对抗练习、GAN特征选择和降维选择有效特征或降维减少过拟合,进步效率可能丢失信息高维数据集 4-Batch Normalization
Batch Normalization(批归一化)是一种用于神经网络的技能,旨在加快练习速率并进步模型性能。它通过对每个批次的数据举行归一化来实现这一点,具体来说,是对每个特征维度在批次中的分布举行归一化。
简单示例
假设我们有一个简单的神经网络,其中有一个全连接层(Fully Connected Layer),输入是一个形状为 (batch_size, features)
的张量。我们以一个具体的例子来说明Batch Normalization的工作原理。
输入数据
假设我们有一个小批量数据,大小为 batch_size = 2,每个样本有 features = 3 个特征。输入数据如下:
- x = [[0.8, -1.2, 0.5],
- [1.0, 0.3, -0.7]]
复制代码 计算步骤
- 计算每个特征维度的均值和方差:
- 对于第一个特征维度 [0.8, 1.0]:
- 均值:mean1 = (0.8 + 1.0) / 2 = 0.9
- 方差:var1 = [(0.8 - 0.9)^2 + (1.0 - 0.9)^2] / 2 = 0.01
- 对于第二个特征维度 [-1.2, 0.3]:
- 均值:mean2 = (-1.2 + 0.3) / 2 = -0.45
- 方差:var2 = [(-1.2 - (-0.45))^2 + (0.3 - (-0.45))^2] / 2 = 0.9025
- 对于第三个特征维度 [0.5, -0.7]:
- 均值:mean3 = (0.5 + (-0.7)) / 2 = -0.1
- 方差:var3 = [(0.5 - (-0.1))^2 + (-0.7 - (-0.1))^2] / 2 = 0.18
- 归一化:
- 对于第一个特征维度:
- normalized1 = [(0.8 - 0.9) / sqrt(0.01 + eps),
- (1.0 - 0.9) / sqrt(0.01 + eps)]
复制代码 其中 eps 是一个很小的数,用于防止除零错误。
- 对于第二个特征维度:
- normalized2 = [(-1.2 - (-0.45)) / sqrt(0.9025 + eps),
- (0.3 - (-0.45)) / sqrt(0.9025 + eps)]
复制代码 - 对于第三个特征维度:
- normalized3 = [(0.5 - (-0.1)) / sqrt(0.18 + eps),
- (-0.7 - (-0.1)) / sqrt(0.18 + eps)]
复制代码
- 线性变换:
- 归一化后的数据会通过一个线性变换参数 gamma 和 beta 举行调整。
- output1 = gamma1 * normalized1 + beta1
- output2 = gamma2 * normalized2 + beta2
- output3 = gamma3 * normalized3 + beta3
复制代码
总结
通过Batch Normalization,我们为每个特征维度计算批次内的均值和方差,并举行归一化,这样可以确保每个特征维度在批次中的分布更加稳定,从而有助于模型更好地学习和收敛。这种方法有效地减少了内部协变量偏移(Internal
Covariate Shift),进步了练习的稳定性和速率。
代码实现
在现实的深度学习框架中,Batch Normalization通常通过以下方式实现:
- import torch
- import torch.nn as nn
- # 定义Batch Normalization
- batch_norm = nn.BatchNorm1d(num_features=3)
- # 输入数据
- x = torch.tensor([[0.8, -1.2, 0.5],
- [1.0, 0.3, -0.7]], dtype=torch.float32)
- # 应用Batch Normalization
- output = batch_norm(x)
- print(output)
复制代码 这个简单的示例展示了Batch Normalization的基本操作流程。
5-Layer Normalization
Layer Normalization(层归一化)是一种用于神经网络的正则化技能,旨在进步模型的练习稳定性和收敛速率。它通过归一化每个样本的特征向量来实现这一点,而不是像Batch
Normalization(批归一化)那样归一化整个批次的数据。
简单示例
假设我们有一个简单的神经网络,其中有一个全连接层(Fully Connected Layer),输入是一个形状为 (batch_size, features)
的张量。我们以一个具体的例子来说明Layer Normalization的工作原理。
输入数据
假设我们有一个小批量数据,大小为 batch_size = 2,每个样本有 features = 3 个特征。输入数据如下:
- x = [[0.8, -1.2, 0.5],
- [1.0, 0.3, -0.7]]
复制代码 计算步骤
- 计算每个样本的均值和方差:
- 对于第一个样本 [0.8, -1.2, 0.5]:
- 均值:mean1 = (0.8 + (-1.2) + 0.5) / 3 = 0.0333
- 方差:var1 = [(0.8 - 0.0333)^2 + (-1.2 - 0.0333)^2 + (0.5 - 0.0333)^2] / 3 = 0.7667
- 对于第二个样本 [1.0, 0.3, -0.7]:
- 均值:mean2 = (1.0 + 0.3 + (-0.7)) / 3 = 0.2
- 方差:var2 = [(1.0 - 0.2)^2 + (0.3 - 0.2)^2 + (-0.7 - 0.2)^2] / 3 = 0.5467
- 归一化:
- 对于第一个样本:
- normalized1 = [(0.8 - 0.0333) / sqrt(0.7667 + eps),
- (-1.2 - 0.0333) / sqrt(0.7667 + eps),
- (0.5 - 0.0333) / sqrt(0.7667 + eps)]
复制代码 其中 eps 是一个很小的数,用于防止除零错误。
- 对于第二个样本:
- normalized2 = [(1.0 - 0.2) / sqrt(0.5467 + eps),
- (0.3 - 0.2) / sqrt(0.5467 + eps),
- (-0.7 - 0.2) / sqrt(0.5467 + eps)]
复制代码
- 线性变换:
- 归一化后的数据会通过一个线性变换参数 gamma 和 beta 举行调整。
- output1 = gamma * normalized1 + beta
- output2 = gamma * normalized2 + beta
复制代码
总结
通过Layer Normalization,我们为每个样本独立地计算均值和方差,并举行归一化,这样可以确保每个样本在特征维度上的分布更加稳定,从而有助于模型更好地学习和收敛。
代码实现
在现实的深度学习框架中,Layer Normalization通常通过以下方式实现:
- import torch
- import torch.nn as nn
- # 定义Layer Normalization
- layer_norm = nn.LayerNorm(normalized_shape=[3])
- # 输入数据
- x = torch.tensor([[0.8, -1.2, 0.5],
- [1.0, 0.3, -0.7]], dtype=torch.float32)
- # 应用Layer Normalization
- output = layer_norm(x)
- print(output)
复制代码 这个简单的示例展示了Layer Normalization的基本操作流程。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |