神经网络基础

发布于:2025-08-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

引言:神经网络(Neural Network):是一种模仿人脑神经元连接方式的数学模型,用于处理复杂的数据模式,如图像识别、自然语言处理和自动驾驶等任务。 (那我们就共同带着问题一起学习🚀)

一、人工神经网络

  • 什么是人工神经网络?
  • 人工神经网络基本单位是什么,有哪些重要组成部分?
  • 人工神经网络神经元工作原理是什么?
  • 人工神经网络有什么特点?

       神经网络是一种受人脑神经系统启发的计算框架,通过模拟神经元之间的连接和信息传递,学习数据中的模式和关系。它的核心思想是将输入数据通过一系列加权连接和数学变换,逐步转换为有意义的输出。神经网络特别擅长处理非线性问题,这使其在图像识别、自然语言处理等领域表现出色。

 人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。下图是生物神经元示意图:
在这里插入图片描述
既然神经网络是模仿生物神经网络结构和功能的计算模型, 那我们就需要了解人工神经网络的基本单位人工神经元有哪些组成部分,人工神经元(Neuron)作为人工神经网络(ANN)基本计算单元。它的核心任务是接收输入、进行计算并输出结果,类似于人脑中的神经元处理信号的方式。
在这里插入图片描述
其中人工神经元主要由以下部分组成:

  • 输入(Inputs x x x:从外部或其他神经元接收数据。
  • 权重(Weights, w w w:每个输入都有一个权重,表示其重要性。
  • 加权求和(Weighted Sum, z z z:将所有输入与对应权重相乘并相加,通常还加上一个偏置(Bias, b b b)。
  • 激活函数(Activation Function, f ( z ) f(z) f(z):决定神经元的输出是否被激活。
  • 输出(Output):将处理后的数据传递给下一层神经元。

神经元的计算可以表示为:
{ z = w 1 x 1 + w 2 x 2 + . . . + w n x n + b y = f ( z ) \begin{cases} z = w_1x_1 + w_2x_2 + ... + w_nx_n + b\\ y = f(z)\\ \end{cases} {z=w1x1+w2x2+...+wnxn+by=f(z)

其中:

  • x 1 , x 2 , . . . , x n x_1, x_2, ..., x_n x1,x2,...,xn 是输入数据
  • w 1 , w 2 , . . . , w n w_1, w_2, ..., w_n w1,w2,...,wn 是对应的权重
  • b b b 是偏置项(用于调整输出)
  • z z z 输入加权求和每个输入值 x i x_i xi 乘以对应的权重 w i w_i wi,再加上偏置 b b b
  • f ( z ) f(z) f(z)激活函数 激活函数的作用是引入非线性,使神经网络能够学习复杂模式,下面常见的激活函数(有兴趣的可跳转至另一篇博客 🔗神经网络之激活函数):
激活函数 公式 特点
Sigmoid f ( z ) = 1 1 + e − z f(z) = \frac{1}{1+e^{-z}} f(z)=1+ez1 适用于二分类,但易梯度消失
ReLU f ( z ) = max ⁡ ( 0 , z ) f(z) = \max(0, z) f(z)=max(0,z) 计算简单,适用于深度网络
Tanh f ( z ) = e z − e − z e z + e − z f(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} f(z)=ez+ezezez 归一化到 [-1,1],比 Sigmoid 好
Leaky ReLU f ( z ) = max ⁡ ( 0.01 z , z ) f(z) = \max(0.01z, z) f(z)=max(0.01z,z) 解决 ReLU 的“死亡神经元”问题
  • y y y是神经元的最终输出

知道单个人工神经网络神经元结构,那多个人工神经元来是如何构建神经网络 有什么特点呢?下面是人工神经网络主要结构,其中包含三层:
在这里插入图片描述

  • 输入层(Input Layer):接收外部数据,例如图像的像素值或文本的特征向量。
  • 隐藏层(Hidden Layers):位于输入层和输出层之间,负责对数据进行处理和特征提取。隐藏层的数量和神经元数量决定了网络的深度和复杂性。
  • 输出层(Output Layer):生成最终结果,例如分类任务中的类别标签或回归任务中的数值预测。

每个神经元接收来自前一层神经元的输入,经过加权求和后,通过激活函数(Activation Function)进行非线性变换并生成输出。并且人工神经网络有以下特点:

  • 同层的神经元之间没有连接
  • 第N层的每个神经元和第N-1层的所有神经元相连(这就是Fully Connected的含义),就是全连接神经网络(FCNN)
  • 全连接神经网络接收的样本数据是二维的,数据在每一层之间需要以二维的形式传递
  • 第N-1层神经元的输出就是第N层神经元的输入
  • 每个连接都有一个权重值(就是上面单个人工神经元w系数和b系数)

tips: 🔗神经网络可视化网站

二、人工神经网络搭建和参数计算

  • 构建神经网络过程有哪些步骤?
  • 如何选择激活函数?
  • 如何选择参数初始化?

迭代优化
(iterative optimization)
BEGIN
定义模型架构
初始化参数(权重初始化)
选择损失函数
选择优化器
前向传播(forward)
反向传播(backward)
模型评估
模型评估
END

搭建过程选择激活函数 -> 初始化参数 -> 选择损失函数 -> 选择优化器 -> 前向传播 -> 反向传播 -> 模型训练 -> 模型评估


如何选择激活函数?

  • 隐藏层:
    • ReLU(默认首选,计算高效,解决梯度消失问题)
    • Leaky ReLU / ELU(如果遇到 ReLU 神经元“死亡”)
  • 输出层:
    • 二分类:Sigmoid(输出 0~1 之间的概率)
    • 多分类:Softmax(概率归一化)
    • 回归问题:不使用激活函数或选择identity激活函数(或使用 ReLU/Tanh)
  • 特殊情况:
    • RNN 结构(循环神经网络):Tanh、Sigmoid(传统 RNN);ReLU(LSTM/GRU)
    • 深度 CNN(卷积神经网络):ReLU(高效且稳定
任务类型 隐藏层 输出层
二分类 ReLU Sigmoid
多分类(独热编码) ReLU Softmax
回归 ReLU/Tanh 无激活(线性输出)
深度 CNN ReLU Softmax
RNN/LSTM Tanh/ReLU Sigmoid/Softmax

备注:如有兴趣可以跳转至另篇博客: 🔗 神经网络之激活函数


如何选择参数初始化?

  • 使用 ReLU / Leaky ReLU(推荐) → He 初始化
  • 使用 Sigmoid / Tanh(不推荐) → Xavier(Glorot)初始化
  • 深度学习默认方法 → He 初始化(适用于大多数 CNN / MLP)
  • RNN(循环神经网络) → Orthogonal / Xavier 初始化
初始化方法 公式 适用情况 主要优点 主要缺点
全零初始化 W = 0 W = 0 W=0 不推荐 - 使所有神经元学习相同的权重,无法训练
随机初始化 W ∼ U ( − a , a ) W \sim U(-a, a) WU(a,a) 早期方法 简单易用 容易导致梯度消失或爆炸
Xavier/Glorot初始化 W ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) W \sim U\left(-\frac{\sqrt{6}}{\sqrt{n_{in} + n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in} + n_{out}}} \right) WU(nin+nout 6 ,nin+nout 6 ) Tanh / Sigmoid 适用于浅层网络,平衡梯度 对 ReLU 可能不适用
He/Kaiming 初始化 W ∼ N ( 0 , 2 n i n ) W \sim N\left(0, \frac{2}{n_{in}} \right) WN(0,nin2) ReLU / Leaky ReLU 适用于深层网络,防止梯度消失 可能仍需调优
LeCun初始化 W ∼ N ( 0 , 1 n i n ) W \sim N(0, \frac{1}{n_{in}}) WN(0,nin1) Tanh / Sigmoid 适用于小网络 深层网络可能效果不好

备注:默认情况下,PyTorch/TensorFlow框架已经自动使用适当的初始化方法,通常无需手动设置。如有兴趣可以跳转至另篇博客: 🔗 神经网络之参数初始化


如何选择损失函数?

任务类型 输出形式 推荐损失函数 PyTorch API
回归(无离群) 连续数值 MSE nn.MSELoss()
回归(有离群) 连续数值 MAE / Huber nn.L1Loss() / nn.HuberLoss()
二分类 概率(Sigmoid) Binary Cross Entropy nn.BCELoss() / nn.BCEWithLogitsLoss()
多分类 概率(Softmax) Cross Entropy nn.CrossEntropyLoss()
多标签分类 多个 Sigmoid 输出 nn.BCEWithLogitsLoss() 多标签分类问题
图像分割 概率图 Dice Loss / Cross Entropy 自定义 Dice Loss
NLP(语言模型) 词分布 KL Divergence / CE nn.KLDivLoss() / nn.CrossEntropyLoss()
度量学习 特征嵌入 Contrastive / Triplet 自定义损失函数

备注:如有兴趣可以跳转至另篇博客: 🔗 神经网络之损失函数


如何选择优化方法?

优化算法 优点 缺点 适用场景
SGD 简单、容易实现。 收敛速度较慢,容易震荡,特别是在复杂问题中。 用于简单任务,或者当数据特征分布相对稳定时。
Momentum 可以加速收敛,减少震荡,特别是在高曲率区域。 需要手动调整动量超参数,可能会在小步长训练中过度更新。 用于非平稳优化问题,尤其是深度学习中的应用。
AdaGrad 自适应调整学习率,适用于稀疏数据。 学习率会在训练过程中逐渐衰减,可能导致早期停滞。 适合稀疏数据,如 NLP 或推荐系统中的特征。
RMSProp 解决了 AdaGrad 学习率过早衰减的问题,适应性强。 需要选择合适的超参数,更新可能会过于激进。 适用于动态问题、非平稳目标函数,如深度学习训练。
Adam 结合了 Momentum 和 RMSProp 的优点,适应性强且稳定。 需要调节更多的超参数,训练过程中可能会产生较大波动。 广泛适用于各种深度学习任务,特别是非平稳和复杂问题。

备注:如有兴趣可以跳转至另篇博客: 🔗 神经网络之优化方法


如何构建神经网络?

在了解了人工神经网络基本结构后,现在我们构建神经网络
在pytorch中定义深度神经网络其实就是层堆叠的过程,继承自nn.Module,实现两个方法:

  • 实现__init__()中定义网络中的层结构,主要是全连接层,并进行初始化
  • 实现forward()在调用神经网络模型对象的时候,底层会自动调用该函数。该函数中为初始化定义的layer传入数据,进行前向传播等。

import torch
import torch.nn as nn
import torch.optim as optim

# 1、定义神经网络 继承自nn.Module
class DeepNeuralNetwork(nn.Module):

    # 1-1、实现__init__函数
    def __init__(self, input_size, num_classes):
        super(DeepNeuralNetwork, self).__init__()
        
        # 4层神经网络
        self.fc1 = nn.Linear(input_size, 256)  # 第一层
        self.bn1 = nn.BatchNorm1d(256)  # 批归一化
        self.fc2 = nn.Linear(256, 128)  # 第二层
        self.fc3 = nn.Linear(128, 64)  # 第三层
        self.fc4 = nn.Linear(64, num_classes)  # 输出层
        
        # 激活函数
        self.relu = nn.ReLU()
        
    # 1-2、实现forward函数
    def forward(self, x):
        x = self.relu(self.bn1(self.fc1(x)))
        x = self.relu(self.fc2(x))
        x = self.relu(self.fc3(x))
        x = self.fc4(x)
        return x

# 2、创建模型
input_size = 20
num_classes = 10
model = DeepNeuralNetwork(input_size, num_classes)

# 3、定义损失函数 & 优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 4、打印模型结构
print(model)
# 假设我们有 X_train (torch.Tensor) 和 y_train (torch.Tensor)
from torch.utils.data import DataLoader, TensorDataset

# 5、数据加载
batch_size = 32
train_dataset = TensorDataset(X_train, y_train)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)

# 6、训练循环
num_epochs = 50
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  # 使用 GPU 加速
model.to(device)

for epoch in range(num_epochs):
    model.train()  # 训练模式
    total_loss = 0

    for batch_X, batch_y in train_loader:
        batch_X, batch_y = batch_X.to(device), batch_y.to(device)

        # 前向传播
        outputs = model(batch_X)
        loss = criterion(outputs, batch_y)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_loss += loss.item()
    
    print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {total_loss:.4f}")
# 7、评估模型
model.eval()  # 进入评估模式
correct, total = 0, 0

with torch.no_grad():
    for batch_X, batch_y in train_loader:
        batch_X, batch_y = batch_X.to(device), batch_y.to(device)

        outputs = model(batch_X)
        _, predicted = torch.max(outputs, 1)  # 选择概率最大值的类别
        total += batch_y.size(0)
        correct += (predicted == batch_y).sum().item()

print(f"Test Accuracy: {100 * correct / total:.2f}%")

三、人工神经网络训练过程及常见类型

迭代优化
(iterative optimization)
BEGIN
初始化参数
(Parameter Initialization)
正向传播
(Forward Propagation)
损失函数
(Loss Function)
反向传播
(Back Propagation)
END

神经网络通过训练来优化参数,主要步骤包括:

  • 初始化参数(Parameter Initialization):随机设置权重和偏置。
  • 正向传播(Forward Propagation): 数据从输入层经过隐藏层传播到输出层,计算预测结果。
  • 计算损失(Loss Function):比较预测值与真实值,计算误差(如:均方误差(MSE)或交叉熵(Cross-Entropy)。
  • 反向传播(Back Propagation):计算误差对每个权重的影响,并通过梯度下降算法调整权重,根据损失梯度更新参数。
  • 迭代优化(Iterative Optimization):重复上述步骤,直到损失足够小或收敛。

常见神经网络的类型:

  • 前馈神经网络(FNN):信息单向传播,如简单的分类器。
  • 卷积神经网络(CNN):用于图像处理,包含卷积层和池化层。
  • 循环神经网络(RNN):适用于序列数据,如语音识别、时间序列预测。
  • 生成对抗网络(GAN):用于生成数据,如 AI 画图。
  • 变分自编码器(VAE):用于数据压缩和生成。

四、神经网络优势与局限性

  • 优势:
    • 能够学习复杂的非线性模式。
    • 通过训练自适应调整参数,适用于多种任务。
    • 支持并行计算,可在 GPU 上高效运行。
  • 局限性:
    • 数据依赖 :需要大量标注数据才能有效训练。
    • 计算资源 :深度网络需要高性能硬件(如 GPU/TPU)。
    • 可解释性差 :被称为“黑箱模型”,难以解释决策过程。
    • 过拟合风险 :可能过度适应训练数据,泛化能力下降。

五、实战DEMO(举个🌰)

在这里插入图片描述
对于一个手写数字识别任务:

  • 输入层:接收 28×28 像素的灰度图像,每个像素作为一个输入值。
  • 隐藏层:提取图像的特征,如边缘、曲线等。
  • 输出层:输出 10 个概率值(0-9 的可能性),选取最大值作为最终预测结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score


def show_mnist_img(img_pixel_arr, target):
    '''
     展示手写数字像素内容
    :param img_pixel_arr: 
    :param target: 
    :return: 
    '''
    # 重塑为28x28的矩阵
    current_img_arr = img_pixel_arr.reshape(28, 28)
    
    # 设置 Matplotlib 使用的字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 显示图像
    plt.imshow(current_img_arr, cmap='gray')
    plt.title(f"标签: {target}")
    plt.show()
    

# 1、加载 MNIST 数据集,并展示第一个图片
print("加载 MNIST 数据集...")
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"]
first_image = X.iloc[0].values
show_mnist_img(first_image, y[0])

# 2、将标签转换为整数
y = y.astype(np.int8)

# 3、将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 4、创建并训练逻辑回归模型
print("训练逻辑回归模型...")
model = LogisticRegression(max_iter=1000)  # 增加 max_iter 以确保收敛
model.fit(X_train, y_train)

# 5、在测试集上进行预测
print("在测试集上进行预测...")
y_predict = model.predict(X_test)

# 6、评估模型的准确率
accuracy = accuracy_score(y_test, y_predict)
print(f"模型准确率: {accuracy:.4f}")

在这里插入图片描述

加载 MNIST 数据集...
训练逻辑回归模型...
在测试集上进行预测...
模型准确率: 0.9157

六、总结

神经网络应用场景包括:

  • 图像识别:卷积神经网络(CNN)用于图像分类、目标检测等任务。
  • 自然语言处理(NLP):循环神经网络(RNN)和 Transformer 模型用于机器翻译、文本生成等。
  • 预测分析:用于时间序列预测、股票市场分析和推荐系统。
  • 游戏与控制:强化学习中的神经网络应用于游戏 AI 和机器人控制。
  • 推荐系统:如 Netflix、淘宝推荐商品

神经网络是一种强大的计算模型,通过模拟人脑神经元的工作方式,学习和处理复杂数据。它由输入层、隐藏层和输出层组成,通过前向传播和反向传播进行训练。尽管存在数据依赖和可解释性等挑战,神经网络在图像识别、自然语言处理和预测分析等领域的广泛应用,展现了其巨大潜力。


网站公告

今日签到

点亮在社区的每一天
去签到