MLP(1)--算法
多层感知机
多层感知机故名思义,在之前的线性模型(linear、softmax)基础上,增加了网络的层数。这也是深度学习的基础。
线性模型的局限
表达能力不足
当处理数学计算的时候,线性模型理论上能模拟任何函数,这是没问题的,但是如果目标变成图像识别,图像上的像素值大小与这张图片是猫还是狗很明显没有什么关系,随着像素值大小的增加,输出不会有对应的意义【线性模型输入输出是单调的关系】。
走向非线性
增加模型层数
我们可以通过在网络中加入一个或多个隐藏层来克服线性模型的限制, 使其能处理更普遍的函数关系类型。 要做到这一点,最简单的方法是将许多全连接层堆叠在一起。 每一层都输出到上面的层,直到生成最后的输出。 我们可以把前$L-1$层看作表示,把最后一层看作线性预测器。 这种架构通常称为多层感知机(multilayer perceptron),通常缩写为MLP。
增加激活函数
然而单纯增加层数并不能解决问题:实际上多层的affine能够被一层affine等价替换:
我们可以证明这一等价性,即对于任意权重值, 我们只需合并隐藏层,便可产生具有参数 $\mathbf{W} = \mathbf{W}^{(1)}\mathbf{W}^{(2)}$ 和 $\mathbf{b} = \mathbf{b}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)}$ 的等价单层模型:
$$ \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}. $$
所以我们需要在每层的连接处增加激活函数来提供非线性的特性:
在仿射变换之后对每个隐藏单元应用非线性的激活函数(activation function)$\sigma$。 激活函数的输出(例如,$\sigma(\cdot)$)被称为活性值(activations)。 一般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型:
$$ \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} $$
由于$\mathbf{X}$中的每一行对应于小批量中的一个样本, 出于记号习惯的考量, 我们定义非线性函数$\sigma$也以按行的方式作用于其输入, 即一次计算一个样本。
激活函数可以按照元素的颗粒度来计算,也就是说计算一个单元的输出,不需要用到其他单元的信息,这非常好,大多数激活函数都是如此。
为了构建更通用的多层感知机, 我们可以继续堆叠这样的隐藏层, 例如$\mathbf{H}^{(1)} = \sigma_1(\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)})$和$\mathbf{H}^{(2)} = \sigma_2(\mathbf{H}^{(1)} \mathbf{W}^{(2)} + \mathbf{b}^{(2)})$, 一层叠一层,从而产生更有表达能力的模型。
激活函数
ReLU函数
最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU), 因为它实现简单,同时在各种预测任务中表现良好。 [ReLU提供了一种非常简单的非线性变换]。 给定元素$x$,ReLU函数被定义为该元素与$0$的最大值:
($$\operatorname{ReLU}(x) = \max(x, 0).$$)
通俗地说,ReLU函数通过将相应的活性值设为0,仅保留正元素并丢弃所有负元素。 当输入为负时,ReLU函数的导数为0,而当输入为正时,ReLU函数的导数为1。
使用ReLU的原因是,它求导表现得特别好:要么让参数消失,要么让参数通过。 这使得优化表现得更好,并且ReLU减轻了困扰以往神经网络的梯度消失问题(稍后将详细介绍)。
注意,ReLU函数有许多变体,包括参数化ReLU(Parameterized ReLU,pReLU) 该变体为ReLU添加了一个线性项,因此即使参数是负的,某些信息仍然可以通过:
$$\operatorname{pReLU}(x) = \max(0, x) + \alpha \min(0, x).$$
sigmoid函数
[对于一个定义域在$\mathbb{R}$中的输入, sigmoid函数将输入变换为区间(0, 1)上的输出]。 因此,sigmoid通常称为挤压函数(squashing function): 它将范围(-inf, inf)中的任意输入压缩到区间(0, 1)中的某个值:
($$\operatorname{sigmoid}(x) = \frac{1}{1 + \exp(-x)}.$$)
在最早的神经网络中,科学家们感兴趣的是对“激发”或“不激发”的生物神经元进行建模。 因此,这一领域的先驱可以一直追溯到人工神经元的发明者麦卡洛克和皮茨,他们专注于阈值单元。 阈值单元在其输入低于某个阈值时取值0,当输入超过阈值时取值1。
当人们逐渐关注到到基于梯度的学习时, sigmoid函数是一个自然的选择,因为它是一个平滑的、可微的阈值单元近似。
当我们想要将输出视作二元分类问题的概率时, sigmoid仍然被广泛用作输出单元上的激活函数 (sigmoid可以视为softmax的特例)。 然而,sigmoid在隐藏层中已经较少使用, 它在大部分时候被更简单、更容易训练的ReLU所取代。
sigmoid函数的导数为下面的公式:
$$\frac{d}{dx} \operatorname{sigmoid}(x) = \frac{\exp(-x)}{(1 + \exp(-x))^2} = \operatorname{sigmoid}(x)\left(1-\operatorname{sigmoid}(x)\right).$$
sigmoid函数的导数图像如下所示。 注意,当输入为0时,sigmoid函数的导数达到最大值0.25; 而输入在任一方向上越远离0点时,导数越接近0。
tanh函数
与sigmoid函数类似, [tanh(双曲正切)函数也能将其输入压缩转换到区间(-1, 1)上]。 tanh函数的公式如下:
($$\operatorname{tanh}(x) = \frac{1 - \exp(-2x)}{1 + \exp(-2x)}.$$)
函数的形状类似于sigmoid函数, 不同的是tanh函数关于坐标系原点中心对称。
tanh函数的导数是:
$$\frac{d}{dx} \operatorname{tanh}(x) = 1 - \operatorname{tanh}^2(x).$$
tanh函数的导数图像如下所示。 当输入接近0时,tanh函数的导数接近最大值1。 与我们在sigmoid函数图像中看到的类似, 输入在任一方向上越远离0点,导数越接近0。