【学习笔记】动手学深度学习task03

文章目录

  • 一、过拟合、欠拟合及其解决方案
    • 1.过拟合、欠拟合的概念
    • 2.模型选择
    • 3.权重衰减
      • 3.1 L2 范数正则化(regularization)
      • 3.2丢弃法(dropout)
  • 二、梯度消失、梯度爆炸
    • 1.梯度消失和梯度爆炸
    • 2.随机初始化模型参数
      • 2.1 为什么要随机初始化模型参数
      • 2.2 PyTorch的默认初始化方法
      • 2.3 Xavier随机初始化
    • 3.考虑环境因素
      • 3.1 协变量偏移
      • 3.2 标签偏移
      • 3.3 概念偏移
    • 4.习题解释
  • 三、循环神经网络进阶
    • 1.普通的RNN
    • 2.GRU
    • 3.LSTM
    • 4.模型强化
      • 4.1 深度循环神经网络
      • 4.2 双向循环神经网络

一、过拟合、欠拟合及其解决方案

1.过拟合、欠拟合的概念

训练误差指的是模型在训练数据集上表现出的误差;

泛化误差指的是模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。

如果训练误差大,称为欠拟合;如果训练误差小,泛化误差大称为过拟合

影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,例如层数较多的深度学习模型。

2.模型选择

测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参。这就引入了验证集的概念:

  • 通过预留一部分在训练数据集和测试数据集以外的数据来进行模型选择,例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。

K折交叉验证:在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。

3.权重衰减

3.1 L2 范数正则化(regularization)

L2 范数正则化在模型原损失函数基础上添加L2范数惩罚项,从而得到训练所需要最小化的函数。L2范数惩罚项指的是模型权重参数每个元素的平方和与一个正的常数的乘积。
在这里插入图片描述
【学习笔记】动手学深度学习task03_第1张图片
为什么正则化后,权重小的损失的更多,而权重大的则损失的少?

3.2丢弃法(dropout)

对隐藏层使用丢弃法时,该层的隐藏单元将有一定概率被丢弃掉。设丢弃概率为 p ,那么有 p 的概率 hi 会被清零,有 1−p 的概率 hi 会除以 1−p 做拉伸。丢弃概率是丢弃法的超参数。
由于在训练中隐藏层神经元的丢弃是随机的,所以输出层的计算无法过度依赖隐藏层神经元
代码实现:

#这里设置了两个丢弃概率,应用于两层隐藏层
drop_prob1, drop_prob2 = 0.2, 0.5

def net(X, is_training=True):
    X = X.view(-1, num_inputs)
    H1 = (torch.matmul(X, W1) + b1).relu()
    if is_training:  # 只在训练模型时使用丢弃法
        H1 = dropout(H1, drop_prob1)  # 在第一层全连接后添加丢弃层
    H2 = (torch.matmul(H1, W2) + b2).relu()
    if is_training:
        H2 = dropout(H2, drop_prob2)  # 在第二层全连接后添加丢弃层
    return torch.matmul(H2, W3) + b3

二、梯度消失、梯度爆炸

1.梯度消失和梯度爆炸

当神经网络的层数较多时,模型的数值稳定性容易变差。深度模型有关数值稳定性的典型问题是消失(vanishing)和爆炸(explosion)。
举个例子,假设输入和所有层的权重参数都是标量,如权重参数为0.2和5,多层感知机的第30层输出为输入 X 分别与 0.230≈1×10(−21) (消失)和 530≈9×1020 (爆炸)的乘积。当层数较多时,梯度的计算也容易出现消失或爆炸。

2.随机初始化模型参数

2.1 为什么要随机初始化模型参数

假设输出层只保留一个输出单元 o1 (删去 o2 和 o3 以及指向它们的箭头),且隐藏层使用相同的激活函数。如果将每个隐藏单元的参数都初始化为相等的值,那么在正向传播时每个隐藏单元将根据相同的输入计算出相同的值,并传递至输出层。在反向传播中,每个隐藏单元的参数梯度值相等。因此,这些参数在使用基于梯度的优化算法迭代后值依然相等。之后的迭代也是如此。在这种情况下,无论隐藏单元有多少,隐藏层本质上只有1个隐藏单元在发挥作用。因此,正如在前面的实验中所做的那样,我们通常将神经网络的模型参数,特别是权重参数,进行随机初始化。

2.2 PyTorch的默认初始化方法

  • torch.nn.init.constant(tensor, val)
  • torch.nn.init.normal(tensor, mean=0, std=1)
  • torch.nn.init.xavier_uniform(tensor, gain=1)
  • kaiming_uniform_(tensor, a=0, mode=‘fan_in’, nonlinearity=‘leaky_relu’)
  • ······

2.3 Xavier随机初始化

假设某全连接层的输入个数为 a ,输出个数为 b ,Xavier随机初始化将使该层中权重参数的每个元素都随机采样于均匀分布
在这里插入图片描述
它的设计主要考虑到,模型参数初始化后,每层输出的方差不该受该层输入个数影响,且每层梯度的方差也不该受该层输出个数影响。

3.考虑环境因素

3.1 协变量偏移

P(x)改变了,但P(y∣x)保持不变。测试时输入的特征可能发生改变。例如用卡通图片作为训练集训练猫狗的识别分类。在一个看起来与测试集有着本质不同的数据集上进行训练,而不考虑如何适应新的情况。

3.2 标签偏移

标签P(y)上的边缘分布的变化,但类条件分布是不变的P(x∣y)时,就会出现相反的问题。理解为测试集出现了训练集所没有的特征。

3.3 概念偏移

P(y∣x)可能因我们的位置而异。在概念转换中,即标签本身的定义发生变化的情况。例如美国软饮料名称在不同地区的概念不同。

4.习题解释

【学习笔记】动手学深度学习task03_第2张图片
【学习笔记】动手学深度学习task03_第3张图片
【学习笔记】动手学深度学习task03_第4张图片

三、循环神经网络进阶

这里推荐看子豪兄的视频有助理解循环神经网络

梯度爆炸可以使用梯度裁剪的方法来解决,这方法并不能使用于梯度消失,所以引入了门控循环神经网络,它能一定程度缓解梯度消失与梯度爆炸的问题。

1.普通的RNN

【学习笔记】动手学深度学习task03_第5张图片

2.GRU

【学习笔记】动手学深度学习task03_第6张图片

  • 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
  • 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。

3.LSTM

长短期记忆long short-term memory :

  • 遗忘门:控制上一时间步的记忆细胞
  • 输入门:控制当前时间步的输入
  • 输出门:控制从记忆细胞到隐藏状态
  • 记忆细胞:⼀种特殊的隐藏状态的信息的流动
    【学习笔记】动手学深度学习task03_第7张图片

4.模型强化

4.1 深度循环神经网络

把每层的隐含状态当作下一层的输入,注意深度不是越深越好
【学习笔记】动手学深度学习task03_第8张图片

4.2 双向循环神经网络

例如一个语句,单向的只考虑前面的字对这个字的影响,双向的回考虑后面的字对这个字的影响。
【学习笔记】动手学深度学习task03_第9张图片

你可能感兴趣的:(深度学习)