趋近智
多层感知器(MLP)是一种基本的神经网络 (neural network)模型。它们由一个或多个神经元层构成,前一层中的每个神经元都连接到后一层中的所有神经元。这种紧密的连接方式使得它们常被称为“全连接网络”。尽管结构简单,MLP 仍有能力学习数据中复杂的非线性关系,这使其成为理解神经网络结构的一个优秀起点。Flux.jl 的 Dense 层和 Chain 构造器是构建 MLP 的主要工具。
一个 MLP 通常包含三种主要的层类型:输入层、一个或多个隐藏层以及输出层。
典型的 MLP 结构,展示了信息从输入层流经隐藏层,最后到达输出层的过程。层间的每个连接都是“稠密的”,表示前一层的所有神经元都连接到下一层的所有神经元。
我们来细分这些组成部分:
使用 Dense 层并将它们组合成 Chain,在 Flux.jl 中构建 MLP 非常直接。一个 Dense 层,即 Dense(in::Integer, out::Integer, σ),创建一个标准的完全连接层,它将大小为 in 的输入转换为大小为 out 的输出,然后应用一个激活函数 (activation function) σ。
我们来构建一个简单的 MLP。假设我们有一个包含 10 个输入特征的数据集,我们想构建一个包含两个隐藏层的网络:第一层有 64 个神经元,第二层有 32 个神经元。对于回归任务,我们将有一个单独的输出神经元。
using Flux
# 定义网络维度
num_features = 10
num_hidden1 = 64
num_hidden2 = 32
num_outputs = 1 # 用于回归任务
# 构建 MLP
mlp_model = Chain(
Dense(num_features, num_hidden1, relu), # 输入层(10个特征)到第一个隐藏层(64个神经元)
Dense(num_hidden1, num_hidden2, relu), # 第一个隐藏层(64个神经元)到第二个隐藏层(32个神经元)
Dense(num_hidden2, num_outputs) # 第二个隐藏层(32个神经元)到输出层(1个神经元)
# 此处未指定输出层的激活函数;
# 对于回归任务,这是常见做法(恒等激活)。
)
# 您可以打印模型以查看其结构
println(mlp_model)
在此代码中:
Chain(...) 按顺序组织层。一层的输出成为下一层的输入。Dense(num_features, num_hidden1, relu) 定义了我们的第一层。它接收 num_features 个输入,产生 num_hidden1 个输出,并应用 relu 激活函数。Dense 层遵循相同的模式,将前一层的输出连接到下一层的输入。Dense(num_hidden2, num_outputs) 层没有明确指定激活函数。默认情况下,如果未提供激活函数,Flux 的 Dense 层会使用恒等激活(x -> x),这适用于回归任务。对于分类任务,您可以在此处添加 sigmoid 或 softmax,或更常见地,将其作为损失函数 (loss function)计算的一部分或作为模型之后的最后一步应用。为了查看数据如何流经此模型(即“前向传播”),我们可以创建一些虚拟输入数据。Flux 模型通常要求输入数据将特征作为行,将观测值(样本)作为列。
# 创建 5 个虚拟数据样本批次,每个样本有 10 个特征
batch_size = 5
dummy_data = rand(Float32, num_features, batch_size) # 形状: (10, 5)
# 将数据通过模型
predictions = mlp_model(dummy_data)
println("Input data size: ", size(dummy_data))
println("Output predictions size: ", size(predictions)) # 预期: (1, 5)
输出 predictions 将是一个大小为 (1, 5) 的矩阵,其中每列是对应输入样本的回归输出。
当您将数据通过 mlp_model(dummy_data) 这样的 MLP 时,每个 Dense 层执行两个主要操作:
relu)。因此,该层的最终输出是 ,其中 是激活函数。Chain 确保一个层的输出 成为序列中下一层的输入 ,直到达到最终输出层。
设计 MLP 时,有几个选择会影响其性能:
网络深度与宽度:
激活函数 (activation function):
relu 是隐藏层非常常用的选择。它计算效率高,并有助于减轻在更深层网络中使用 sigmoid 或 tanh 等其他激活函数时可能出现的“梯度消失”问题。leakyrelu 或 elu 等替代方案有时也能带来好处。softplus。sigmoid 用于将输出压缩到 范围,表示一个概率。softmax 用于将输出转换为 个类别的概率分布,其中每个输出在 之间,且所有输出之和为 1。Flux 提供了 Flux.sigmoid 和 Flux.softmax。数据缩放:
优点:
局限性:
多层感知器是多功能的前馈神经网络 (neural network),它们是深度学习 (deep learning)的根本组成部分。您现在已经了解了如何使用 Flux.jl 的 Dense 层和 Chain 结构在 Julia 中构建它们,并理解了所涉及的设计考量。
尽管 MLP 对某些类型的问题(特别是涉及表格数据的问题)有效,本章接下来将介绍卷积神经网络(CNN)和循环神经网络(RNN)。这些结构分别专门设计用于处理具有空间和序列结构的数据,通过整合利用这些特性的专用层。理解 MLP 为掌握这些更复杂的结构提供了坚实的根基。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•