一、什么是多层感知机(MLP)
多层感知机(Multi-Layer Perceptron,MLP)是一种前馈人工神经网络,可以用于分类、回归、预测等任务。它是一个多层的结构,每一层都由多个神经元组成,前一层的输出作为下一层的输入。
MLP可以解决非线性问题,如图像识别、自然语言处理等。其结构简单、易于实现,因此被广泛应用。
二、MLP的结构
如上所述,MLP是一个多层的结构,每一层由多个神经元组成。根据层数不同,可以分为单隐藏层或多隐藏层网络,本文介绍的是单隐藏层的MLP网络。
在单隐藏层的MLP中,输入层的神经元数目为n,隐藏层的神经元数目为h,输出层的神经元数目为m。其中,n、h、m均为正整数。如下图所示:
Input Layer Hidden Layer Output Layer Input 1--------- ------------ ---------------- ------------Output 1 | | | | Input 2-------- ------------ ---------------- ------------Output 2 | | | | … … … … | | | | Input n --------- ------------ ---------------- ------------Output m
三、前向传播
前向传播是指从输入层开始,逐层传递信号直至输出层的过程。
在前向传播中,输入层的数值被传递至隐藏层,隐藏层的数值再被传递至输出层。在传递过程中,神经元会对上一层的输入进行加权求和,并通过激活函数进行非线性变换。如下图所示:
output_j = σ(w_j*x + b_j) w_1 w_2 … w_h Input_1 ------| | | |------------------Output_1 | | | Input_2 ------| | | |------------------Output_2 | | | … | | | … | | | Input_n ------|___________|____________| |------------------Output_m 其中,x为输入,w为权重,b为偏置,σ为激活函数。在隐藏层和输出层均为使用相同的激活函数,常见的有sigmoid、ReLU等函数。
四、误差反向传播
误差反向传播(Backpropagation algorithm)是指从输出层开始,逐层反向求解误差、调整权重的过程。
在误差反向传播中,首先需要定义一个损失函数,用于衡量预测值和真实值之间的误差。常见的损失函数有均方误差(MSE)、交叉熵等。
模型训练时,误差会从输出层传递至隐藏层,最终传递至输入层。在传递过程中,将误差按照权重进行分配,并根据分配的误差来更新权重。
在误差反向传播中,每一个神经元都有三个重要的梯度:输出梯度、权重梯度和偏置梯度。它们分别代表着误差对输出值、权重和偏置的影响程度。通过计算梯度可以对模型进行调整,直到损失函数的值达到最小。
五、示例代码
1. MLP的实现(Python)
import numpy as np class MLP: def __init__(self, input_dim, hidden_dim, output_dim): self.input_dim = input_dim self.hidden_dim = hidden_dim self.output_dim = output_dim np.random.seed(42) self.weights1 = np.random.randn(input_dim,hidden_dim) self.weights2 = np.random.randn(hidden_dim,output_dim) def forward(self, x): self.hidden = np.dot(x, self.weights1) self.hidden_activation = self.sigmoid(self.hidden) self.output = np.dot(self.hidden_activation, self.weights2) return self.output def sigmoid(self, x): return 1/(1 + np.exp(-x))
2. MNIST手写数字识别(Python)
下面介绍如何使用MLP网络实现MNIST手写数字分类。
from keras.datasets import mnist from sklearn.neural_network import MLPClassifier # 加载数据 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 处理数据 X_train = X_train.reshape((60000, 28*28)) X_test = X_test.reshape((10000, 28*28)) X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # 构建模型 mlp = MLPClassifier(hidden_layer_sizes=(100,), max_iter=10, alpha=1e-4, solver='sgd', verbose=10, tol=1e-4, random_state=42, learning_rate_init=.1) # 训练模型 mlp.fit(X_train, y_train) # 评估模型 accuracy = mlp.score(X_test, y_test) print('Accuracy:', accuracy)
六、总结
在本文中,我们对MLP的原理、结构、前向传播、误差反向传播进行了详细介绍,并提供了Python代码示例。MLP是一种前馈人工神经网络,常用于分类、回归、预测等任务。它的结构简单、易于实现,并且可以解决非线性问题。