多层感知机(MLP)是一种经典的人工神经网络结构,由输入层、一个或多个隐藏层以及输出层组成。每一层中的神经元与前一层的所有神经元全连接,且各层间的权重是可学习的。MLP 是深度学习的基础模型之一,主要用于处理结构化数据、分类任务和回归任务等。
特点
- 全连接层:每个神经元与前一层的所有神经元连接,能学习复杂的非线性关系。
- 激活函数:隐藏层和输出层的每个神经元使用非线性激活函数(如 ReLU(/ray-loo/)、Sigmoid(/ˈsɪɡˌmɔɪd/)、Tanh(/tænʃ/))来增加模型的表达能力。
- 前向传播和反向传播:
- 前向传播:输入数据经过各层加权求和并通过激活函数计算输出。
- 反向传播:根据损失函数计算梯度,并通过优化算法(如 SGD、Adam)更新权重。
- 通用逼近性:理论上,MLP 可以逼近任意连续函数。
MLP 的结构
- 输入层:接受输入数据的特征向量,大小等于数据的维度。
- 隐藏层:一个或多个隐藏层,每层由若干神经元组成,负责特征提取和非线性映射。
- 输出层:根据任务类型输出结果,例如分类问题中每类的概率或回归问题中的预测值。
代码示例
以下是一个使用 TensorFlow/Keras(/'kɜːrəz/或/'kiərəz/) 实现简单 MLP 的代码示例:
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input# 定义多层感知机模型
def build_mlp(input_dim, hidden_units, output_dim):model = Sequential()# 输入层和第一层隐藏层model.add(Input(shape=(input_dim,)))model.add(Dense(hidden_units, activation='relu'))# 添加第二层隐藏层(可选)model.add(Dense(hidden_units, activation='relu'))# 输出层model.add(Dense(output_dim, activation='softmax')) # 对分类问题使用 softmaxreturn model# 模型参数
input_dim = 20 # 输入维度
hidden_units = 64 # 隐藏层神经元数
output_dim = 3 # 输出类别数# 构建模型
mlp_model = build_mlp(input_dim, hidden_units, output_dim)# 编译模型
mlp_model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', # 分类问题常用损失函数metrics=['accuracy']
)# 查看模型结构
mlp_model.summary()# 生成模拟数据
import numpy as np
X_train = np.random.rand(1000, input_dim)
y_train = np.random.randint(0, output_dim, 1000)# 训练模型
mlp_model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)
运行结果
Model: "sequential"
_________________________________________________________________Layer (type) Output Shape Param #
=================================================================dense (Dense) (None, 64) 1344 dense_1 (Dense) (None, 64) 4160 dense_2 (Dense) (None, 3) 195 =================================================================
Total params: 5699 (22.26 KB)
Trainable params: 5699 (22.26 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Epoch 1/10
25/25 [==============================] - 1s 10ms/step - loss: 1.1018 - accuracy: 0.3525 - val_loss: 1.1075 - val_accuracy: 0.3250
Epoch 2/10
25/25 [==============================] - 0s 3ms/step - loss: 1.0912 - accuracy: 0.3675 - val_loss: 1.1097 - val_accuracy: 0.3250
Epoch 3/10
25/25 [==============================] - 0s 2ms/step - loss: 1.0850 - accuracy: 0.3875 - val_loss: 1.1122 - val_accuracy: 0.3300
Epoch 4/10
25/25 [==============================] - 0s 7ms/step - loss: 1.0828 - accuracy: 0.4013 - val_loss: 1.1190 - val_accuracy: 0.2750
Epoch 5/10
25/25 [==============================] - 0s 3ms/step - loss: 1.0762 - accuracy: 0.4137 - val_loss: 1.1256 - val_accuracy: 0.2750
Epoch 6/10
25/25 [==============================] - 0s 3ms/step - loss: 1.0713 - accuracy: 0.4200 - val_loss: 1.1145 - val_accuracy: 0.3150
Epoch 7/10
25/25 [==============================] - 0s 3ms/step - loss: 1.0739 - accuracy: 0.4300 - val_loss: 1.1220 - val_accuracy: 0.2950
Epoch 8/10
25/25 [==============================] - 0s 3ms/step - loss: 1.0697 - accuracy: 0.4187 - val_loss: 1.1218 - val_accuracy: 0.2950
Epoch 9/10
25/25 [==============================] - 0s 2ms/step - loss: 1.0628 - accuracy: 0.4487 - val_loss: 1.1229 - val_accuracy: 0.2800
Epoch 10/10
25/25 [==============================] - 0s 2ms/step - loss: 1.0549 - accuracy: 0.4550 - val_loss: 1.1352 - val_accuracy: 0.2650
重要概念与技巧
- 隐藏层数和神经元数:一般来说,更多的隐藏层和神经元可以提高模型复杂度,但可能导致过拟合。
- 激活函数:ReLU 是最常用的隐藏层激活函数,输出层的激活函数根据任务不同而选择(如分类使用 Softmax,回归使用线性激活)。
- 正则化:通过添加 L1/L2 正则化、Dropout 或 Batch Normalization,来防止过拟合。
- 优化器:选择合适的优化算法(如 Adam、SGD)加速训练过程。
应用场景
- 图像分类(通常是简单的低维数据集)
- 信号处理和时间序列分析
- 文本分类和自然语言处理中的简单任务
- 表格数据的分类和回归分析
MLP 是深度学习的起点,尽管它已被更复杂的模型(如卷积神经网络和 Transformer)所取代,但它依然是一个重要的理论基础。