携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
MLP
是一种比较简单的神经网络模型,算是入门的基础模型。
神经元
神经网络的基本单元是神经元,一般叫做节点或者单元。如上图所示,每个单元都会从其他的单元接受输入或者外部输入,根据权重,计算输出。
其中x1,x2作为该节点的输入,其权重分别为 w1 和 w2。同时,还有配有偏置 b(bias)的输入。其中函数 f 叫做激活函数,一般采用非线性函数,主要作用让单元能够学习非线性函数。
结构
MLP结构如上图所示(来自李沐的动手学习深度学习),主要由三部分组成:
- 输入层(Input Layer):接受数据作用,不进行任何计算,向下一层传递数据。
- 隐藏层(Hidden Layer):这些节点计算输入层传递的信息,传递到输出层。至少有 一个隐藏层。
- 输出层(Output Layer):负责计算,得出结果信息。
这个模型可以看作线性回归与逻辑回归的升级版,对回归问题能够解决的范围更广了。
整体模型就像一个错综复杂的网络连接在一起,每一个节点都相当于一个线性回归函数,具有着相关权重与偏置。
反向传播
其实 MLP 的反向传播的过程与线性回归,逻辑回归模型一致,只是变得更加模型,模型不是能够直接写的出来的函数表达式了。
其中 1 是指偏置,w4,w5,w6作为权重。
计算输出节点误差,将误差反向传播从输出层到达输入层,每一层的权重进行更新。
激活函数
为什么隐藏层一定要激活函数?
首先举个例子来进行解释:
假设构建一个单个隐藏层的多层感知机,设隐藏层输出为,权重参数,偏置,输出层,输入层为。
虽然隐藏层单元未知,但是可以使用矩阵来解决,那么他们之间的计算过程:
如果将两个式子结合起来就会得到:
虽然有了隐藏层但是依旧是一个线性回归模型,只不过权重变得更加复杂一点🙄,即使添加再多的隐藏层都是一个线性回归模型。
这就引出为什么会需要隐藏层的问题。
隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。
简单讲:我们将输入层信息,进行一次的线性划分,往下再传递信息,重复线性划分过程,不断将信息一步一步处理得出结果。
为什么需要使用激活函数?
- 从之前公式来看不使用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合;
- 使用激活函数,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到更多的非线性模型中。
常见激活函数:
sigmoid函数
优点:
- Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。
- 求导容易。
缺点:
- 由于其软饱和性,容易产生梯度消失,导致训练出现问题。
- 其输出并不是以0为中心的。
tanh函数
优点:
- 比Sigmoid函数收敛速度更快。
- 相比Sigmoid函数,其输出以0为中心。
缺点:
- 还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
ReLU
优点:
- 相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。
- Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
- 有效缓解了梯度消失的问题。
- 在没有无监督预训练的时候也能有较好的表现。
- 提供了神经网络的稀疏表达能力。
缺点:
- 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
Mish
经过ReLU、Swish、Mish三个不同激活函数后的输出对比,从中可以发现Mish相对于ReLU、Swish显得更加平滑一些。
总结
总体来讲MLP其实并不难,但是是一个入门的神经网络模型,更多要理解。至于怎么设计隐藏层和个数,我到没有一个可靠的方法,只能说推荐:
- 选择常见的MLP模型的设计。
- 隐藏层数目从单个开始尝试,获取最优。