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