算法系列——有监督学习——8.神经网络

一、概述

1. 一直以来,人们都认为神经网络(Neural Network,NN)是模仿生物体的神经网络设计而成的。神经网络既可以用于回归,也可以用于分类,但在实际应用中常用于分类。基于神经网络的深度学习因在图像识别和语音识别等领域表现优异而广为人知。

神经网络在输入数据和输出结果之间插入了叫作中间层的层,能够学习复杂的决策边界。它既可以用于回归,也可以用于分类,但主要还是应用于分类问题。本文也以分类问题为例进行说明。如图所示是一个典型的神经网络的网络结构。在图中,输入数据为三维数据,中间层为二维数据,输出为一维数据(关于从输入层到中间层、从中间层到输出层之间的计算,后面的“算法说明”部分将详细介绍)。左端的层叫作输入层,表示输入数据本身。右端的层叫作输出层,取输入数据分类结果的概率。在二元分类的情况下,输出层输出的概率只有一个。在多元分类的情况下,输出层同时输出属于每个分类对象的标签的概率。通过在输入层和输出层中间叠加中间层,神经网络得以学习复杂的决策边界。

2. 中间层的本质:非线性特征转换器
‌中间层并非预先设计,而是通过训练自动形成的“特征加工流水线”‌。

‌输入层‌:接收原始数据(如图像像素、文本词向量)。
‌中间层‌:每一层对前一层输出进行‌非线性变换‌,逐步提取更抽象的特征。
‌输出层‌:基于最终抽象特征完成任务(如分类、回归)。
‌示例‌:

输入层:原始图像像素(如224×224×3的RGB矩阵)
中间层1:检测边缘、颜色块(低级特征)
中间层2:组合边缘为形状(圆形、方形等)
中间层3:识别物体部件(车轮、车窗等)
输出层:判断图像是“汽车”(高级语义)

3. 下面我们将神经网络应用于具体任务,查看它的结果。本文将对一个叫作MNIST的手写数字数据集进行分类。MNIST包含从0到9的10个手写数字的图片,我们对图片进行分类。MNIST的图片是8 × 8的灰度图像,如下图所示。

本次创建的神经网络如下图所示,图中省略了各个节点之间的连接线。

输入层表示输入图像(64维向量)本身。如果将各个点的像素值存储在长度为64的一维数组的元
素中,则可以将其视为64维数据来处理。下面通过神经网络来学习使用上述方法得到的64维据。
中间层使用Sigmoid等非线性函数计算输入层传来的数据。中间层的维度是超参数。使维度变大可以学习更加复杂的边界,但是容易发生过拟合。本次设置中间层为16维。下面的“算法说明”部分将再次介绍中间层的计算方法、中间层的维度和学习结果的关系。输出层也同样使用非线性函数计算中间层传来的数据。本次任务是对0 ~ 9这10个数字进行分类。因此,输出层输出的是输入手写图像分别为0 ~ 9这10个数字的概率。下面使用这个神经网络进行学习,并进行分类。

图中的Label代表作为正确答案的数字,Prediction代表作为神经网络的分类结果的数字,下方的图像是输入数据。可以看出,神经网络可以正确地识别出这些手写数字。
 

二、算法说明

通过叠加中间层,神经网络可以学习复杂的决策边界。下面首先介绍一下只由输入层和输出层构成的简单感知机,然后再探讨如何通过叠加中间层来学习更加复杂的决策边界。

1. 简单感知机

简单感知机是将非线性函数应用于对特征值加权后的结果并进行识别的模型。下面看一个例子:某特征的维度为2,输入的特征值为( x1,x2 ),使用下面的非线性函数f计算概率y:

我们将其中的特征值的系数w1和w2称为权重,将常数项w0称为偏置。权重和偏置都是学习参数。非线性函数f叫作激活函数,它以加权后的特征值之和作为输入,计算概率y。常用的激活函数有Sigmoid函数等。下图的左边是简单感知机的示意图,展示了如何对加权后的输入和偏置之和应用激活函数并计算输出。我们有时也可以像下图右边那样省略求和的部分和激活函数,只显示输入和输出部分。在这种简化图中常常省略节点的变量名。

简单感知机与逻辑回归具有类似的特性。其实在用Sigmoid函数作为激活函数f时,简单感知机和逻辑回归是等价的。

2. 神经网络

通过叠加简单感知机,神经网络得以表示复杂的决策边界。简单感知机不能很好地学习某些数据的决策边界。逻辑回归无法成功地对非线性决策边界进行分类,简单感知机也是如此。比如,对于如图所示的线性不可分的数据,简单感知机无法进行正确分类。

神经网络通过下面介绍的方式解决这个问题。首先,设置区分右上角的点和其他点的层、区分左下角的点和其他点的层。这些夹在输入和输出之间的层叫作中间层或隐藏层。然后,设置综合这两个输出结果并进行最终决定的层。通过这种做法,我们就可以根据数据是否进入被两条直线夹住的地方来分类了。下图的左侧表示各个层的学习情况,右侧是模型的示意图。右图表示从二维输入到两个中间层的输出,再到得到最终的输出的过程。图中的节点表示特征及其输出等变量,边表示用于进行下一个变量的计算的输入。

神经网络通过这种设置中间层的方式,可以利用单一算法学习各种决策边界。通过调节中间层的数量及层的深度,神经网络可以学习更复杂的边界,如下图所示。

三、示例代码

下面读取“概述”部分提到的MNIST数据集,将其分割成训练数据和验证数据,使用训练数据训练模型,使用验证数据评估正确率。每次运行结果都有所不同,不过结果的正确率都在95%左右。

# 加载手写数字数据集(8x8 的灰度图像,共 10 类,对应数字 0-9)
from sklearn.datasets import load_digits
from sklearn.neural_network import MLPClassifier   # 神经网络
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# 读取数据
data = load_digits()
X = data.images.reshape(len(data.images), -1)   # 将图像展开为 64 维向量
y = data.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 初始化模型并训练
model = MLPClassifier(
    hidden_layer_sizes=(64, 32),  # 2 个隐藏层
    max_iter=500,                # 增加迭代次数
    learning_rate_init=0.001,
    random_state=42
)
model.fit(X_train, y_train)

# 预测并评估
y_pred = model.predict(X_test)
print(f"准确率: {accuracy_score(y_pred, y_test):.4f}")

四、详细说明

通过增加中间层的数量和增加中间层的节点数量等方法,神经网络可以学习复杂的数据。但是,模型变得复杂之后容易过拟合。下面介绍一种名为Early Stopping(早停法)的防止过拟合的方法。


Early Stopping 是指在进入过拟合状态前停止训练的防止过拟合的方法。与正则化的方法相比,它让人觉得有些不一样。Early Stopping 进一步划分训练数据,将其中一部分作为训练中的评估数据。在训练过程中使用评估数据,依次记录损失等评估指标,以了解训练的进度。在训练过程中,如果评估数据的损失开始恶化,开始出现过拟合的趋势,就停止训练,结束学习。这种在过拟合之前停止训练的做法就叫作Early Stopping。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿梭的编织者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值