您的位置:

多层感知机(MLP)网络详解

一、什么是多层感知机(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是一种前馈人工神经网络,常用于分类、回归、预测等任务。它的结构简单、易于实现,并且可以解决非线性问题。