小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播

下面要说的基本都是《动手学深度学习》这本花书上的内容,图也采用的书上的

首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望)

模型选择

  验证数据集(validation data set),又叫验证集(validation set),指用于模型选择的在train settest set之外预留的一小部分数据集

  若训练数据不够时,预留验证集也是一种luxury。常采用的方法为K折交叉验证。原理为:把train set分割成k个不重合的子数据集(SubDataset),然后做k次模型训练和验证。每次训练中,用一个SubDataset作为validation set,其余k-1个SubDataset作为train set。最后对k次训练误差和验证误差求平均(mean)

欠拟合:模型无法得到较低的训练误差,即训练误差降低不了

过拟合:模型训练误差远小于在测试集上的误差

解决欠拟合和过拟合的方法有二:其一,针对数据选择合适的复杂度模型(模型复杂度过高,易出现过拟合;否则易出现欠拟合)。其二,训练数据集大小(train set过少,则容易过拟合。没有否则)

torch.pow():求tensor的幂次(pow是power(有幂次的意思)的缩写),比如求tensor a的平方,则torch.pow(a,2)

torch.cat((A,B),dim):cat是concatenate(拼接,连接在一起)的缩写,参考博客 https://www.cnblogs.com/JeasonIsCoding/p/10162356.html  解释的很好,感谢博主。我多加一句:连接tensor A和B,就是扩增dim维,比如两个矩阵,dim=1,则扩增列,即横着拼接

torch.utils.data.TensorDataset(x,y):大概意思是整合x和y,使其对应。即x的每一行对应y的每一行。

torch.utils.data.DatasetLoader(dataset=dataset,batch_size=batch_size,shuffle=True,num_workers=2):dataset(通过TensorDataset整合的);batch_size(批量大小);shuffle(是否打乱);num_workers(线程数)

权重衰减(weight decay)

  权重衰减又叫L2范数正则化,即在原损失函数基础上添加L2范数惩罚项。
  范数公式$ ||x|| _{p}= (\sum_{i=1}^{n}|x_{i}|^{p})^{1/p} $   L2范数为:$ ||x||_{2} = (\sum_{i=1}^{n}|x_{i}|^{2})^{1/2} $

  带L2范数惩罚项的新损失函数为:$ \iota (w_{1},w_{2},b) + \frac{\lambda }{2n}||x||^2 $      torch.norm(input, p=)求范数

丢弃法(dropout)

  隐藏单元采用一定的概率进行丢弃。使用丢弃法重新计算新的隐藏单元公式为

  $ h_{i}^{‘} = \frac{\xi _{i}}{1-p}h_{i} $

  其中$ h_{i}$ 为隐藏单元$ h_{i} = \O (x_{1}w_{1i} + x_{2}w_{2i} + x_{3}w_{3i} + x_{4}w_{4i} + b_{i}) $,随机变量$\xi_{i}$取值为0(概率为p)和1(概率为1-p)

def dropout(X, drop_prob):
    X = X.float()
    assert 0 <= drop_prob <= 1   #drop_prob的值必须在0-1之间,和数据库中的断言一个意思
    #这种情况下把全部元素丢弃
    if keep_prob == 0:   #keep_prob=0等价于1-p=0,这是$\xi_{i}$值为1的概率为0
        return torch.zeros_like(X)
    mask = (torch.rand(X.shape) < keep_prob).float()  #torch.rand()均匀分布,小于号<判别,若真,返回1,否则返回0
    return mask * X / keep_prob  # 重新计算新的隐藏单元的公式实现

model.train():启用BatchNormalization和Dropout

model.eval():禁用BatchNormalization和Dropout

正向传播和反向传播

  在深度学习模型训练时,正向传播和反向传播之间相互依赖。下面1和2看不懂的可先看《动手学深度学习》3.14.1和3.14.2

  1.正向传播的计算可能依赖模型参数的当前值,而这些模型参数是在反向传播梯度计算后通过优化算法迭代的。

    如正则化项$ s = ({\lambda }/{2})(\left \| W^{(1)} \right \|_{F}^{2} + \left \| W^{(2)} \right \|_{F}^{2}) $依赖模型参数$W^{(1)}$和$W^{(2)}$的当前值,而这些当前值是优化算法最近一次根据反向传播算出梯度后迭代得到的。

  2.反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的。

    如参数梯度$ \frac{\partial J}{\partial W^{(2))}} = (\frac{\partial J}{\partial o}h^{T} + \lambda W^{(2)}) $的计算需要依赖隐藏层变量的当前值h。这个当前值是通过从输入层到输出层的正向传播计算并存储得到的。

原文地址:https://www.cnblogs.com/JadenFK3326/p/12142974.html

时间: 2024-10-07 15:25:54

小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播的相关文章

小白学习之pytorch框架(2)-动手学深度学习(begin)

在这向大家推荐一本书-花书-动手学深度学习pytorch版,原书用的深度学习框架是MXNet,这个框架经过Gluon重新再封装,使用风格非常接近pytorch,但是由于pytorch越来越火,个人又比较执着,想学pytorch,好,有个大神来了,把<动手学深度学习>整本书用pytorch代码重现了,其GitHub网址为:https://github.com/ShusenTang/Dive-into-DL-PyTorch   原书GitHub网址为:https://github.com/d2l-

小白学习之pytorch框架(5)-多层感知机(MLP)-(tensor、variable、计算图、ReLU()、sigmoid()、tanh())

先记录一下一开始学习torch时未曾记录(也未好好弄懂哈)导致又忘记了的tensor.variable.计算图 计算图 计算图直白的来说,就是数学公式(也叫模型)用图表示,这个图即计算图.借用 https://hzzone.io/cs231n/%E7%90%86%E8%A7%A3-PyTorch-%E8%AE%A1%E7%AE%97%E5%9B%BE%E3%80%81Autograd-%E6%9C%BA%E5%88%B6%E5%92%8C%E5%AE%9E%E7%8E%B0%E7%BA%BF%E

小白学习之pytorch框架(4)-softmax回归(torch.gather()、torch.argmax())

学习pytorch路程之动手学深度学习-3.4-3.7 置信度.置信区间参考:https://cloud.tencent.com/developer/news/452418 本人感觉还是挺好理解的 交叉熵参考博客:https://www.cnblogs.com/kyrieng/p/8694705.html   https://blog.csdn.net/tsyccnh/article/details/79163834  个人感觉还不错,好理解 (这段瞅瞅就行了)torchvision包,服务于P

动手深度学习12- 模型选择,欠拟合和过拟合

模型选择.欠拟合和过拟合 训练误差和泛化误差 模型选择 K折交叉验证 欠拟合和过拟合 模型复杂度 训练数据集大小 多项式函数拟合实验 定义.训练和测试模型 欠拟合 过拟合 小结 模型选择.欠拟合和过拟合 前几节给予Fashion_MNIST数据集的实验中,我们评价了机器学习模型在训练集合测试集上的表现.通常得到的结果都是训练数据集上更准确时,它在测试集上表现不一定更好,这就涉及到了模型的选择以及拟合程度的选择. 训练误差和泛化误差 训练误差 是指模型在训练数据集上表现出来的误差 泛化误差 是指模

Spark2.0机器学习系列之2:基于Pipeline、交叉验证、ParamMap的模型选择和超参数调优

Spark中的CrossValidation Spark中采用是k折交叉验证 (k-fold cross validation).举个例子,例如10折交叉验证(10-fold cross validation),将数据集分成10份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计. 10折交叉检验最常见,是因为通过利用大量数据集.使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点.但这并非最终结论,争议仍然存在.而且似

MXNET:欠拟合、过拟合和模型选择

当模型在训练数据集上更准确时,在测试数据集上的准确率既可能上升又可能下降.这是为什么呢? 训练误差和泛化误差 在解释上面提到的现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error):前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望. 假设训练数据集和测试数据集里的每一个样本都是从同一个概率分布中相互独立地生成的.基于该独立同分布假设,给定任意一个机器学习模型及其参数和超参数,它的训练误差的期望

机器学习(ML)七之模型选择、欠拟合和过拟合

训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似.计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数. 直观地解释训练误差和泛化误差这两个概念.训练误差可以认为是做往年高考试题(训练题)时的错误率,泛化误差则可以通过真正参加高

【scikit-learn】交叉验证及其用于參数选择、模型选择、特征选择的样例

?? 内容概要? 训练集/測试集切割用于模型验证的缺点 K折交叉验证是怎样克服之前的不足 交叉验证怎样用于选择调节參数.选择模型.选择特征 改善交叉验证 1. 模型验证回想? 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就须要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 最先我们用训练精确度(用所有数据进行训练和測试)来衡量模型的表现,这样的方法会导致模型过拟合:为了解决这一问题,我们将所有数据分成训练集和測试集两部

机器学习(ML)八之正向传播、反向传播和计算图,及数值稳定性和模型初始化

正向传播 正向传播的计算图 通常绘制计算图来可视化运算符和变量在计算中的依赖关系.下图绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出.可以看到,图中箭头方向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依赖关系. 反向传播 训练深度学习模型 在训练深度学习模型时,正向传播和反向传播之间相互依赖.一方面,正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度计算后通过优化算法迭代的而这些当前值是优化算法最近一次根据反向传播算