【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

在这里插入图片描述


1. 引言

神经网络的重要性
作为人工智能的核心技术之一,神经网络通过模拟人脑神经元的工作机制,成为解决复杂模式识别、预测和决策任务的利器。从图像分类到自然语言生成,其应用几乎渗透所有AI领域。

发展脉络

  • 1958年感知机诞生:Frank Rosenblatt提出单层感知机,开创神经网络先河,但受限于线性可分性。
  • 1980年代多层网络突破:反向传播算法与隐藏层的引入,使神经网络能够解决非线性问题(如XOR)。
  • 深度学习革命:算力提升与大数据驱动下,深度神经网络(DNN、CNN、RNN)在21世纪取得颠覆性成果。

本文目标

  • 拆解感知机的数学模型与训练过程。
  • 揭示多层神经网络如何通过隐藏层和激活函数突破线性限制。
  • 通过代码实战演示两类模型的应用场景。

2. 感知机模型

2.1 模型结构与数学原理
感知机(Perceptron)是最简单的人工神经网络模型,由输入层和输出层直接连接构成,无隐藏层。其核心功能是对输入数据进行二分类(如判断“是/否”)。

输入与权重

  • 输入向量 x = [ x 1 , x 2 , . . . , x n ] x = [x_1, x_2, ..., x_n] x=[x1,x2,...,xn],表示样本的 n n n 个特征。
  • 权重向量 w = [ w 1 , w 2 , . . . , w n ] w = [w_1, w_2, ..., w_n] w=[w1,w2,...,wn],每个特征对应一个权重,决定特征的重要性。
  • 偏置项 b b b,用于调整分类决策边界的偏移量。

计算过程

  1. 加权求和:输入与权重的线性组合加上偏置,得到净输入 z z z
    z = ∑ i = 1 n w i x i + b z = \sum_{i=1}^{n} w_i x_i + b z=i=1nwixi+b
  2. 激活函数:阶跃函数(Step Function)将 z z z 转换为二分类输出(0或1)。
    y = { 1 if  z ≥ 0 , 0 otherwise . y = \begin{cases} 1 & \text{if } z \geq 0, \\ 0 & \text{otherwise}. \end{cases} y={10if z0,otherwise.

几何意义

  • 感知机本质是在 n n n 维空间中构造一个超平面 w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0,将数据分为两类。
  • 例如,二维空间中的分类表现为一条直线(如 w 1 x 1 + w 2 x 2 + b = 0 w_1 x_1 + w_2 x_2 + b = 0 w1x1+w2x2+b=0)。

2.2 激活函数:阶跃函数
阶跃函数是感知机的核心组件,其特性如下:

  • 非线性特性:虽然函数本身非连续,但赋予了感知机非线性分类能力。
  • 输出二值化:将连续输入映射为离散的0或1,适合二分类任务。

局限性

  • 无法输出概率(如Sigmoid函数)或多分类结果。
  • 梯度为零,导致无法通过梯度下降法直接优化(需依赖误差修正算法)。

2.3 学习算法:误差修正
感知机通过迭代调整权重和偏置,逐步减少分类错误。

步骤详解

  1. 初始化参数:权重 w w w 和偏置 b b b 初始化为零或随机小值。
  2. 遍历训练数据:对每个样本 ( x ( i ) , y true ( i ) ) (x^{(i)}, y_{\text{true}}^{(i)}) (x(i),ytrue(i))
    • 计算预测值 y pred ( i ) = Step ( w ⋅ x ( i ) + b ) y_{\text{pred}}^{(i)} = \text{Step}(w \cdot x^{(i)} + b) ypred(i)=Step(wx(i)+b)
    • 计算误差 ϵ = y true ( i ) − y pred ( i ) \epsilon = y_{\text{true}}^{(i)} - y_{\text{pred}}^{(i)} ϵ=ytrue(i)ypred(i)
  3. 更新规则:若分类错误( ϵ ≠ 0 \epsilon \neq 0 ϵ=0),按以下规则调整参数:
    w new = w old + η ⋅ ϵ ⋅ x ( i ) w_{\text{new}} = w_{\text{old}} + \eta \cdot \epsilon \cdot x^{(i)} wnew=wold+ηϵx(i)
    b new = b old + η ⋅ ϵ b_{\text{new}} = b_{\text{old}} + \eta \cdot \epsilon bnew=bold+ηϵ
    • η \eta η 为学习率(Learning Rate),控制参数更新步长。

收敛性

  • 若训练数据线性可分,感知机保证在有限步内收敛。
  • 若数据非线性可分,算法将无限震荡(需引入多层网络)。

2.4 局限性:线性可分问题
XOR问题的失败案例

  • XOR(异或)逻辑的真值表如下:

    x 1 x_1 x1 x 2 x_2 x2 y y y
    000
    011
    101
    110
  • 感知机无法找到一条直线将XOR的四类样本正确分类(需曲线或非线性边界)。

解决思路

  • 引入隐藏层:通过多层网络组合多个感知机,实现非线性决策边界。
  • 更换激活函数:使用Sigmoid、ReLU等连续可导函数,支持梯度传播。

3. 多层神经网络

3.1 隐藏层的作用与结构设计
为什么需要隐藏层?
单层感知机仅能解决线性可分问题,而真实世界的数据(如图像、语音)往往具有复杂的非线性关系。隐藏层的引入通过以下机制突破这一限制:

  1. 特征抽象与组合

    • 每一层隐藏神经元通过权重和激活函数对输入进行非线性变换,逐步提取高阶特征。
    • 例如,在图像识别中:
      • 第一层可能检测边缘和纹理。
      • 后续层组合这些基础特征,识别更复杂的结构(如眼睛、车轮)。
  2. 非线性映射能力

    • 隐藏层叠加激活函数(如Sigmoid、ReLU),将原始输入映射到高维空间,使得线性不可分问题在新的空间中可分。
    • 数学表达(以单隐藏层为例):
      输出 = f 2 ( W 2 ⋅ f 1 ( W 1 ⋅ x + b 1 ) + b 2 ) \text{输出} = f_2(W_2 \cdot f_1(W_1 \cdot x + b_1) + b_2) 输出=f2(W2f1(W1x+b1)+b2)
      • f 1 , f 2 f_1, f_2 f1,f2 为激活函数, W 1 , W 2 W_1, W_2 W1,W2 为权重矩阵, b 1 , b 2 b_1, b_2 b1,b2 为偏置。

3.2 全连接层的结构与前向传播
全连接层(Dense Layer)的定义

  • 每一层的每个神经元均与下一层的所有神经元连接,形成密集的权重矩阵。
  • 参数规模:若输入层有 n n n 个神经元,隐藏层有 m m m 个神经元,则权重矩阵维度为 m × n m \times n m×n

前向传播计算流程(以2层网络为例):

  1. 输入层 → 隐藏层

    • 输入数据 x x x(维度 n × 1 n \times 1 n×1)。
    • 权重矩阵 W 1 W_1 W1(维度 m × n m \times n m×n),偏置 b 1 b_1 b1(维度 m × 1 m \times 1 m×1)。
    • 计算净输入:
      z 1 = W 1 ⋅ x + b 1 z_1 = W_1 \cdot x + b_1 z1=W1x+b1
    • 激活函数处理:
      a 1 = σ ( z 1 ) ( σ 如 ReLU、Sigmoid ) a_1 = \sigma(z_1) \quad (\sigma \text{ 如 ReLU、Sigmoid}) a1=σ(z1)(σ  ReLUSigmoid)
  2. 隐藏层 → 输出层

    • 权重矩阵 W 2 W_2 W2(维度 k × m k \times m k×m),偏置 b 2 b_2 b2(维度 k × 1 k \times 1 k×1)。
    • 计算净输入:
      z 2 = W 2 ⋅ a 1 + b 2 z_2 = W_2 \cdot a_1 + b_2 z2=W2a1+b2
    • 输出层激活函数(根据任务选择):
      y pred = Softmax ( z 2 ) ( 多分类 ) 或 Sigmoid ( z 2 ) ( 二分类 ) y_{\text{pred}} = \text{Softmax}(z_2) \quad (\text{多分类}) \quad \text{或} \quad \text{Sigmoid}(z_2) \quad (\text{二分类}) ypred=Softmax(z2)(多分类)Sigmoid(z2)(二分类)

向量化计算的优势

  • 利用矩阵运算(如 numpy.dot)高效处理批量数据,加速训练。
  • 示例:一次性计算100个样本的前向传播(输入矩阵维度 100 × n 100 \times n 100×n)。

3.3 激活函数的关键角色
常用激活函数对比

函数名称公式特点与适用场景
Sigmoid σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+ez1输出范围[0,1],适合概率输出;易梯度消失。
ReLU ReLU ( z ) = max ⁡ ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)缓解梯度消失,计算高效;广泛用于隐藏层。
Tanh tanh ⁡ ( z ) = e z − e − z e z + e − z \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} tanh(z)=ez+ezezez输出范围[-1,1],中心对称;梯度强于Sigmoid。

为什么需要非线性激活函数?

  • 若全使用线性函数(如恒等变换),多层网络等效于单层线性变换,失去深层结构的价值。
  • 非线性激活函数使网络能够拟合任意复杂函数(参见通用近似定理)。

4. 实战示例

4.1 单层感知机实现逻辑AND运算
目标:通过感知机模型学习AND逻辑的真值表(仅当两输入均为1时输出1)。

代码实现

import numpy as npclass Perceptron:def __init__(self, input_size, lr=0.1):self.weights = np.zeros(input_size)  # 初始化权重self.bias = 0                        # 初始化偏置self.lr = lr                         # 学习率def step_function(self, z):"""阶跃函数"""return 1 if z >= 0 else 0def train(self, X, y, epochs=100):"""训练过程:逐样本更新权重"""for _ in range(epochs):for x_i, y_true in zip(X, y):# 计算净输入与预测值z = np.dot(x_i, self.weights) + self.biasy_pred = self.step_function(z)# 计算误差并更新参数error = y_true - y_predself.weights += self.lr * error * x_iself.bias += self.lr * error# 定义AND逻辑的输入与标签
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 0, 0, 1])# 训练感知机
perceptron = Perceptron(input_size=2)
perceptron.train(X, y, epochs=10)# 输出训练后的参数
print("训练后权重:", perceptron.weights)  # 预期输出接近 [1, 1]
print("训练后偏置:", perceptron.bias)    # 预期输出接近 -1.5

输出结果验证

  • 输入 [1, 1] 时,计算 ( z = 11 + 11 - 1.5 = 0.5 ),输出1(正确分类)。
  • 其他输入(如 [0,1])均输出0。

4.2 多层神经网络解决XOR问题
目标:构建含隐藏层的神经网络,解决感知机无法处理的异或(XOR)分类任务。

代码实现(使用Keras)

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense# XOR问题的输入与标签
X_xor = np.array([[0,0], [0,1], [1,0], [1,1]])
y_xor = np.array([0, 1, 1, 0])# 定义模型结构
model = Sequential([Dense(2, activation='relu', input_shape=(2,)),  # 隐藏层(2个神经元,ReLU激活)Dense(1, activation='sigmoid')                 # 输出层(Sigmoid输出概率)
])# 编译模型:指定优化器和损失函数
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 训练模型
model.fit(X_xor, y_xor, epochs=1000, verbose=0)# 预测并输出结果
predictions = model.predict(X_xor).round()
print("XOR预测结果:", predictions.flatten())  # 预期输出 [0, 1, 1, 0]

关键解释

  • 隐藏层设计:2个神经元足以学习XOR的非线性边界。
  • 激活函数选择:隐藏层使用ReLU加速训练,输出层使用Sigmoid输出概率。
  • 优化器与损失:Adam优化器自适应调整学习率,交叉熵损失适合二分类任务。


5. 总结与扩展学习

5.1 核心总结

  • 感知机
    • 单层结构,依赖阶跃函数实现二分类。
    • 局限性:仅能解决线性可分问题(如AND、OR),无法处理XOR等非线性任务。
  • 多层神经网络
    • 通过隐藏层和激活函数(如ReLU、Sigmoid)实现非线性映射。
    • 全连接层的前向传播是深度学习的基础框架。

5.2 扩展方向

  1. 反向传播算法
    • 通过链式法则计算损失函数对权重的梯度,利用梯度下降优化参数。
    • 核心公式(均方误差损失为例):
      ∂ L ∂ w = ∂ L ∂ y pred ⋅ ∂ y pred ∂ z ⋅ ∂ z ∂ w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial y_{\text{pred}}} \cdot \frac{\partial y_{\text{pred}}}{\partial z} \cdot \frac{\partial z}{\partial w} wL=ypredLzypredwz
  2. 现代网络结构
    • 卷积神经网络(CNN):局部感知与参数共享,高效处理图像数据。
    • 循环神经网络(RNN):时序数据处理(如文本、语音)。
    • Transformer:自注意力机制,主导自然语言处理(如BERT、GPT)。
  3. 训练优化技巧
    • 批量归一化(BatchNorm):加速训练,减少对初始化的敏感度。
    • Dropout:随机屏蔽神经元,防止过拟合。
    • 学习率调度:动态调整学习率(如余弦退火)。

6. 常见问题QA

Q1: 为什么感知机不能解决异或(XOR)问题?
A: 单层感知机本质是线性分类器,而XOR需要非线性决策边界(如圆形或曲线)。多层神经网络通过隐藏层的非线性激活函数组合多个线性边界,解决此类问题。

Q2: 如何选择隐藏层的神经元数量和层数?
A: 需通过实验调整:

  • 简单任务(如XOR):1层隐藏层 + 2~4个神经元。
  • 复杂任务(如图像分类):深层网络(如ResNet有50层以上)。
  • 过拟合时减少层数或神经元,欠拟合时增加。

Q3: 激活函数可以全部使用ReLU吗?
A: 隐藏层通常优先使用ReLU(缓解梯度消失),但输出层需根据任务选择:

  • 二分类:Sigmoid。
  • 多分类:Softmax。
  • 回归:线性或恒等函数。

Q4: 神经网络是否层数越多越好?
A: 并非绝对。层数增加可能导致:

  • 梯度消失/爆炸(需结合残差连接、归一化)。
  • 训练时间与算力需求激增。
  • 过拟合风险上升(需正则化、数据增强)。

Q5: 如何调试神经网络的性能问题?
A: 分步骤排查:

  1. 检查数据质量(标签正确性、缺失值)。
  2. 监控训练损失:
    • 损失不下降:可能学习率过低、模型容量不足。
    • 损失震荡:可能学习率过高、数据噪声大。
  3. 使用验证集评估过拟合/欠拟合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sparkSQL读入csv文件写入mysql(2)

(二)创建数据库和表 接下来,我们去创建一个新的数据库,数据表,并插入一条数据。 -- 创建数据库 CREATE DATABASE spark; -- 使用数据库 USE spark;-- 创建表 create table person(id int, name char(20), age int);-- …

JVM如何处理多线程内存抢占问题

目录 1、堆内存结构 2、运行时数据 3、内存分配机制 3.1、堆内存结构 3.2、内存分配方式 1、指针碰撞 2、空闲列表 4、jvm内存抢占方案 4.1、TLAB 4.2、CAS 4.3、锁优化 4.4、逃逸分析与栈上分配 5、问题 5.1、内存分配竞争导致性能下降 5.2、伪共享&#xff08…

Ubuntu---omg又出bug了

自用遇到问题的合集 250518——桌面文件突然消失 ANS:参考博文

正则表达式与文本处理的艺术

引言 在前端开发领域,文本处理是一项核心技能。正则表达式作为一种强大的模式匹配工具,能够帮助我们高效地处理各种复杂的文本操作任务。 正则表达式基础 什么是正则表达式? 正则表达式是一种用于匹配字符串中字符组合的模式。它由一系列…

初学c语言15(字符和字符串函数)

一.字符串分类函数 头文件:ctype.h 作用:判断是什么类型的字符 函数举例: 函数 符合条件就为真 islower判断是否为小写字符(a~z)isupper判断是否为大写字符(A~Z)isdigit十进制数字&#xf…

12-串口外设

一、串口外设的基本概述 1、基本定义 串口通信,通过在通信双方之间以比特位(bit)的形式逐一发送或接收数据,实现了信息的有效传递。其通信方式不仅简单可靠,而且成本很低。 2、stm32的串口 下面是两个MCU的数据交互&…

NE555双音门铃实验

1脚为地。通常被连接到电路共同接地。 2脚为触发输入端。 3脚为输出端,输出的电平状态受触发器的控制,而触发器受上比较器6脚和下比较器2脚的控制。当触发器接受上比较器A1从R脚输入的高电平时,触发器被置于复位状态,3脚输出低电…

Redis分布式锁实现

概述 为什么要要分布式锁 在并发编程中,我们通过锁,来避免由于竞争而造成的数据不一致问题。 通常,我们以synchronized 、Lock来使用它。Java中的锁,只能保证在同一个JVM进程内中执行 如果需要在分布式集群环境下的话&#xff0…

软件设计师-错题笔记-网络基础知识

1. 解析: 1.子网划分相关知识: 在IPv4地址中,/27表示子网掩码为255.255.255.224,它将一个C类网络(默认子网掩码255.255.255.0)进一步划分 对于子网掩码255.255.255.224,其对应的二进制为111…

Fine-Tuning Llama2 with LoRA

Fine-Tuning Llama2 with LoRA 1. What is LoRA?2. How does LoRA work?3. Applying LoRA to Llama2 models4. LoRA finetuning recipe in torchtune5. Trading off memory and model performance with LoRAModel ArgumentsReferences https://docs.pytorch.org/torchtune/ma…

python打卡day29

类的装饰器 知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 回顾一下,函数的装饰器是 :接收一个函数,返回一个修改后的函数。类也有修饰器,类装饰器本质上确…

十一、STM32入门学习之FREERTOS移植

目录 一、FreeRTOS1、源码下载:2、解压源码 二、移植步骤一:在需要移植的项目中新建myFreeRTOS的文件夹,用于存放FREERTOS的相关源码步骤二:keil中包含相关文件夹和文件引用路径步骤三:修改FreeRTOSConfig.h文件的相关…

2025 年十大网络安全预测

随着我们逐步迈向 2026 年,网络安全领域正处于一个关键的转折点,技术创新与数字威胁以前所未有的复杂态势交织在一起。 地缘政治环境进一步加剧了这些网络安全挑战,国际犯罪组织利用先进的技术能力来追求战略目标。 人工智能在这一不断演变…

Mac 环境下 JDK 版本切换全指南

概要 在 macOS 上安装了多个 JDK 后,可以通过系统自带的 /usr/libexec/java_home 工具来查询并切换不同版本的 Java。只需在终端中执行 /usr/libexec/java_home -V 列出所有已安装的 JDK,然后将你想使用的版本路径赋值给环境变量 JAVA_HOME,…

中级网络工程师知识点6

1.堆叠方式可以共享使用交换机背板带宽;级联方式可以使用双绞线将交换机连接在一起 2.光功率计是专门测量光功率大小的仪器,在对光缆进行检测时,通过在光缆的发送端和接收端分别测量光功率,进而计算出光衰情况。 3.光时域反射计…

动态规划——乌龟棋

题目描述 解题思路 首先这是一个很明显的线性dp的题目,很容易发现规律 数据输入 我们用 h[ N ] 数组存储每一个格子的分数 用 cnt [ ],数组表示每一中卡片的数目 1,状态表示 因为这里一个有4种跳跃方式可以选择 f[ i ][ a ][ b ][ c ][ d…

C#自定义控件-实现了一个支持平移、缩放、双击重置的图像显示控件

1. 控件概述 这是一个继承自 Control 的自定义控件,主要用于图像的显示和交互操作,具有以下核心功能: 图像显示与缩放(支持鼠标滚轮缩放)图像平移(支持鼠标拖拽)视图重置(双击重置…

C++ map multimap 容器:赋值、排序、大小与删除操作

概述 map和multimap是C STL中的关联容器,它们存储的是键值对(key-value pairs),并且会根据键(key)自动排序。两者的主要区别在于: map不允许重复的键multimap允许重复的键 本文将详细解析示例代码中涉及的map操作,包括赋值、排…

AI Agent开发第70课-彻底消除RAG知识库幻觉(4)-解决知识库问答时语料“总重复”问题

开篇 “解决知识库幻觉”系列还在继续,这是因为:如果只是个人玩玩,像自媒体那些说的什么2小时搭一个知识库+deepseek不要太香一类的RAG或者是基于知识库的应用肯定是没法用在企业级落地上的。 我们真的经历过或者正在经历的人都是知道的,怎么可能2小时就搭建完成一个知识…

【DAY22】 复习日

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 仔细回顾一下之前21天的内容 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测