基于PyTorch的深度学习——机器学习2

如何解决过拟合问题呢?正则化是其中一个有效方法。正则化不仅可以有效地降低高方差,还有利于降低偏差。那何为正则化?在机器学习中,很多被显式地用来减少测试误差的策略,统称为正则化。正则化旨在减少泛化误差而不是训练误差。

如果要降低模型的复杂度,可以通过缩减它们的系数来实现,如把第3次、4次项的系数θ3、θ4缩减到接近于0即可

那在算法中如何实现呢?这个得从其损失函数或目标函数着手。

这个损失函数是我们的优化目标,也就是说我们需要尽量减少损失函数的均方误差。对于这个函数我们对它添加一些正则项,如加上10000乘以θ3的平方,再加上10000乘以θ4的平方

传统意义上的正则化一般分为L0、L1、L2、L∞等。PyTorch如何实现正则化呢?这里以实现L2为例,神经网络的L2正则化称为权重衰减(Weight Decay)。torch.optim集成了很多优化器,如SGD、Adadelta、Adam、Adagrad、RMSprop等,这些优化器自带的一个参数weight_decay,用于指定权值衰减率,相当于L2正则化中的λ参数.

__________________________________________Dropout

Dropout是Srivastava等人在2014年发表的一篇论文中,提出了一种针对神经网络模型的正则化方法Dropout(A Simple Way to Prevent Neural Networks from Overfitting)。那Dropout在训练模型中是如何实现的呢?Dropout的做法是在训练过程中按一定比例(比例参数可设置)随机忽略或屏蔽一些神经元。这些神经元会被随机"抛弃"​,也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。所以,通过传播过程,Dropout将产生和L2范数相同的收缩权重的效果。随着神经网络模型的不断学习,神经元的权值会与整个网络的上下文相匹配。神经元的权重针对某些特征进行调优,进而产生一些特殊化。周围的神经元则会依赖于这种特殊化,但如果过于特殊化,模型会因为对训练数据的过拟合而变得脆弱不堪。神经元在训练过程中的这种依赖于上下文的现象被称为复杂的协同适应(Complex Co-Adaptations)。加入了Dropout以后,输入的特征都是有可能会被随机清除的,所以该神经元不会再特别依赖于任何一个输入特征.

如何或何时使用Dropout呢?以下是一般原则。1)通常丢弃率控制在20%~50%比较好,可以从20%开始尝试。如果比例太低则起不到效果,比例太高则会导致模型的欠学习。2)在大的网络模型上应用。当Dropout应用在较大的网络模型时,更有可能得到效果的提升,模型有更多的机会学习到多种独立的表征。3)在输入层和隐藏层都使用Dropout。对于不同的层,设置的keep_prob也不同,一般来说神经元较少的层,会设keep_prob为1.0或接近于1.0的数;神经元较多的层,则会将keep_prob设置得较小,如0.5或更小。4)增加学习速率和冲量。把学习速率扩大10~100倍,冲量值调高到0.9~0.99。5)限制网络模型的权重。大的学习速率往往会导致大的权重值。对网络的权重值做最大范数的正则化,被证明能提升模型性能。以下是我们通过实例来比较使用Dropout和不使用Dropout对训练损失或测试损失的影响。数据还是房屋销售数据,构建网络层,添加两个Dropout,具体构建网络代码如下:

net1_overfitting = torch.nn.Sequential(
    torch.nn.Linear(13, 16),
    torch.nn.ReLU(),
    torch.nn.Linear(16, 32),
    torch.nn.ReLU(),
    torch.nn.Linear(32, 1),
)

net1_dropped = torch.nn.Sequential(
    torch.nn.Linear(13, 16),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(16, 32),
    torch.nn.Dropout(0.5),  # drop 50% of the neuron
    torch.nn.ReLU(),
    torch.nn.Linear(32, 1),
)

------------------------------------------------------------------批量正则化

但在实际训练过程中,经常出现隐含层因数据分布不均,导致梯度消失或不起作用的情况。如采用sigmoid函数或tanh函数为激活函数时,如果数据分布在两侧,这些激活函数的导数就接近于0。这样一来,BP算法得到的梯度也就消失了。如何解决这个问题?Sergey Ioffe和Christian Szegedy两位学者提出了批标准化(Batch Normalization)方法。Batch Normalization不仅可以有效地解决梯度消失问题,而且还可以让调试超参数更加简单,在提高训练模型效率的同时,还可让神经网络模型更加"健壮"​。那么Batch Normalization是如何做到这些的呢?

N是对隐藏层的标准化处理,它与输入的标准化处理Normalizing Inputs是有区别的。Normalizing Inputs是使所有输入的均值为0,方差为1。而Batch Normalization可使各隐藏层输入的均值和方差为任意值。实际上,从激活函数的角度来看,如果各隐藏层的输入均值在靠近0的区域,即处于激活函数的线性区域,这样不利于训练好的非线性神经网络,而且得到的模型效果也不会太好。式(5-6)就起这个作用,当然它还有将归一化后的x还原的功能。那么BN一般用在哪里呢?BN应作用在非线性映射前,即对x=Wu+b做规范化时,在每一个全连接和激励函数之间。

何时使用BN呢?一般在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时,可以尝试用BN来解决。另外,在一般情况下,也可以加入BN来加快训练速度,提高模型精度,还可以大大地提高训练模型的效率。BN具体功能如下所示。1)可以选择比较大的初始学习率,让训练速度飙升。之前还需要慢慢地调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适。现在我们可以采用初始很大的学习率,然而学习率的衰减速度也很快,因为这个算法收敛很快。当然,这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性。2)不用再去理会过拟合中Dropout、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性。3)再也不需要使用局部响应归一化层。4)可以把训练数据彻底打乱。下面仍以房价预测为例,比较添加BN层与不添加BN层,两者在测试集上的损失值比较。下例为两者网络结构代码。

net1_overfitting = torch.nn.Sequential(
    torch.nn.Linear(13, 16),
    torch.nn.ReLU(),
    torch.nn.Linear(16, 32),
    torch.nn.ReLU(),
    torch.nn.Linear(32, 1),
)

net1_nb = torch.nn.Sequential(
    torch.nn.Linear(13, 16),
    nn.BatchNorm1d(num_features=16),
    torch.nn.ReLU(),
    torch.nn.Linear(16, 32),
    nn.BatchNorm1d(num_features=32),  
    torch.nn.ReLU(),
    torch.nn.Linear(32, 1),
)

------------------------------------------------------------------------权重初始化

如何对权重、偏移量进行初始化?初始化这些参数是否有一般性原则?常见的参数初始化有零值初始化、随机初始化、均匀分布初始、正态分布初始和正交分布初始等。一般采用正态分布或均匀分布的初始值,实践表明正态分布、正交分布、均匀分布的初始值能带来更好的效果。继承nn.Module的模块参数都采取了较合理的初始化策略,一般情况使用其缺省初始化策略就足够了。当然,如果想要修改,PyTorch也提供了nn.init模块,该模块提供了常用的初始化策略,如xavier、kaiming等经典初始化策略,使用这些初始化策略有利于激活值的分布呈现出更有广度或更贴近正态分布。xavier一般用于激活函数是S型(如sigmoid、tanh)的权重初始化,而kaiming则更适合于激活函数为ReLU类的权重初始化。

相关推荐
紫雾凌寒1 小时前
计算机视觉应用|自动驾驶的感知革命:多传感器融合架构的技术演进与落地实践
人工智能·机器学习·计算机视觉·架构·自动驾驶·多传感器融合·waymo
Y1nhl1 小时前
力扣hot100_二叉树(4)_python版本
开发语言·pytorch·python·算法·leetcode·机器学习
暴力袋鼠哥1 小时前
基于深度学习的中文文本情感分析系统
人工智能·深度学习
视觉语言导航2 小时前
RAG助力机器人场景理解与具身操作!EmbodiedRAG:基于动态三维场景图检索的机器人任务规划
人工智能·深度学习·具身智能
龚大龙2 小时前
机器学习(李宏毅)——Auto-Encoder
人工智能·机器学习
snow@li3 小时前
AI问答:transformer 架构 / 模型 / 自注意力机制实现序列数据的并行处理 / AI的底层
人工智能·深度学习·transformer
小枫小疯3 小时前
Pytorch 转向TFConv过程中的卷积转换
人工智能·pytorch·python
明朝百晓生3 小时前
【PyTorch][chapter-34][transformer-6] RoPE
人工智能·pytorch·transformer
IT猿手3 小时前
2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab
小圆圆6663 小时前
一学就会的深度学习基础指令及操作步骤(6)迁移学习
人工智能·深度学习·卷积神经网络·迁移学习