浅谈多层感知机

多层感知机是一种可以使网络更好拟合复杂函数的机制。

隐藏层

简单的单层网络(如前文提到的线性回归)对比真正的深层神经网络有一个很大的不同:前者只能拟合出输入值和输出值之间的线性关系,而后者可以拟合逼近出任意的复杂函数关系。这其中的差别在于层数不同,也就是隐藏层(hidden layer)的存在与否。

在线性回归中,我们通过单个仿射变换 Y=Wx+b\mathbf{Y} = \mathbf{Wx} + \mathbf{b} 进行模型预测,由输入直接映射到输出。假设我们的目标关系是线性相关的(如之前学习时间和成绩的例子的假设),那么线性回归的确可以很好地处理这些问题。但是大部分的函数关系并不是线性的,例如拟合一个目标函数 y=x2+2xy = x^2 + 2x ,线性回归无法通过线性变换对其进行很好的拟合,损失始终会很大。

于是我们考虑在网络中加入一个或多个隐藏层来克服线性模型的限制。一个很朴素的方法是简单堆叠多个全连接层,最后一个隐藏层与输出层相连,这就构成了多层感知机(multilayer perceptron)。如下图就是一个有一层隐藏层的多层感知机的模式图。

mlp

我们来看一下多层感知机的计算过程。假定有样本 X\mathbf{X}隐藏表示 H\mathbf{H} 即隐藏层的输出为单隐藏层的输出,隐藏层权重为 W(1)\mathbf{W}^{(1)} ,偏置 b(1)\mathbf{b}^{(1)} ,输出层权重 W(2)\mathbf{W}^{(2)} ,偏置 b(2)\mathbf{b}^{(2)} ,多层感知机输出为 O\mathbf{O} ,则:

H=W(1)X+b(1),O=W(2)H+b(2). \mathbf{H} = \mathbf{W}^{(1)}\mathbf{X} + \mathbf{b}^{(1)},\\ \mathbf{O} = \mathbf{W}^{(2)}\mathbf{H} + \mathbf{b}^{(2)}.

但是不难发现,上述表达并没有对网络的既定线性关系做出本质的改变。上述网络仍可以等价于一个单层线性网络 O=W(1)W(2)X+b(1)W(2)+b(2)\mathbf{O} = \mathbf{W}^{(1)}\mathbf{W}^{(2)}\mathbf{X} + \mathbf{b}^{(1)}\mathbf{W}^{(2)} + \mathbf{b}^{(2)} 。这就需要我们引入一个新的机制:激活函数(activation function)σ\sigma 。其输出被称为活性值(activations)。那么上述的多层感知机网络变化为:

H=σ(W(1)X+b(1)),O=W(2)H+b(2). \begin{aligned} \mathbf{H} &= \sigma(\mathbf{W}^{(1)}\mathbf{X} + \mathbf{b}^{(1)}),\\ \mathbf{O} &= \mathbf{W}^{(2)}\mathbf{H} + \mathbf{b}^{(2)}. \end{aligned}

一般来讲,隐藏层经过激活函数的变换后,网络就不会退化为线性网络。当然,上述隐藏层也可以进行堆叠,增强模型的表达能力。

激活函数

那么使得网络具有非线性特征的激活函数是什么呢?

激活函数的本质是通过计算加权和并加上偏置确定神经元是否应该被激活,大多数都是非线性的。事实上,线性神经网络中也存在线性激活函数 σ(x)=x\sigma(x) = x 。激活函数的存在是深度学习网络能够学习复杂特征的基础。

sigmoid 函数

对于任意 xRx \in \mathbb{R} ,sigmoid 函数可以将其值压缩到 (0,1)(0, 1) 区间内。其定义为:

sigmoid(x)=11+exp(x). \operatorname{sigmoid}(x) = \frac{1}{1 + \exp(-x)}.

可以发现其与 softmax 函数(softmax(x)=exp(oj)kexp(ok)\operatorname{softmax}(x) = \frac{\exp(o_j)}{\sum_k\exp(o_k)})具有相似的运算性质。事实上,sigmoid 函数可以看作 softmax 函数的特例,在二分类问题上可以与 softmax 函数进行等价。

sigmoid

sigmoid-grad

上图是 sigmoid 函数和其导数的图像。可以发现,其在 xx 接近 00 时表现接近线性变换,此时具有较好的激活性;而在正负饱和区(x|x| 较大时)梯度接近 00 。这一缺陷将会导致训练中出现梯度消失,减缓模型的收敛速度。

tanh 函数

与 sigmoid 函数类似,tanh (双曲正切)函数也可以将 xx 压缩到有限区间 (1,1)(-1, 1) 上,其定义为:

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

tanh

tanh-grad

tanh 函数和其导数的图像如上图所示。其性质大体与 sigmoid 函数类似,但图像关于原点对称。这在前馈网络中是一个较好的性质,保证了信息在层间传递时均值为 00 ,使得模型训练收敛更快。

但同样地,tanh 函数也具有和 sigmoid 函数一样的梯度消失问题,在实践中很少使用。sigmoid 系激活函数的部分应用场景是循环神经网络。

ReLU 函数

最受欢迎的激活函数是 修正线性单元 (Rectified Linear Unit, ReLU)。其实现简单,且在多种预测任务中表现良好。其定义如下:

ReLU(x)=max(x,0). \operatorname{ReLU}(x) = \max(x, 0).

形象地来讲,ReLU 的作用在于屏蔽了 x<0x < 0 部分的输入,即单侧抑制。其函数和导数图像如图所示。

ReLU

ReLU-grad

下面简单探讨一下为什么 ReLU 具有比较优秀的性能。

可以发现,ReLU 函数在负半区的导数为 0 ,导致神经元不被激活。这将会使得网络具有稀疏性,提高了网络的计算效率。稀疏性的出现使得神经元只对输入信号的少部分选择性响应,其余的信号被刻意屏蔽了。这样可以提高学习精度,提高特征的鲁棒性,降低模型的过拟合风险。

同时,ReLU 并没有 sigmoid 系函数的正负饱和区,其梯度始终是 1 ,属于单端饱和,有效减轻了训练中的梯度消失问题。