深度学习之多层感知器

1.概念

多层感知器(Multilayer Perceptron,MLP)是一种常见的人工神经网络模型,也是最早被广泛应用的神经网络模型之一。它由输入层、若干个隐藏层和一个输出层组成,其中每个层都由多个神经元组成。每个神经元接收来自前一层的输入,并通过激活函数将这些输入加权求和,得到自己的输出。多层感知器通过反向传播算法来训练,使得其输出能够与训练集中的目标输出尽可能接近,从而实现分类、回归等任务。多层感知器具有较强的非线性建模能力,可以处理复杂的非线性问题。

2.原理

多层感知器的实现原理是基于神经元之间的连接和权重的调整。在多层感知器中,神经元之间的连接形成了一个有向图,其中每条边表示两个神经元之间的连接。每个神经元都有一个输出值,该值是由它的输入值和权重值的加权和经过激活函数计算得出的。

在训练过程中,多层感知器通过反向传播算法来更新神经元之间的权重,从而使得模型能够更好地拟合训练数据。具体地,反向传播算法将误差从输出层向输入层逐层传递,通过链式法则计算每个神经元对误差的贡献,并根据这些贡献来更新权重值。

  1. 多层感知器的实现过程可以分为以下几个步骤:

  2. 初始化网络参数,包括权重和偏置值。

  3. 通过前向传播计算网络的输出值。

  4. 计算输出层的误差,并通过反向传播逐层计算每个神经元对误差的贡献。

  5. 根据贡献值更新网络的权重和偏置值。

重复上述步骤直至达到收敛条件。

通过这些步骤,多层感知器可以逐步优化网络的参数,提高模型的准确性和泛化能力。

3.例子

假设我们要用多层感知器来解决一个二元分类问题,即根据两个特征值 \(x_1\)和\(x_2\) ​​ 来判断一个样本属于哪个类别(0 或 1)。我们可以构建一个包含一个隐藏层的多层感知器,其中隐藏层包含 3 个神经元,输出层包含一个神经元。

首先,我们需要对多层感知器进行初始化。假设我们将所有的权重和偏置值都初始化为随机值。

接下来,我们通过前向传播计算网络的输出值。假设输入样本的特征值为\(x_1=0.5\) 和\(x_2=0.8\),我们可以计算出隐藏层每个神经元的输出值:

\[h_1 = \sigma(w_{11}x_1+w_{21}x_2+b_1) \\ h_2 = \sigma(w_{12}x_1+w_{22}x_2+b_1) \\ h_3 = \sigma(w_{13}x_1+w_{23}x_2+b_1) \]

其中 σ 是激活函数,比如 sigmoid 函数。我们可以选择不同的激活函数来实现不同的非线性变换。

然后,我们可以通过前向传播计算输出层的值:

\[o=\sigma(w_1*h_1+w_2*h_2+w_3*h_3+b_2) \]

最后,我们可以根据输出层的值来判断样本属于哪个类别。比如,如果 \(\sigma>0.5\),我们可以将样本归为类别 1,否则归为类别 0。

在训练过程中,我们需要通过反向传播算法来更新神经元之间的权重和偏置值,从而使得模型能够更好地拟合训练数据。具体地,我们可以计算输出层的误差,然后逐层计算每个神经元对误差的贡献,并根据这些贡献来更新权重值。最终,我们可以得到一个准确率较高的多层感知器模型,用于对新的样本进行分类。

4.Keras

Keras是一个用Python编写的用于神经网络开发的应用接口,调用接口可以实现神经网络、卷积神经网络、循环神经网络等常用深度学习算法的开发。

4.1 特点

  • 集成了深度学习中各类成熟的算法,容易安装和使用,样例丰富,教程和文档也非常详细
  • 能够已TensorFlow,或者Theano作为后端运行

地址:https://keras.io/zh/https://keras.io/

30s上手Keras:https://keras-cn.readthedocs.io/en/latest/#30skeras

4.2 Keras or Tensorflow

TensorFlow是一个采用数据流图,用于数值计算的开源软件库,可自动计算模型相关的微分导数:非常适合用于神经网络模型的求解。

Keras可看作为tensorflow封装后的一个接口(Keras作为前端,TensorFlow作为后端)。Keras为用户提供了一个易于交互的外壳,方便进行深度学习的快速开发。

4.3 Keras建立MLP模型

# 建立一个Sequential顺序模型
from keras.models import Sequential
model = Sequential()

# 通过.add()叠加隔层网络
from keras.layers import Dense
model.add(Dense(units=3, activation='sigmoid', input_dim=3))
model.add(Dense(units=1, activation='sigmoid'))

# 通过.compile()配置模型求解过程参数
model.compile(loss='categorical_crossentropy', optimizer='sgd')

# 训练模型,epochs 迭代多少次
model.fit(x_train, y_train, epochs=5)