Task03、Task04、Task05

夙愿已清 提交于 2020-02-19 22:55:19

本文意在于记录短期学习中同僚总结的知识点,主要学习平台在伯禹https://www.boyuai.com/elites/course/cZu18YmweLv10OeV
Task03:过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶(1天)
Task04:机器翻译及相关技术;注意力机制与Seq2seq模型;Transformer(1天)
Task05:卷积神经网络基础;leNet;卷积神经网络进阶(1天)

Task03:过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶

1.过拟合、欠拟合及其解决方案
训练误差(training error):训练集上的误差
泛化误差(generalization error):用测试集上的误差代替
数据集划分:训练集(train set)/验证集(validate set)/测试集(test set)
其中训练集用来调整模型参数,验证集用来调整超参数

  • 训练误差和泛化误差:
         训练误差 :模型在训练数据集上表现出的误差
         泛化误差 : 模型在任意一个测试数据样本上表现出的误差的期望,常常用测试数据集上的误差来近似。
         二者的计算都可使用损失函数(平方损失、交叉熵)
         机器学习模型应关注降低泛化误差

  • 模型选择:
          验证数据集:
            训练数据集、测试数据集以外的一部分数据。简称验证集。
    因不可从训练误差估计泛化误差,无法依赖训练数据调参(选择模型)。
          K折交叉验证:
            将原始训练数据集分割为K个不重合子数据集,之后做K次模型训练和验证。每次用一个子数据集验证模型,同时使用其他子数据集训练模型。最后将这K次训练误差以及验证误差各求平均数。

  • 过拟合和欠拟合:
      欠拟合:训练误差很低但是验证误差很高(数据不够或者参数太多)
      过拟合:训练集误差和验证集误差都很高(参数太少,拟合能力不够)
      影响因素:多种因素,而且实践中要尽力同时掌控欠拟合和过拟合。这有两个重要因素:模型复杂度、训练数据集大小。
      模型复杂度:在模型过于简单时,泛化误差和训练误差都很高——欠拟合。在模型过于复杂时,训练误差有了明显降低,但泛化误差会越来越高——过拟合。所以我们需要一个最佳值。
      解决过拟合的方法: 权重衰减(L2范数正则化) ,loss = loss + λ/2n|w|^2 ,同时需要修改优化器中权重迭代方式

  • DropOut
    当对该隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为 p ,那么有 p 的概率 hi 会被清零,有 1−p 的概率 hi 会除以 1−p 做拉伸。Dropout不改变输入的期望值。

  • 训练数据集大小:
       训练数据集大小是影响着欠拟合和过拟合的一个重要因素。一般情况下,训练数据集中样本过少,会发生过拟合。但泛化误差不会随着训练数据集样本数的增加而增大。故在计算资源许可范围内,尽量将训练数据集调大一些。在模型复杂度较高(如:层数较多的深度学习模型)效果很好。

  • 权重衰减:   
        方法:正则化通过为模型的损失函数加入惩罚项,从而令得出的模型参数值较小。
        权重衰减等价于L2范数正则化,经常用于应对过拟合现象。

  • L2范数正则化:
          在模型原损失函数基础上添加L2范数惩罚项,从而的发哦训练所需最小化的函数。
          L2范数惩罚项:模型权重参数每个元素的平方和与一个正的常数的乘积。

  • 丢弃法:
        方法:在隐藏层每个单元设置丢弃的概率,如:p。那么有 p 的单元的概率就会被清零,有1-p的概率的单元会被拉伸。
        丢弃法不改变输入的期望值。
        在测试模型时,为了拿到更加确定性的结果,一般不使用丢弃法。

提问

  • 为什么优化器中只对权重参数设置衰减,而不对偏置参数设置衰减呢?
    对偏置增加正则也是可以的,但是对偏置增加正则不会明显的产生很好的效果。而且偏置并不会像权重一样对数据非常敏感,所以不用担心偏置会学习到数据中的噪声。而且大的偏置也会使得我们的网络更加灵活,所以一般不对偏置做正则化。
    因为w通常是一个高维参数矢量,已经可以表达高偏差问题,w可能包含有很多参数,我们不可能拟合所有参数,而b只是单个数字,所以w几乎涵盖所有参数,而不是b,如果加了参数b,其实也没太大影响,因为b只是众多参数中的一个,所以通常省略不计,如果你想加上这个参数,完全没问题。
  • L2范数惩罚项通过惩罚绝对值较大的参数的方法来应对过拟合的。
    这里面的惩罚绝对值较大的参数是什么意思?
    L2范数正则化处理过拟合的手段是使参数变小,接近于零,越小的参数模型也就越简单,所以惩罚绝对值较大的参数
  • 按照最开始的说法,训练集,测试集(用来测试训练成果),验证集(用来训练超参数或者选择模型),但K折交叉验证为什么只有k-1个训练和1个验证,没有测试集?“。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。”那么这里的k次训练误差是哪里来的呢?
    正常的训练过程是分为训练数据和测试数据,但是如果只使用训练数据得到的模型效果不一定是最好的,所以在训练集中划分出验证集,训练集和验证集的划分有很多中,但是最常用的就是k折交叉验证,就是把训练数据分成k份,用其中的 k-1份训练模型,用剩下的一份来验证模型的泛化能力,循环操作,选择最佳的超参数组合,之后再用全部数据训练得到一个模型,再用测试数据来看模型的最终效果。
    一般情况下,测试集在训练过程中不可见,不用于训练
    在训练过程中,将部分训练集划分出作为验证集,来对模型进行评估
    K次训练误差来自于,每次取K个划分中的1个作为验证其余作为训练集进行训练+验证,进行K次,产生了k个训练误差
  • dropout的时候为什么要进行1-p的拉伸?
    假设dropout概率为p,那么每个节点被保留的概率是1-p
    以p=0.3为例,假如某一个全连接层有10个输入节点
    训练时启用dropout,因此理想情况是7个节点能够向后传递信息。
    而实际使用时不用dropout,因此10个节点能向后传递信息。
    因此输出节点接收到的信号强度是不一样的,为了平衡训练和预测时的这种量级差异。
    可以选择在训练的时候,对每个输入节点进行 除(1-p) 的操作,来进行“拉伸”

课外链接

对过拟合和欠拟合的理解:
https://www.bilibili.com/video/av86713932?p=2
使用正则化可以防止过拟合,比如Dropout、Batch Normalization等
对Dropout的理解:https://www.bilibili.com/video/av86713932?p=8
Dropout为什么能防止过拟合:打破神经网络之间的联合依赖适应性、化整为零、有性繁殖、相当于模型集成和数据增强

Task05:卷积神经网络基础;leNet;卷积神经网络进阶

二维卷积层:
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏置来得到输出。
class Conv2D(nn.Module):
def init(self, kernel_size):
super(Conv2D, self).init()
self.weight = nn.Parameter(torch.randn(kernel_size))
self.bias = nn.Parameter(torch.randn(1))
def forward(self, x):
return corr2d(x, self.weight) + self.bias
conv2d = Conv2D(kernel_size=(1, 2))
step = 30
lr = 0.01
for i in range(step):
Y_hat = conv2d(X)
l = ((Y_hat - Y) ** 2).sum()
l.backward()
梯度下降
conv2d.weight.data -= lr * conv2d.weight.grad
conv2d.bias.data -= lr * conv2d.bias.grad
梯度清零
conv2d.weight.grad.zero_()
conv2d.bias.grad.zero_()
if (i + 1) % 5 == 0:
print(‘Step %d, loss %.3f’ % (i + 1, l.item()))

卷积其实就是将许多部分的信息进行压缩,在过大维度矩阵的情况下,因为存在过多的信息,第一是为运算上带来了很多麻烦,第二是类似拿着显微镜看一幅画,难以捕捉其整体的信息。通过互相关运算将画拿远,慢慢感受他整体的信息。所以应该在卷积神经网络中把大矩阵缩小多少次,缩小到什么程度应该是个相当关键的问题。只有在能看清具体信息但又能把握整体信息的情况下,才能得到对图像更清楚地把握。
通过感受野这个概念能发现,经过互相关运算或者卷积运算之后的矩阵,应该每个位置都综合了之前感受野中的信息,所以某种意义上其实它们就是这个图片的特征。
第三个问题在 padding上,通过讲解大概理解是,padding的作用有1、保护边缘信息。2、控制输入输出维数相同。3、类似语言模型中对不满足规定大小的图片的补充。
第四个问题是步幅,我认为的步幅的作用是避免图像中间的信息过于频繁的被利用从而对图像中间信息关注过高,同时也是减小运算复杂程度的方法。但这个真的只是出于个人猜测2333 求大佬详解

提问

  • 8分40秒,老师提出问题
conv2d.weight.data -= lr * conv2d.weight.grad
conv2d.bias.data -= lr * conv2d.bias.grad

上面两行代码,如果删掉.data会发生什么?如果遇到一些问题,如何解决?
经测试:如果删掉.data,也就是代码变为:

conv2d.weight -= lr * conv2d.weight.grad
conv2d.bias -= lr * conv2d.bias.grad

会报错:RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.
这里给出一种解决方法:

with torch.no_grad():
    conv2d.weight -= lr * conv2d.weight.grad
    conv2d.bias -= lr * conv2d.bias.grad
  • 通过观察互相关运算可知,输入数据(这里以二维数组为例)的边缘部分相较于中间部分来说,使用的次数较少,对于一些存储重要信息的边缘数据来说,这无疑是重大的损失,这里可以通过填充来解决这一问题吗??也就是在输入数据的边缘填充0,使得原来的边缘数据中心化???
    padding解决不了这个问题,因为padding的内容其实是不包含信息量的0。
    这个问题感觉是个不错的思考~但是又感觉很奇怪,平时是遇不到这个问题的。
    比如给你一张狗的图片,shape 224224,你换成 222222,你不可能不认识它了。
    比如即使你使用77的大卷积核,损失的也仅仅是边缘的3个像素而已。
    更何况现在都是3
    3的卷积核,那1个像素是不会包含什么重要信息的。
  • 为什么两个连续的3×3卷积核的感受野与一个5×5卷积核的感受野相同?
    -比如一个7X7的图像,经过一次55的卷积核后形成一个33的特征图;
    同样一个7X7的图像,经过两次次33的卷积核后才形成形成一个33的特征图。
  • 例子中的Kernel都是固定值,但是再torch的nn.Conv2d()中只给出了kernel_size的值,这是为什么,是因为kernel value也是一个学习的变量吗
    kernel_size(即卷积核大小)这是需要人为设定的参数,该参数是不需要学习的,当然大小不同,卷积结果也是不同的。经过大量实验表明,大多选用11、33、5*5等尺寸较小且长宽为奇数的卷积核。
    对于卷积核内的数值(可以认为是对应卷积作用区域下像素值的权重大小),这个数值是需要学习。当给定kernel_size时,函数即会初始化该卷积核内的数值。
  • 卷积层和池化的区别?
    最大的区别是,池化层没有需要学习的特征
    卷积层用来学习识别某一种特征
    池化层的主要作用是降维
    卷积层当设置步长>1时也可以用来完成降维的工作
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!