Logo
Section 1 / 3

神经网络

在本节课中,我们将简要介绍神经网络。

导入

神经网络

在本节课中,我们将简要介绍神经网络。

尽管 sklearn 主要专注于传统机器学习,但它仍提供了一些方法来构建简单的前馈神经网络。本节课将简要介绍如何使用它。

使用 MLPClassifier 建模

我们跳过数据加载与划分步骤,直接从 neural_network 模块创建一个 MLPClassifier 对象。其中 MLP 表示多层感知机(Multilayer Perceptron)。如你所见,神经网络需要设置大量参数。如果你熟悉深度学习,就会知道调参在神经网络训练中是一项非常重要且耗时的工作。

以下是我们在下方设置的一些关键参数:

  • batch_size:通常情况下,神经网络使用随机优化器,因此每次训练都会采用一个小批量样本(mini-batch)进行更新。
  • solver:优化器是深度学习中的一个重要话题,这里我们仅选择最简单的一种。
  • shuffle:是否在每轮迭代中打乱样本顺序,这可以增加训练的随机性,提升训练效率。
  • tol:收敛条件,表示两次迭代之间的损失变化小于某个阈值时停止训练。
  • max_iter:最大迭代次数。
  • learning_rate_init:学习率是深度学习中最关键的超参数之一,也是一个复杂的话题。当 solver="sgd" 时,你可以设定学习率的调整策略,默认为恒定学习率(constant)。此处我们只设置了 learning_rate_init,意味着在整个训练过程中学习率始终保持为 0.001。

以下代码展示了如何使用这些参数创建一个神经网络。完整的代码将在本课结尾处给出。

1from sklearn.neural_network import MLPClassifier 2 3nn = MLPClassifier(batch_size=32, 4 hidden_layer_sizes=(64, 32), 5 solver="sgd", 6 shuffle=True, 7 tol=1e-3, 8 max_iter=300, 9 learning_rate_init=0.001)
...
一个简单神经网络的结构

如何对网络进行调优

以下是一些调参技巧:

batch_size 不宜过小,否则会影响模型训练速度;也不宜过大,否则可能影响模型性能。如果不确定合适的数值,可以从 32、64 或 128 开始尝试。

hidden_layer_sizes 不能太小,否则模型的学习能力不足;也不能太大,否则容易导致过拟合。

learning_rate_init 是深度学习中最关键的超参数。若学习率太小,训练速度会变慢;若太大,则训练过程不稳定,难以收敛。0.001 或 0.00001 可作为初始选择,之后可根据模型表现进一步微调。

solver 同样重要。不同的优化器适用于不同类型的任务。sgd 是最常用的求解器,但还有多种其他选项,应根据具体任务谨慎选择。

在完成模型训练(fit)后,我们可以查看其性能表现。如果你阅读过一些深度学习相关的论文或文章,可能会经常看到类似的图表:随着训练迭代次数增加,损失逐渐下降。在 sklearn 中,每次迭代的损失值会被记录在模型的属性 loss_curve_ 中。

1import matplotlib.pyplot as plt 2 3fig, axe = plt.subplots() 4## nn 是我们训练的模型 5axe.plot(range(len(nn.loss_curve_)), nn.loss_curve_) 6axe.set_xlabel("迭代次数") 7axe.set_ylabel("损失")
...
损失与迭代次数关系图

以下是完整代码,供你动手实践:

1import sklearn.datasets as datasets 2from sklearn.neural_network import MLPClassifier 3from sklearn.model_selection import train_test_split 4import sklearn.metrics as metrics 5import matplotlib.pyplot as plt 6 7X, y = datasets.make_classification(n_samples=1000, 8 n_features=30, 9 random_state=10) 10 11print("the shape of X is {}".format(X.shape)) 12print("the shape of y is {}".format(y.shape)) 13 14train_x, test_x, train_y, test_y = train_test_split(X, 15 y, 16 test_size=0.2, 17 random_state=42) 18 19nn = MLPClassifier(batch_size=32, 20 hidden_layer_sizes=(64, 32), 21 solver="sgd", 22 shuffle=True, 23 tol=1e-3, 24 max_iter=300, 25 learning_rate_init=0.001) 26 27nn.fit(train_x, train_y) 28 29fig, axe = plt.subplots() 30axe.plot(range(len(nn.loss_curve_)), nn.loss_curve_) 31axe.set_xlabel("iteration") 32axe.set_ylabel("loss") 33fig.savefig("output/img.png", dpi = 300) 34plt.close(fig)

从第 7 行到第 14 行,生成了一个数据集并将其划分为两部分。本例中,数据集包含 30 个特征。

第 19 行创建了一个 MLPClassifier 对象。可以看到,这里设置了多个参数,其含义已在上文说明。由于这是一个分类任务,因此我们使用分类器,并在第 27 行通过 fit 方法进行训练。

从第 29 行到第 34 行,我们绘制了损失随迭代次数下降的趋势图。MLP 模型会在每次迭代后记录损失值,这些值可通过 loss_curve_ 属性获取。

无监督学习

挑战 - 构建一个神经网络并对其进行微调