趋近智
在了解了神经网络的基本组成部分——神经元、层和激活函数之后,我们现在来思考一个核心设计问题:如何组织这些组成部分以建立有效的前馈网络?决定架构,特别是隐藏层的数量以及每层内的神经元数量,对模型从数据中学习和泛化能力有重要影响。没有一个万能公式;架构设计通常依据启发式方法、问题复杂度和经验性实验。
网络的“深度”指的是它包含的隐藏层数量。
增加网络深度会带来一系列挑战:
指导原则: 从简单开始。最初使用一到两个隐藏层。如果模型欠拟合(未能捕捉到训练数据中的模式),则考虑逐渐增加深度或宽度。
层的“宽度”指的是它包含的神经元数量。这决定了该层在该抽象层次上的表示能力。
常见启发式方法和模式:
指导原则: 最佳神经元数量高度依赖于特定数据集和问题。它是您需要调整的主要超参数之一。从基于输入/输出大小或常见做法(例如,漏斗形结构)的合理数量开始,然后进行实验。监控验证集性能以检查是否欠拟合或过拟合,并相应地调整层大小。
前馈网络常使用“漏斗形”结构,在连续的隐藏层中减少神经元数量。
请记住,输出层的设计完全由任务决定:
设计网络架构很少是一次性完成的过程。它通常涉及:
自动化超参数调整技术可以系统地尝试不同架构,但理解这些设计原则为做出明智选择和指导搜索过程提供了良好根基。
例如,在PyTorch中定义一个简单的全连接前馈网络可能看起来像这样,明确显示了层维度:
import torch
import torch.nn as nn
class SimpleMLP(nn.Module):
def __init__(self, input_size, hidden_size1, hidden_size2, output_size):
super(SimpleMLP, self).__init__()
self.layer1 = nn.Linear(input_size, hidden_size1)
self.relu1 = nn.ReLU()
self.layer2 = nn.Linear(hidden_size1, hidden_size2)
self.relu2 = nn.ReLU()
self.output_layer = nn.Linear(hidden_size2, output_size)
# 输出激活函数(例如 nn.Sigmoid() 或 nn.Softmax(dim=1))
# 通常会在该层之后应用或由损失函数处理。
def forward(self, x):
x = self.layer1(x)
x = self.relu1(x)
x = self.layer2(x)
x = self.relu2(x)
x = self.output_layer(x)
return x
# 示例实例化:
input_dim = 784 # 例如,用于平展的28x28 MNIST图像
h1_dim = 128
h2_dim = 64
output_dim = 10 # 例如,用于10个数字类别
model = SimpleMLP(input_dim, h1_dim, h2_dim, output_dim)
print(model)
这个例子定义了一个网络,包含一个输入层、两个隐藏层(分别为128和64个神经元,使用ReLU激活函数)以及一个输出层。具体神经元数量(128、64)代表了基于所讨论原则的设计选择。随着学习的推进,您将培养直觉并使用系统方法来完善这些架构决策,以解决您的特定问题。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造