小白学习深度学习之(三)——多层感知机

mlp

  • 隐藏层
  • 从线性到非线性
  • 通用近似定理
  • 多层感知机的简洁实现
    • 模型
  • K折交叉验证
  • 泛化误差、训练误差、欠拟合、过拟合
  • 权重衰减
  • 暂退法(Dropout)

在学习完线性回归和softmax回归后,我们开始对深度神经网络的的探索,这次我们将要介绍的是多层感知机

隐藏层

我们在之前描述了仿射变换,它是一种带有偏置值的线性变换。我们可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前 −1 层看作表示,把最后一层看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。 下面,我们以图的方式描述了多层感知机
小白学习深度学习之(三)——多层感知机_第1张图片
这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。 输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。 因此,这个多层感知机中的层数为2。 注意,这两个层都是全连接的。 每个输入都会影响隐藏层中的每个神经元, 而隐藏层中的每个神经元又会影响输出层中的每个神经元。

从线性到非线性

同之前的章节一样,我们通过矩阵∈ℝ×来表示 个样本的小批量, 其中每个样本具有 个输入特征。 对于具有 ℎ 个隐藏单元的单隐藏层多层感知机, 用 ∈ℝ×ℎ 表示隐藏层的输出, 称为隐藏表示(hidden representations)。 在数学或代码中,
也被称为隐藏层变量(hidden-layer variable) 或隐藏变量(hidden variable)。 因为隐藏层和输出层都是全连接的, 所以我们有隐藏层权重 (1)∈ℝ×ℎ 和隐藏层偏置 (1)∈ℝ1×ℎ 以及输出层权重 (2)∈ℝℎ× 和输出层偏置 (2)∈ℝ1× 。 形式上,我们按如下方式计算单隐藏层多层感知机的输出 ∈ℝ× :
H = X W ( 1 ) + b ( 1 ) , O = H W ( 2 ) + b ( 2 ) . \begin{aligned} \mathbf{H} & = \mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}, \\ \mathbf{O} & = \mathbf{H}\mathbf{W}^{(2)} + \mathbf{b}^{(2)}. \end{aligned} HO=XW(1)+b(1),=HW(2)+b(2).
但是这样会产生一个问题,实际上这样的结果是一致的,那么如何来证明他们是一致的,如下图
O = ( X W ( 1 ) + b ( 1 ) ) W ( 2 ) + b ( 2 ) = X W ( 1 ) W ( 2 ) + b ( 1 ) W ( 2 ) + b ( 2 ) = X W + b . \mathbf{O} = (\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)})\mathbf{W}^{(2)} + \mathbf{b}^{(2)} = \mathbf{X} \mathbf{W}^{(1)}\mathbf{W}^{(2)} + \mathbf{b}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)} = \mathbf{X} \mathbf{W} + \mathbf{b}. O=(XW(1)+b(1))W(2)+b(2)=XW(1)W(2)+b(1)W(2)+b(2)=XW+b.
为了发挥多层架构的潜力,我们还需要一个额外的关键要素:在仿射变换后对每个隐藏单元应用非线性的激活函数。激活函数的输出被称为活性值。一般来说,有了激活函数,就不可能再将多层感知机退化为线性模型
H = σ ( X W ( 1 ) + b ( 1 ) ) , O = H W ( 2 ) + b ( 2 ) . \begin{aligned} \mathbf{H} & = \sigma(\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)}), \\ \mathbf{O} & = \mathbf{H}\mathbf{W}^{(2)} + \mathbf{b}^{(2)}.\\ \end{aligned} HO=σ(XW(1)+b(1)),=HW(2)+b(2).

通用近似定理

多层感知机可以通过隐藏神经元,捕捉到输入之间复杂的相互作用, 这些神经元依赖于每个输入的值。 我们可以很容易地设计隐藏节点来执行任意计算。 例如,在一对输入上进行基本逻辑操作,多层感知机是通用近似器。 即使是网络只有一个隐藏层,给定足够的神经元和正确的权重, 我们可以对任意函数建模,尽管实际中学习该函数是很困难的。 神经网络有点像C语言。 C语言和任何其他现代编程语言一样,能够表达任何可计算的程序。 但实际上,想出一个符合规范的程序才是最困难的部分。

而且,虽然一个单隐层网络能学习任何函数, 但并不意味着我们应该尝试使用单隐藏层网络来解决所有问题。 事实上,通过使用更深(而不是更广)的网络,我们可以更容易地逼近许多函数。 我们将在后面的章节中进行更细致的讨论。

多层感知机的简洁实现

下面用高级API更简洁地实现多层感知机

import torch
from torch import nn
from d2l import torch as d2l

模型

与sorftmax回归地简洁实现下相比,唯一的区别是我们添加了2个全连接层。第一层是隐藏层,它包含了256个隐藏单元,并使用ReLU激活函数。第二层为输出层。

net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

训练过程的实现与我们实现softmax回归时完全相同,这种模块化设计使我们能够将与模型架构相关的内容独立出来

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

K折交叉验证

当训练数据稀缺时,我们甚至可能无法提供足够的数据来构成一个合适的验证集。 这个问题的一个流行的解决方案是采用 折交叉验证。 这里,原始训练数据被分成 个不重叠的子集。 然后执行 次模型训练和验证,每次在 −1 个子集上进行训练, 并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。 最后,通过对 次实验的结果取平均来估计训练和验证误差。

泛化误差、训练误差、欠拟合、过拟合

小白学习深度学习之(三)——多层感知机_第2张图片

权重衰减

weight decay是一个正则化技术,作用是抑制模型的过拟合,以此来提高模型的泛化性。

正则化:正则化的目标是减小方差或是说减小数据扰动所造成的影响。 我们来看下图来理解一下这句话
小白学习深度学习之(三)——多层感知机_第3张图片
权重衰减(Weight Decay)就是减小模型的权重大小,而减小模型的权重大小就可以降低模型的复杂度,使模型变得平滑,进而减小过拟合。模型权重数值越小,模型的复杂度越低

上面说了Weight Decay目的是要让模型权重小一点(控制在某一个范围内),以此来减小模型的复杂性,从而抑制过拟合。
而Weight Decay的具体做法就是在Loss后面增加一个权重的L2范数惩罚项。

一种简单的方法是通过线性函数 f ( x ) = w ⊤ x f(\mathbf{x}) = \mathbf{w}^\top \mathbf{x} f(x)=wx中的权重向量的某个范数来度量其复杂性,例如 ∥ w ∥ 2 \| \mathbf{w} \|^2 w2。要保证权重向量比较小,最常用方法是将其范数作为惩罚项加到最小化损失的问题中。将原来的训练目标最小化训练标签上的预测损失,调整为最小化预测损失和惩罚项之和。现在,如果我们的权重向量增长的太大,我们的学习算法可能会更集中于最小化权重范数 ∥ w ∥ 2 \| \mathbf{w} \|^2 w2。这正是我们想要的。让我们回顾一下 :numref:sec_linear_regression中的线性回归例子。我们的损失由下式给出:
L ( w , b ) = 1 n ∑ i = 1 n 1 2 ( w ⊤ x ( i ) + b − y ( i ) ) 2 . L(\mathbf{w}, b) = \frac{1}{n}\sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2. L(w,b)=n1i=1n21(wx(i)+by(i))2.

暂退法(Dropout)

暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。 这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。
h ′ = { 0  概率为  p h 1 − p  其他情况 \begin{aligned} h' = \begin{cases} 0 & \text{ 概率为 } p \\ \frac{h}{1-p} & \text{ 其他情况} \end{cases} \end{aligned} h={01ph 概率为 p 其他情况
小白学习深度学习之(三)——多层感知机_第4张图片

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