动手学深度学习 第四章 多层感知机 练习(Pytorch版)

多层感知机

小结

  • 多层感知机在输出层和输入层之间增加一个或多个全连接隐藏层,并通过激活函数转换隐藏层的输出。
  • 常用的激活函数包括ReLU函数、sigmoid函数和tanh函数。

练习

  1. 计算pReLU激活函数的导数。
  2. 证明一个仅使用ReLU(或pReLU)的多层感知机构造了一个连续的分段线性函数。
  3. 证明 tanh ⁡ ( x ) + 1 = 2 sigmoid ⁡ ( 2 x ) \operatorname{tanh}(x) + 1 = 2 \operatorname{sigmoid}(2x) tanh(x)+1=2sigmoid(2x)
  4. 假设我们有一个非线性单元,将它一次应用于一个小批量的数据。你认为这会导致什么样的问题?

  1. ∂ ∂ x ( max ⁡ ( x , 0 ) + α min ⁡ ( 0 , x ) ) = { 1 x > 0 α x < 0  indeterminate   (otherwise)  \frac{\partial}{\partial x}(\max (x, 0)+\alpha \min (0, x))= \begin{cases}1 & x>0 \\ \alpha & x<0 \\ \text { indeterminate } & \text { (otherwise) }\end{cases} x(max(x,0)+αmin(0,x))=1α indeterminate x>0x<0 (otherwise) 

  2. 个人理解:每层ReLU产生一个分段,且仅在每个分段中使用ReLU激活函数时进行的都是线性变换。(当然,ReLU整体不是线性的,是多分段线性)
    H = R e L U ( X W ( 1 ) + b ( 1 ) ) O = H W ( 2 ) + b ( 2 ) \begin{aligned} &\mathbf{H}=ReLU\left(\mathbf{X} \mathbf{W}^{(1)}+\mathbf{b}^{(1)}\right) \\ &\mathbf{O}=\mathbf{H} \mathbf{W}^{(2)}+\mathbf{b}^{(2)} \end{aligned} H=ReLU(XW(1)+b(1))O=HW(2)+b(2)

    Relu(x)是关于 x ∈ R x \in R xR的连续分段函数,所以 R e l u ( R e l u ( x ) W + b ) Relu(Relu(x)W+b) Relu(Relu(x)W+b)也是连续的分段线性函数

  3. tanh ⁡ ( x ) = 1 − exp ⁡ ( − 2 x ) 1 + exp ⁡ ( − 2 x ) , sigmoid ⁡ = 1 1 + exp ⁡ ( − x ) tanh ⁡ ( x ) + 1 = 2 1 + exp ⁡ ( − 2 x ) 2 sigmoid ⁡ ( 2 x ) = 2 1 + exp ⁡ ( − 2 x ) ∴ tanh ⁡ ( x ) + 1 = 2 sigmoid ⁡ ( 2 x ) \begin{aligned} & \tanh (x)=\frac{1-\exp (-2 x)}{1+\exp (-2 x)}, \quad \operatorname{sigmoid}=\frac{1}{1+\exp (-x)} \\ & \tanh (x)+1=\frac{2}{1+\exp (-2 x)} \\ 2 & \operatorname{sigmoid}(2 x)=\frac{2}{1+\exp (-2 x)} \\ \therefore & \tanh (x)+1=2 \operatorname{sigmoid}(2 x) \end{aligned} 2tanh(x)=1+exp(2x)1exp(2x),sigmoid=1+exp(x)1tanh(x)+1=1+exp(2x)2sigmoid(2x)=1+exp(2x)2tanh(x)+1=2sigmoid(2x)

  4. 正向和反向传播的时间消耗会很高。数据的分布会有所变化。(本题不确定)

多层感知机的从零开始实现

小结

  • 手动实现一个简单的多层感知机是很容易的。然而如果有大量的层,从零开始实现多层感知机会变得很麻烦(例如,要命名和记录模型的参数)。

练习

  1. 在所有其他参数保持不变的情况下,更改超参数num_hiddens的值,并查看此超参数的变化对结果有何影响。确定此超参数的最佳值。
  2. 尝试添加更多的隐藏层,并查看它对结果有何影响。
  3. 改变学习速率会如何影响结果?保持模型架构和其他超参数(包括轮数)不变,学习率设置为多少会带来最好的结果?
  4. 通过对所有超参数(学习率、轮数、隐藏层数、每层的隐藏单元数)进行联合优化,可以得到的最佳结果是什么?
  5. 描述为什么涉及多个超参数更具挑战性。
  6. 如果要构建多个超参数的搜索方法,你能想到的最聪明的策略是什么?

1 . 不同隐藏单元个数对应的模型效果:
num_hiddens=128 num_hiddens=1024 num_hiddens=512 num_hiddens=64
2 . 增加隐藏层,效果变好了。使用256,64的两个隐藏层
在这里插入图片描述
3 . 其余不变,学习率为0.3时效果较好
在这里插入图片描述

4 . 可以增加层数/改变学习率/改变神经元个数试一下
5 . 不同超参数组合可能得到不同的结果,无法单独调整某个参数,而是都需要调整,可能出现的情况有很多。
6 . 网格搜索?

多层感知机的简洁实现

小结

  • 我们可以使用高级API更简洁地实现多层感知机。
  • 对于相同的分类问题,多层感知机的实现与softmax回归的实现相同,只是多层感知机的实现里增加了带有激活函数的隐藏层。

练习

  1. 尝试添加不同数量的隐藏层(也可以修改学习率),怎么样设置效果最好?
  2. 尝试不同的激活函数,哪个效果最好?
  3. 尝试不同的方案来初始化权重,什么方法效果最好?

3 . 随机初始化

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

小结

  • 欠拟合是指模型无法继续减少训练误差。过拟合是指训练误差远小于验证误差。
  • 由于不能基于训练误差来估计泛化误差,因此简单地最小化训练误差并不一定意味着泛化误差的减小。机器学习模型需要注意防止过拟合,即防止泛化误差过大。
  • 验证集可以用于模型选择,但不能过于随意地使用它。
  • 我们应该选择一个复杂度适当的模型,避免使用数量不足的训练样本。

练习

  1. 你能准确地解出这个多项式回归问题吗?提示:使用线性代数。
  2. 考虑多项式的模型选择:
    1. 绘制训练损失与模型复杂度(多项式的阶数)的关系图。你观察到了什么?需要多少阶的多项式才能将训练损失减少到0?
    2. 在这种情况下绘制测试的损失图。
    3. 生成同样的图,作为数据量的函数。
  3. 如果你不对多项式特征 x i x^i xi进行标准化( 1 / i ! 1/i! 1/i!),会发生什么事情?你能用其他方法解决这个问题吗?
  4. 你能期待看到泛化误差为零吗?

权重衰减

小结

  • 正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。
  • 保持模型简单的一个特别的选择是使用 L 2 L_2 L2惩罚的权重衰减。这会导致学习算法更新步骤中的权重衰减。
  • 权重衰减功能在深度学习框架的优化器中提供。
  • 在同一训练代码实现中,不同的参数集可以有不同的更新行为。

练习

  1. 在本节的估计问题中使用 λ \lambda λ的值进行实验。绘制训练和测试精度关于 λ \lambda λ的函数。你观察到了什么?
  2. 使用验证集来找到最佳值 λ \lambda λ。它真的是最优值吗?这有关系吗?
  3. 如果我们使用 ∑ i ∣ w i ∣ \sum_i |w_i| iwi作为我们选择的惩罚( L 1 L_1 L1正则化),那么更新方程会是什么样子?
  4. 我们知道 ∥ w ∥ 2 = w ⊤ w \|\mathbf{w}\|^2 = \mathbf{w}^\top \mathbf{w} w2=ww。你能找到类似的矩阵方程吗(见 :numref:subsec_lin-algebra-norms 中的Frobenius范数)?
  5. 回顾训练误差和泛化误差之间的关系。除了权重衰减、增加训练数据、使用适当复杂度的模型之外,你还能想出其他什么方法来处理过拟合?
  6. 在贝叶斯统计中,我们使用先验和似然的乘积,通过公式 P ( w ∣ x ) ∝ P ( x ∣ w ) P ( w ) P(w \mid x) \propto P(x \mid w) P(w) P(wx)P(xw)P(w)得到后验。如何得到带正则化的 P ( w ) P(w) P(w)

暂退法(Dropout)

小结

  • 暂退法在前向传播过程中,计算每一内部层的同时丢弃一些神经元。
  • 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。
  • 暂退法将活性值 h h h替换为具有期望值 h h h的随机变量。
  • 暂退法仅在训练期间使用。

练习

  1. 如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述你的结果,并总结定性的结论。
  2. 增加训练轮数,并将使用暂退法和不使用暂退法时获得的结果进行比较。
  3. 当应用或不应用暂退法时,每个隐藏层中激活值的方差是多少?绘制一个曲线图,以显示这两个模型的每个隐藏层中激活值的方差是如何随时间变化的。
  4. 为什么在测试时通常不使用暂退法?
  5. 以本节中的模型为例,比较使用暂退法和权重衰减的效果。如果同时使用暂退法和权重衰减,会发生什么情况?结果是累加的吗?收益是否减少(或者说更糟)?它们互相抵消了吗?
  6. 如果我们将暂退法应用到权重矩阵的各个权重,而不是激活值,会发生什么?
  7. 发明另一种用于在每一层注入随机噪声的技术,该技术不同于标准的暂退法技术。尝试开发一种在Fashion-MNIST数据集(对于固定架构)上性能优于暂退法的方法。

前向传播、反向传播和计算图

小结

  • 前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。
  • 反向传播按相反的顺序(从输出层到输入层)计算和存储神经网络的中间变量和参数的梯度。
  • 在训练深度学习模型时,前向传播和反向传播是相互依赖的。
  • 训练比预测需要更多的内存。

练习

  1. 假设一些标量函数 X \mathbf{X} X的输入 X \mathbf{X} X n × m n \times m n×m矩阵。 f f f相对于 X \mathbf{X} X的梯度维数是多少?
  2. 向本节中描述的模型的隐藏层添加偏置项(不需要在正则化项中包含偏置项)。
    1. 画出相应的计算图。
    2. 推导正向和反向传播方程。
  3. 计算本节所描述的模型,用于训练和预测的内存占用。
  4. 假设你想计算二阶导数。计算图发生了什么?你预计计算需要多长时间?
  5. 假设计算图对于你的GPU来说太大了。
    1. 你能把它划分到多个GPU上吗?
    2. 与小批量训练相比,有哪些优点和缺点?

数值稳定性和模型初始化

小结

  • 梯度消失和梯度爆炸是深度网络中常见的问题。在参数初始化时需要非常小心,以确保梯度和参数可以得到很好的控制。
  • 需要用启发式的初始化方法来确保初始梯度既不太大也不太小。
  • ReLU激活函数缓解了梯度消失问题,这样可以加速收敛。
  • 随机初始化是保证在进行优化前打破对称性的关键。
  • Xavier初始化表明,对于每一层,输出的方差不受输入数量的影响,任何梯度的方差不受输出数量的影响。

练习

  1. 除了多层感知机的排列对称性之外,你能设计出其他神经网络可能会表现出对称性且需要被打破的情况吗?
  2. 我们是否可以将线性回归或softmax回归中的所有权重参数初始化为相同的值?
  3. 在相关资料中查找两个矩阵乘积特征值的解析界。这对确保梯度条件合适有什么启示?
  4. 如果我们知道某些项是发散的,我们能在事后修正吗?看看关于按层自适应速率缩放的论文 :cite:You.Gitman.Ginsburg.2017

环境和分布偏移

小结

  • 在许多情况下,训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。
  • 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而,这个数据总体通常是无法获得的。经验风险是训练数据的平均损失,用于近似真实风险。在实践中,我们进行经验风险最小化。
  • 在相应的假设条件下,可以在测试时检测并纠正协变量偏移和标签偏移。在测试时,不考虑这种偏移可能会成为问题。
  • 在某些情况下,环境可能会记住自动操作并以令人惊讶的方式做出响应。在构建模型时,我们必须考虑到这种可能性,并继续监控实时系统,并对我们的模型和环境以意想不到的方式纠缠在一起的可能性持开放态度。

练习

  1. 当我们改变搜索引擎的行为时会发生什么?用户可能会做什么?广告商呢?
  2. 实现一个协变量偏移检测器。提示:构建一个分类器。
  3. 实现协变量偏移纠正。
  4. 除了分布偏移,还有什么会影响经验风险接近真实风险的程度?
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值