多层感知机-MLP

1,865 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

MLP

是一种比较简单的神经网络模型,算是入门的基础模型。

神经元

神经网络的基本单元是神经元,一般叫做节点或者单元。如上图所示,每个单元都会从其他的单元接受输入或者外部输入,根据权重,计算输出。

img

其中x1,x2作为该节点的输入,其权重分别为 w1w2。同时,还有配有偏置 bbias)的输入。其中函数 f 叫做激活函数,一般采用非线性函数,主要作用让单元能够学习非线性函数。

结构

带有隐藏层的多层感知机。它含有一个隐藏层,该层中有5个隐藏单元

MLP结构如上图所示(来自李沐的动手学习深度学习),主要由三部分组成:

  • 输入层(Input Layer):接受数据作用,不进行任何计算,向下一层传递数据。
  • 隐藏层(Hidden Layer):这些节点计算输入层传递的信息,传递到输出层。至少有 一个隐藏层。
  • 输出层(Output Layer):负责计算,得出结果信息。

这个模型可以看作线性回归与逻辑回归的升级版,对回归问题能够解决的范围更广了。

整体模型就像一个错综复杂的网络连接在一起,每一个节点都相当于一个线性回归函数,具有着相关权重与偏置。

反向传播

其实 MLP 的反向传播的过程与线性回归,逻辑回归模型一致,只是变得更加模型,模型不是能够直接写的出来的函数表达式了。

img

其中 1 是指偏置,w4,w5,w6作为权重。

计算输出节点误差,将误差反向传播从输出层到达输入层,每一层的权重进行更新。

激活函数

为什么隐藏层一定要激活函数?

首先举个例子来进行解释:

假设构建一个单个隐藏层的多层感知机,设隐藏层输出为HH,权重参数WhW_{h},偏置bhb_{h},输出层OO,输入层为XX

虽然隐藏层单元未知,但是可以使用矩阵来解决,那么他们之间的计算过程:

H=XWh+bhO=HWo+bo\begin{aligned} \boldsymbol{H} &=\boldsymbol{X} \boldsymbol{W}_{h}+\boldsymbol{b}_{h} \\ \boldsymbol{O} &=\boldsymbol{H} \boldsymbol{W}_{o}+\boldsymbol{b}_{o} \end{aligned}

如果将两个式子结合起来就会得到:

O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo\boldsymbol{O}=\left(\boldsymbol{X} \boldsymbol{W}_{h}+\boldsymbol{b}_{h}\right) \boldsymbol{W}_{o}+\boldsymbol{b}_{o}=\boldsymbol{X} \boldsymbol{W}_{h} \boldsymbol{W}_{o}+\boldsymbol{b}_{h} \boldsymbol{W}_{o}+\boldsymbol{b}_{o}

虽然有了隐藏层但是依旧是一个线性回归模型,只不过权重变得更加复杂一点🙄,即使添加再多的隐藏层都是一个线性回归模型。

这就引出为什么会需要隐藏层的问题。

隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。

简单讲:我们将输入层信息,进行一次的线性划分,往下再传递信息,重复线性划分过程,不断将信息一步一步处理得出结果。

为什么需要使用激活函数?

  • 从之前公式来看不使用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合;
  • 使用激活函数,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到更多的非线性模型中。

常见激活函数:

  1. sigmoid 函数

优点:

  • Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。
  • 求导容易。

缺点:

  • 由于其软饱和性,容易产生梯度消失,导致训练出现问题。
  • 其输出并不是以0为中心的。
f(x)=11+exf(x)=\frac{1}{1+e^{-x}}

image.png

  1. tanh 函数

优点:

  • 比Sigmoid函数收敛速度更快。
  • 相比Sigmoid函数,其输出以0为中心。

缺点:

  • 还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
tanh(x)=1e2x1+e2x\tanh (x)=\frac{1-e^{-2 x}}{1+e^{-2 x}}

image.png

  1. ReLU

优点:

  • 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。
  • Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
  • 有效缓解了梯度消失的问题。
  • 在没有无监督预训练的时候也能有较好的表现。
  • 提供了神经网络的稀疏表达能力。

缺点:

  • 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
y={0(x0)x(x>0)y=\left\{\begin{array}{ll} 0 & (x \leq 0) \\ x & (x>0) \end{array}\right.

image.png

  1. Mish

经过ReLUSwish、Mish个不同激活函数后的输出对比,从中可以发现Mish相对于ReLUSwish显得更加平滑一些。

image.png

f(x)=xtanh(softplus(x))f ( x ) = x ∗ t a n h ( s o f t p l u s ( x ) )

image.png

总结

总体来讲MLP其实并不难,但是是一个入门的神经网络模型,更多要理解。至于怎么设计隐藏层和个数,我到没有一个可靠的方法,只能说推荐:

  • 选择常见的MLP模型的设计。
  • 隐藏层数目从单个开始尝试,获取最优。