当前位置: 首页 > article >正文

机器学习之浅层神经网络

文章目录

    • 一、浅层神经网络概述
      • (一)定义
      • (二)常见类型
    • 二、浅层神经网络的前向传播
    • 三、浅层神经网络的反向传播
    • 四、编写浅层神经网络案例(Python + NumPy 实现)
      • 代码解释
    • 五、浅层神经网络与深度学习的区别
      • (一)网络结构深度
      • (二)特征学习能力
      • (三)计算资源需求
      • (四)应用场景

一、浅层神经网络概述

(一)定义

浅层神经网络是一种相对简单的神经网络结构,相较于深度神经网络,其层数较少,一般包含输入层、一个或少数几个隐藏层以及输出层。因其结构简洁,在处理简单任务时,计算量较小、训练速度较快,但在面对复杂的非线性问题时,其特征提取和表达能力相对有限。

(二)常见类型

  1. 感知机(Perceptron):是最基础的人工神经网络模型,可看作是只有一个神经元的浅层神经网络,用于简单的线性分类任务。它接收多个输入并对其进行加权求和,再通过一个激活函数(早期常为阶跃函数)产生输出。虽然简单,但它是理解神经网络基本原理的基础。
  2. 多层感知机(Multilayer Perceptron,MLP):在感知机基础上增加了隐藏层,是较为常见的浅层神经网络。它可以处理更复杂的非线性问题,通过隐藏层的非线性变换,对输入数据进行特征提取和转换,进而在输出层完成分类或回归任务。

二、浅层神经网络的前向传播

前向传播是数据在浅层神经网络中从输入层流向输出层的过程。以一个包含输入层、一个隐藏层和输出层的浅层神经网络为例:

  1. 输入层 - 隐藏层:假设输入层有 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)
  2. 隐藏层 - 输出层:假设输出层有 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)

三、浅层神经网络的反向传播

反向传播是训练浅层神经网络的关键算法,旨在通过调整网络的权重和偏置,使网络输出与真实标签之间的误差最小化。具体步骤如下:

  1. 计算损失:依据网络的输出 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=1Nj=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=N1i=1N(yiti)2),计算当前样本的损失值 L L L
  2. 反向传播计算梯度:从输出层开始,逐层计算损失函数对每个权重和偏置的梯度。
    • 输出层:计算损失函数对输出层每个神经元的输入 z l z_l zl 的梯度 δ l = ∂ L ∂ z l \delta_l=\frac{\partial L}{\partial z_l} δl=zlL。例如,对于交叉熵损失函数和 Soft - max 激活函数, δ l = y l − t l \delta_l=y_l - t_l δl=yltl。然后计算损失函数对输出层权重 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 wljL=ajδl ∂ L ∂ b l = δ l \frac{\partial L}{\partial b_l}=\delta_l blL=δ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δlf(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 wjiL=xiδj ∂ L ∂ b j = δ j \frac{\partial L}{\partial b_j}=\delta_j bjL=δj
  3. 更新参数:根据计算得到的梯度,使用优化算法(如梯度下降法)更新权重和偏置。对于权重 w w w 和偏置 b b b,更新公式为 w = w − α ∂ L ∂ w w = w-\alpha\frac{\partial L}{\partial w} w=wαwL b = b − α ∂ L ∂ b b = b-\alpha\frac{\partial L}{\partial b} b=bαbL,其中 α \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) + 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)

代码解释

  1. 激活函数定义:定义了 Sigmoid 激活函数及其导数,用于神经网络中神经元的非线性变换和反向传播时计算梯度。
  2. 训练数据:创建了一个简单的二分类数据集 X X X 和对应的标签 y y y
  3. 参数初始化:随机初始化输入层到隐藏层的权重 W 1 W1 W1、隐藏层偏置 b 1 b1 b1、隐藏层到输出层的权重 W 2 W2 W2 和输出层偏置 b 2 b2 b2
  4. 训练过程
    • 前向传播:按照上述前向传播的步骤,依次计算隐藏层和输出层的输出。
    • 计算损失:使用均方误差损失函数计算当前样本的损失值。
    • 反向传播:按照反向传播的步骤,计算输出层和隐藏层的误差,进而计算梯度。
    • 参数更新:根据计算得到的梯度,使用梯度下降法更新权重和偏置。
  5. 预测:使用训练好的模型对训练数据进行预测,并将输出结果转换为 0 或 1 的分类标签。

五、浅层神经网络与深度学习的区别

(一)网络结构深度

浅层神经网络层数较少,通常只有一个或少数几个隐藏层;而深度学习模型,如深度神经网络、卷积神经网络(CNN)、循环神经网络(RNN)及其变体(LSTM、GRU 等),往往具有较多的隐藏层,层数可达数十层甚至更多。例如,在图像识别领域广泛应用的 AlexNet 有 8 层(5 个卷积层和 3 个全连接层),而 ResNet 可以有 50 层、101 层甚至更多层。

(二)特征学习能力

浅层神经网络由于层数有限,其特征提取能力相对较弱,对于复杂的数据模式,可能难以学习到足够丰富和抽象的特征。深度学习模型凭借其深度结构,能够自动从原始数据中逐层学习不同层次的特征,从低级的局部特征逐步学习到高级的全局抽象特征。例如在图像识别中,CNN 可以自动学习到图像的边缘、纹理等低级特征,以及物体的形状、类别等高级特征。

(三)计算资源需求

浅层神经网络计算量相对较小,对计算资源的需求较低,在普通的 CPU 环境下即可进行训练和推理。深度学习模型由于结构复杂、参数众多,训练过程需要大量的计算资源,通常需要使用 GPU 集群等高性能计算设备来加速训练过程。

(四)应用场景

浅层神经网络适用于一些简单的、数据规模较小、特征相对容易提取的任务,如简单的手写数字识别、简单的文本分类等。深度学习则广泛应用于复杂的任务,如大规模图像识别与分类、语音识别、自然语言处理中的机器翻译、情感分析等,能够处理海量数据和复杂的模式。


http://www.kler.cn/a/594217.html

相关文章:

  • matrix-breakout-2-morpheus通关攻略
  • 云原生后端:架构、技术与未来发展
  • 「JavaScript深入」轮询(Polling):基础的实时通信方式
  • 一篇文章入门Python Flask框架前后端数据库开发实践(pycharm在anaconda环境下)
  • 目标检测中的非极大值抑制(NMS)原理与实现解析
  • Java EE 进阶:MyBatis
  • Ubuntu-server-16.04 设置多个ip和多个ipv6
  • 【动态规划】矩阵连乘问题 C++(附代码实例和复杂度分析)
  • Java集合基础知识
  • C++模版(进阶)
  • 0321美团实习面试——技能大致内容
  • Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹
  • C# ManualResetEvent‌的高级用法
  • python字符级差异分析并生成 Word 报告 自然语言处理断句
  • Qt6+QML实现Windows屏幕录制
  • 【软考-架构】8.4、信息化战略规划-CRO-SCM-应用集成-电子商务
  • 【STM32】I²CC通信外设硬件I²CC读写MPU6050(学习笔记)
  • 【go】Go语言设计模式:函数与方法的权衡
  • Oracle 19c更换临时表空间操作步骤
  • STM32学习-Day4-寄存器开发流程