机器学习之浅层神经网络

server/2025/3/23 8:19:54/

文章目录

    • 一、浅层神经网络概述
      • (一)定义
      • (二)常见类型
    • 二、浅层神经网络的前向传播
    • 三、浅层神经网络的反向传播
    • 四、编写浅层神经网络案例(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) + 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)

代码解释

  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.ppmy.cn/server/176989.html

相关文章

数学建模:MATLAB卷积神经网络

一、简述 卷积神经网络是一种处理具有网格结构数据的深度学习模型,由输入层、卷积层、池化层、全连接层、输出层组成。 输出层:将图像转换为其对应的由像素值构成的二维矩阵,并存储二维矩阵 卷积层:提取图像的底层特征&#xf…

双非控制学硕女生,对渲染、音视频、医疗影像感兴趣,如何规划争取拿到中厂开发岗位?

今天给大家分享的是一位粉丝的提问,双非控制学硕女生,对渲染、音视频、医疗影像感兴趣,如何规划争取拿到中厂开发岗位? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。…

Linux(Ubuntu)系统安装Docker与Docker Compose完整指南

本文是为需要在Ubuntu系统部署容器服务的开发者准备的详细教程。我们将分两个主要部分讲解:Docker引擎的标准安装流程和Docker Compose的配置方法。所有操作均在终端执行,建议使用Ubuntu 18.04及以上版本。 一、Docker引擎安装全流程 (总耗时…

浅谈canal实例 在docker里面安装canal镜像 Canal监听MySQL数据库变更并同步更新Redis和Elasticsearch 示例

目录 1. 环境准备 1.1 MySQL配置 1.2 部署Canal Server 2. Spring Boot项目配置 2.1 添加依赖 2.2 配置参数 3. 实现Canal监听与同步 3.1 Canal客户端监听 3.2 同步到Redis 3.3 同步到Elasticsearch 4. 注意事项 在Spring Boot中通过Canal监听MySQL数据库变更并同步…

数据结构-----队列

顺序队列(Queue) 一、队列核心概念 1. 基本特性 先进先出(FIFO):最早入队的元素最先出队操作限制: 队尾(Rear):唯一允许插入的位置队头(Front)&…

第四周日志-用网络请求理解bp(2)

python网络请求库实现数据抓取、API调用还是后端服务的交互 以urllib3库为例 请求: import urllib3 http urllib3.PoolManager() # 创建连接池管理对象url1"" r1 http.request(GET,url1) #request print(r1.status) request&…

鸿蒙NEXT项目实战-百得知识库05

代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

neo4j-如何让外部设备访问wsl中的neo4j

WSL 运行在一个虚拟网络环境中,它的 IP 只能被宿主 Windows 访问,外部设备无法直接访问 WSL 的端口。你需要在 Windows 上转发端口,让外部设备可以访问 Windows 并映射到 WSL。 1. 获取 WSL 的 IP 地址 在 WSL 中运行以下命令获取其 IP 地址…