深度学习之多层感知器
1.概念
多层感知器(Multilayer Perceptron,MLP)是一种常见的人工神经网络模型,也是最早被广泛应用的神经网络模型之一。它由输入层、若干个隐藏层和一个输出层组成,其中每个层都由多个神经元组成。每个神经元接收来自前一层的输入,并通过激活函数将这些输入加权求和,得到自己的输出。多层感知器通过反向传播算法来训练,使得其输出能够与训练集中的目标输出尽可能接近,从而实现分类、回归等任务。多层感知器具有较强的非线性建模能力,可以处理复杂的非线性问题。
2.原理
多层感知器的实现原理是基于神经元之间的连接和权重的调整。在多层感知器中,神经元之间的连接形成了一个有向图,其中每条边表示两个神经元之间的连接。每个神经元都有一个输出值,该值是由它的输入值和权重值的加权和经过激活函数计算得出的。
在训练过程中,多层感知器通过反向传播算法来更新神经元之间的权重,从而使得模型能够更好地拟合训练数据。具体地,反向传播算法将误差从输出层向输入层逐层传递,通过链式法则计算每个神经元对误差的贡献,并根据这些贡献来更新权重值。
-
多层感知器的实现过程可以分为以下几个步骤:
-
初始化网络参数,包括权重和偏置值。
-
通过前向传播计算网络的输出值。
-
计算输出层的误差,并通过反向传播逐层计算每个神经元对误差的贡献。
-
根据贡献值更新网络的权重和偏置值。
重复上述步骤直至达到收敛条件。
通过这些步骤,多层感知器可以逐步优化网络的参数,提高模型的准确性和泛化能力。
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作为后端运行
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)