文章目录
-
- 一、浅层神经网络概述
- 二、浅层神经网络的前向传播
- 三、浅层神经网络的反向传播
- [四、编写浅层神经网络案例(Python + NumPy 实现)](#四、编写浅层神经网络案例(Python + NumPy 实现))
- 五、浅层神经网络与深度学习的区别
一、浅层神经网络概述
(一)定义
浅层神经网络是一种相对简单的神经网络结构,相较于深度神经网络,其层数较少,一般包含输入层、一个或少数几个隐藏层以及输出层。因其结构简洁,在处理简单任务时,计算量较小、训练速度较快,但在面对复杂的非线性问题时,其特征提取和表达能力相对有限。
(二)常见类型
- 感知机(Perceptron):是最基础的人工神经网络模型,可看作是只有一个神经元的浅层神经网络,用于简单的线性分类任务。它接收多个输入并对其进行加权求和,再通过一个激活函数(早期常为阶跃函数)产生输出。虽然简单,但它是理解神经网络基本原理的基础。
- 多层感知机(Multilayer Perceptron,MLP):在感知机基础上增加了隐藏层,是较为常见的浅层神经网络。它可以处理更复杂的非线性问题,通过隐藏层的非线性变换,对输入数据进行特征提取和转换,进而在输出层完成分类或回归任务。
二、浅层神经网络的前向传播
前向传播是数据在浅层神经网络中从输入层流向输出层的过程。以一个包含输入层、一个隐藏层和输出层的浅层神经网络为例:
- 输入层 - 隐藏层:假设输入层有 (n) 个神经元,隐藏层有 (m) 个神经元。输入层接收原始数据 (x = (x_1, x_2, \cdots, x_n))。对于隐藏层的第 (j) 个神经元((j = 1, 2, \cdots, m)),首先计算输入的加权和 (z_j=\sum_{i = 1}^{n}w_{ji}x_i + b_j),其中 (w_{ji}) 是输入层第 (i) 个神经元到隐藏层第 (j) 个神经元的连接权重,(b_j) 是隐藏层第 (j) 个神经元的偏置。然后,将 (z_j) 输入激活函数 (f),得到隐藏层第 (j) 个神经元的输出 (a_j = f(z_j))。隐藏层所有神经元的输出构成隐藏层的输出向量 (a = (a_1, a_2, \cdots, a_m))。
- 隐藏层 - 输出层:假设输出层有 (k) 个神经元。对于输出层的第 (l) 个神经元((l = 1, 2, \cdots, k)),计算 (z_l=\sum_{j = 1}^{m}w_{lj}a_j + b_l),这里 (w_{lj}) 是隐藏层第 (j) 个神经元到输出层第 (l) 个神经元的连接权重,(b_l) 是输出层第 (l) 个神经元的偏置。同样将 (z_l) 经过激活函数 (g)(根据任务不同选择不同激活函数,如分类任务常用 Soft - max,回归任务常用线性激活函数),得到输出层第 (l) 个神经元的输出 (y_l = g(z_l)),输出层所有神经元的输出构成最终的输出向量 (y = (y_1, y_2, \cdots, y_k))。
三、浅层神经网络的反向传播
反向传播是训练浅层神经网络的关键算法,旨在通过调整网络的权重和偏置,使网络输出与真实标签之间的误差最小化。具体步骤如下:
- 计算损失:依据网络的输出 (y) 和真实标签 (t),选取合适的损失函数 (L)(如分类任务常用交叉熵损失函数 (L = -\sum_{i = 1}^{N}\sum_{j = 1}^{k}t_{ij}\log(y_{ij})),其中 (N) 是样本数量,(k) 是类别数;回归任务常用均方误差损失函数 (L=\frac{1}{N}\sum_{i = 1}^{N}(y_i - t_i)^2)),计算当前样本的损失值 (L)。
- 反向传播计算梯度 :从输出层开始,逐层计算损失函数对每个权重和偏置的梯度。
- 输出层:计算损失函数对输出层每个神经元的输入 (z_l) 的梯度 (\delta_l=\frac{\partial L}{\partial z_l})。例如,对于交叉熵损失函数和 Soft - max 激活函数,(\delta_l=y_l - t_l)。然后计算损失函数对输出层权重 (w_{lj}) 和偏置 (b_l) 的梯度:(\frac{\partial L}{\partial w_{lj}}=a_j\delta_l),(\frac{\partial L}{\partial b_l}=\delta_l)。
- 隐藏层:计算损失函数对隐藏层每个神经元的输入 (z_j) 的梯度 (\delta_j=\sum_{l = 1}^{k}w_{lj}\delta_l\cdot f^\prime(z_j)),其中 (f^\prime(z_j)) 是隐藏层激活函数 (f) 的导数。再计算损失函数对隐藏层权重 (w_{ji}) 和偏置 (b_j) 的梯度:(\frac{\partial L}{\partial w_{ji}}=x_i\delta_j),(\frac{\partial L}{\partial b_j}=\delta_j)。
- 更新参数:根据计算得到的梯度,使用优化算法(如梯度下降法)更新权重和偏置。对于权重 (w) 和偏置 (b),更新公式为 (w = w-\alpha\frac{\partial L}{\partial w}),(b = b-\alpha\frac{\partial L}{\partial b}),其中 (\alpha) 是学习率。
四、编写浅层神经网络案例(Python + NumPy 实现)
以一个简单的二分类问题为例,展示浅层神经网络的训练和预测过程,同时包含反向传播算法的代码实现:
python
import numpy as np
# 定义激活函数及其导数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 初始化参数
input_size = 2
hidden_size = 2
output_size = 1
learning_rate = 0.1
# 随机初始化权重和偏置
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
# 训练神经网络
for epoch in range(10000):
# 前向传播
# 隐藏层
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
# 输出层
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2)
# 计算损失
loss = np.mean((a2 - y) ** 2)
# 反向传播
# 输出层误差
d2 = (a2 - y) * sigmoid_derivative(a2)
# 隐藏层误差
d1 = np.dot(d2, W2.T) * sigmoid_derivative(a1)
# 更新权重和偏置
W2 -= learning_rate * np.dot(a1.T, d2)
b2 -= learning_rate * np.sum(d2, axis=0, keepdims=True)
W1 -= learning_rate * np.dot(X.T, d1)
b1 -= learning_rate * np.sum(d1, axis=0, keepdims=True)
if epoch % 1000 == 0:
print(f'Epoch {epoch}, Loss: {loss}')
# 预测
z1 = np.dot(X, W1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, W2) + b2
a2 = sigmoid(z2)
predictions = (a2 > 0.5).astype(int)
print("Predictions:", predictions)
代码解释
- 激活函数定义:定义了 Sigmoid 激活函数及其导数,用于神经网络中神经元的非线性变换和反向传播时计算梯度。
- 训练数据:创建了一个简单的二分类数据集 (X) 和对应的标签 (y)。
- 参数初始化:随机初始化输入层到隐藏层的权重 (W1)、隐藏层偏置 (b1)、隐藏层到输出层的权重 (W2) 和输出层偏置 (b2)。
- 训练过程 :
- 前向传播:按照上述前向传播的步骤,依次计算隐藏层和输出层的输出。
- 计算损失:使用均方误差损失函数计算当前样本的损失值。
- 反向传播:按照反向传播的步骤,计算输出层和隐藏层的误差,进而计算梯度。
- 参数更新:根据计算得到的梯度,使用梯度下降法更新权重和偏置。
- 预测:使用训练好的模型对训练数据进行预测,并将输出结果转换为 0 或 1 的分类标签。
五、浅层神经网络与深度学习的区别
(一)网络结构深度
浅层神经网络层数较少,通常只有一个或少数几个隐藏层;而深度学习模型,如深度神经网络、卷积神经网络(CNN)、循环神经网络(RNN)及其变体(LSTM、GRU 等),往往具有较多的隐藏层,层数可达数十层甚至更多。例如,在图像识别领域广泛应用的 AlexNet 有 8 层(5 个卷积层和 3 个全连接层),而 ResNet 可以有 50 层、101 层甚至更多层。
(二)特征学习能力
浅层神经网络由于层数有限,其特征提取能力相对较弱,对于复杂的数据模式,可能难以学习到足够丰富和抽象的特征。深度学习模型凭借其深度结构,能够自动从原始数据中逐层学习不同层次的特征,从低级的局部特征逐步学习到高级的全局抽象特征。例如在图像识别中,CNN 可以自动学习到图像的边缘、纹理等低级特征,以及物体的形状、类别等高级特征。
(三)计算资源需求
浅层神经网络计算量相对较小,对计算资源的需求较低,在普通的 CPU 环境下即可进行训练和推理。深度学习模型由于结构复杂、参数众多,训练过程需要大量的计算资源,通常需要使用 GPU 集群等高性能计算设备来加速训练过程。
(四)应用场景
浅层神经网络适用于一些简单的、数据规模较小、特征相对容易提取的任务,如简单的手写数字识别、简单的文本分类等。深度学习则广泛应用于复杂的任务,如大规模图像识别与分类、语音识别、自然语言处理中的机器翻译、情感分析等,能够处理海量数据和复杂的模式。