Pytorch深度学习-理论篇:神经网络

从最简单的单层线性网络介绍神经网络的概念,同时然后再介绍通过激活函数实现更一般的网络,在其中阐述一些基本概念。

线性神经网络

神经网络图与神经网络

如图是一个简单的神经网络,输入为$x_1, …,x_d$,因此特征维度为$d$,网络的输出为$o_1$。
其中,$o_1 = (w_1 x_1+b_1)+…+(w_d x_d +b_d)$
对于一个具体的样本$(X, y)$,我们通过上式由输入$X$得到输出$o$,计量预测值$o$与真实值$y$之间的误差,不断寻找能使误差最小的$w$和$b$,即可进行良好的预测。这就是神经网络的基本思想。

神经网络图只显示连接模式,即只显示每个输⼊如何连接到输出,隐去了权重和偏置的值。

损失函数

损失函数(loss function)能够量化目标的实际值与预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为$0$。
在训练模型时,我们希望寻找⼀组参数$(w^∗, b^∗)$,这组参数能最小化在所有训练样本上的总损失。如下式:

解析解

解可以用一个公式简单地表达出来,这类解叫作解析解,如线性模型就有解析解。但大部分模型并不存在解析解。

随机梯度下降

梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。
但实际中的执行可能会⾮常慢:因为在每⼀次更新参数之前,我们必须遍历整个数据集。因此,我们通常会在每次需要计算更新的时候随机抽取⼀小批样本,这种变体叫做小批量随机梯度下降。

$B$表示每个小批量中的样本数,也称为批量大小(batch size)。$η$表示学习率(learning rate)。

算法的步骤如下:

  • 初始化模型参数的值
  • 从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这⼀步骤

正向传播与反向传播

正向传播就是根据输入得到输出的过程(即:$o_1 = (w_1 x_1+b_1)+…+(w_d x_d +b_d)$),其目的在于通过损失函数得到预测值与真实值的误差,相当于一个评估过程。

反向传播则是根据正向传播得到的预测值,对网络中的各个参数(即:$w$,$b$)进行梯度下降,其目的在于使模型不断接近收敛,相当于一个优化过程。

全连接层(稠密层)

每个输⼊都与每个输出相连,我们将这种变换称为全连接层(fully-connected layer)或称为稠密层(dense layer)。如图:

1.4中的图片也是全连接层。

矢量化加速

在训练我们的模型时,我们经常希望能够同时处理整个小批量的样本。为了实现这⼀点,我们需要利用线性代数库对计算进行矢量化,而不是在Python中编写开销⾼昂的for循环。

通过激活函数实现非线性变换

许多模型并非线性的,如果我们只通过仿射变换实现线性的模型,将会受到很大的限制。因此我们需要在神经网络中加入非线性元素。

加入隐藏层

我们可以通过在⽹络中加入⼀个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。要做到这⼀点,最简单的⽅法是将许多全连接层堆叠在⼀起。每⼀层都输出到上面的层,直到生成最后的输出。我们可以把前$L−1$层看作表⽰,把最后⼀层看作线性预测器。

加入激活函数

在仿射变换之后对每个隐藏单元应⽤非线性的
激活函数(activation function)σ。激活函数的输出(例如,σ(·))被称为活性值(activations)。
此时,图2.1的关系即为:

$H = \sigma (XW^{(1)}+b^{1})$
$O = XW^{(2)}+b^{2}$

我们可以继续堆叠这样的隐藏层,从⽽产⽣更有表达能⼒的模型。

激活函数

ReLU函数

最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU),因为它实现简单,同时在各种预测任务中表现良好。ReLU提供了⼀种⾮常简单的⾮线性变换。给定元素x,ReLU函数被定义为该元素与0的最⼤值:

$ReLU(x)=max(x,0)$

其函数图像和导数图像分别为:

sigmoid函数

对于一个定义域在$R$中的输⼊,sigmoid函数将输⼊变换为区间$(0, 1)$上的输出。因此,sigmoid通常称为挤压函数(squashing function):

$sigmoid(x) = \frac{1}{1+exp(-x)}$

其函数图像和导数图像分别为:

sigmoid在隐藏层中已经较少使用,它在⼤部分时候被更简单、更容易训练的ReLU所取代。

tanh函数

与sigmoid函数类似,tanh(双曲正切)函数也能将其输入压缩转换到区间$(-1, 1)$上。tanh函数的公式如下:

$tanh(x) = \frac{1-exp(-2x)}{1+exp(-2x)}$

其函数图像和导数图像分别为:

神经网络中的矩阵维数

以下图的神经网络为例。

未矢量化

这里我们假设样本是一个列向量,即图中输入为$(x_1, x_2)^T$,维数为$(2, 1)$;第一层网络为$(o_1^1, o_2^1, o_3^1)^T$,维数为$(3, 1)$,因此根据矩阵乘法可知,$W^1$应该是一个维数为$(3, 2)$的矩阵,即第一层每个神经元中的$w$应该形如$(w_1, w_2)$。
经过推到可以得出,对于$W^l$($l$指层数),其维度应该为$(n^l, n^{l-1})$($n$指神经元数量),$w^l_i$的形状为具有$n^{l-1}$的行向量。

矢量化

假设$X_i$为列向量,则输入矩阵为$(X_1, X_2,…,X_m)$,维数为$(2, m)$;第一层网络为$(O_1^1, O_2^1, O_3^1)^T$,维数为$(3, m)$。可以发现,$W$的维数并没有发生变化,只是神经网络中的特征矩阵发生了维度的叠加。

---------------------本文结束---------------------