详细介绍:深度学习入门:从神经网络基础到模型训练优化

news/2025/10/4 13:07:20/文章来源:https://www.cnblogs.com/wzzkaifa/p/19125503

深度学习入门:从神经网络基础到模型训练优化

在人工智能飞速发展的今天,深度学习已成为推动技术进步的核心引擎之一。无论是图像识别、语音处理还是自然语言理解,背后都离不开一个关键的数学模型——人工神经网络(Artificial Neural Network, ANN)

本文将带你从零开始,深入浅出地理解神经网络的基本构成、前向传播机制、激活函数的作用、参数初始化策略,以及如何使用 PyTorch 构建一个完整的神经网络模型,并深入探讨损失函数、反向传播与优化算法等核心训练机制。


一、什么是神经网络?

人工神经网络是对生物大脑神经元工作方式的一种数学模拟。它由多个相互连接的“人工神经元”组成,通过层层传递和处理信息,最终实现对复杂数据模式的学习与预测。

生物神经元的启发

在人脑中,神经元通过树突接收信号,细胞体对信号进行加权求和,当电位达到阈值时,轴突就会发出电信号。这一过程启发了人工神经元的设计:

  • 输入信号:相当于树突接收到的信息。
  • 权重(w):表示每个输入的重要性。
  • 偏置(b):相当于激活阈值。
  • 激活函数:决定神经元是否“激活”。

生物神经元
仿生物神经元


二、神经网络的基本结构

一个典型的神经网络由三层构成:

  1. 输入层(Input Layer)
    接收原始数据(如图像像素、文本向量等),每个特征对应一个神经元。

  2. 隐藏层(Hidden Layers)
    位于输入层和输出层之间,负责提取数据中的高级特征。网络的“深度”即指隐藏层的数量。

  3. 输出层(Output Layer)
    输出最终的预测结果,例如分类概率或回归值。
    神经网络

特点


三、前向传播:数据如何流动?

前向传播(Forward Propagation)是神经网络的核心计算过程。数据从输入层出发,逐层计算,直到输出层产生预测结果。

神经元内部发生了什么?

每个神经元在前向传播中会产生两个关键值:

  1. 内部状态值 z
    所有输入与其对应权重的加权和加上偏置:
    z=w⋅x+bz = w \cdot x + b z=wx+b

  2. 激活值 a
    将内部状态值通过激活函数进行非线性变换:
    a=f(z)a = f(z) a=f(z)
    这个输出会作为下一层神经元的输入。

这个过程不断重复,直到最后一层输出结果。


四、为什么需要激活函数?

如果没有激活函数,无论网络有多少层,其本质仍然是一个线性模型。因为多个线性变换的组合依然是线性的。

激活函数的作用


常见激活函数对比

1. Sigmoid 函数

当输入值超出 [-6, 6] 时,几乎饱和,导致信息丢失。

2. Tanh(双曲正切)
  • 公式:tanh⁡(x)=ex−e−xex+e−x\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex
  • 输出范围:(-1, 1)
  • 优点:以 0 为中心,收敛更快
  • 缺点:仍存在梯度消失问题
    Tanh

适用于隐藏层,但不如 ReLU 流行。

3. ReLU(Rectified Linear Unit)
  • 公式:ReLU(x)=max⁡(0,x)\text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
  • 优点:
    • 计算简单,训练效率高
    • 在 x > 0 时梯度恒为 1,缓解梯度消失
    • 引入稀疏性,减少过拟合
  • 缺点:
    • “死亡 ReLU”问题:某些神经元永远不激活(输出为 0)
      ReLU

目前最常用的激活函数,尤其适合深层网络。

4. Softmax(多分类输出)
  • 公式:
    Softmax(x_i)=ex_i∑_jex_j\text{Softmax}(x\_i) = \frac{e^{x\_i}}{\sum\_j e^{x\_j}} Softmax(x_i)=_jex_jex_i
  • 作用:将输出转换为概率分布,所有输出之和为 1
  • 应用场景:多分类任务的输出层
import torch
scores = torch.tensor([0.2, 1.3, 3.75])
probabilities = torch.softmax(scores, dim=0)
print(probabilities)
# 输出: tensor([0.0212, 0.0638, 0.7392])

如何选择激活函数?

层级推荐选择
隐藏层ReLU(首选),Leaky ReLU(防死亡)
输出层(二分类)Sigmoid
输出层(多分类)Softmax
输出层(回归)Identity(恒等函数)

尽量避免在隐藏层使用 Sigmoid。


五、参数初始化:为何如此重要?

神经网络训练前,权重(w)和偏置(b)需要初始化。不当的初始化会导致:

常见初始化方法

方法说明
全0初始化所有权重视为 0 → 对称问题,不可用
全1初始化所有权重视为 1 → 同上
随机初始化(均匀/正态)小范围随机值,但需注意尺度
Xavier 初始化考虑输入输出维度,保持方差一致,适合 Sigmoid/Tanh
Kaiming(He)初始化专为 ReLU 设计,推荐用于 ReLU 及其变体

现代深度学习中,优先使用 Kaiming 或 Xavier 初始化

PyTorch 中的初始化示例

import torch.nn as nn
linear = nn.Linear(5, 3)
# Xavier 初始化(正态分布)
nn.init.xavier_normal_(linear.weight)
# Kaiming 初始化(ReLU 专用)
nn.init.kaiming_normal_(linear.weight, nonlinearity='relu')
# 偏置通常初始化为 0 或 1
nn.init.zeros_(linear.bias)

六、动手实践:用 PyTorch 搭建神经网络

下面我们用 PyTorch 构建一个简单的三层神经网络:

  • 第一层:Sigmoid 激活,Xavier 初始化
  • 第二层:ReLU 激活,Kaiming 初始化
  • 输出层:Softmax 归一化(多分类)
import torch
import torch.nn as nn
from torchsummary import summary
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.linear1 = nn.Linear(3, 3)
nn.init.xavier_normal_(self.linear1.weight)
nn.init.ones_(self.linear1.bias)
self.linear2 = nn.Linear(3, 2)
nn.init.kaiming_normal_(self.linear2.weight, nonlinearity='relu')
nn.init.ones_(self.linear2.bias)
self.out = nn.Linear(2, 2)
def forward(self, x):
x = torch.sigmoid(self.linear1(x))
x = torch.relu(self.linear2(x))
x = torch.softmax(self.out(x), dim=-1)
return x
# 训练测试
model = Model()
data = torch.randn(5, 3)
output = model(data)
print("输入形状:", data.shape)   # [5, 3]
print("输出形状:", output.shape) # [5, 2]

查看模型参数

for name, param in model.named_parameters():
print(name, param.shape)

输出:

linear1.weight torch.Size([3, 3])
linear1.bias   torch.Size([3])
linear2.weight torch.Size([2, 3])
linear2.bias   torch.Size([2])
out.weight     torch.Size([2, 2])
out.bias       torch.Size([2])

模型参数总数计算

公式:对于第 nnn 层(输入维度 mmm,输出维度 nnn),参数量为:
Params=m×n+n\text{Params} = m \times n + n Params=m×n+n

总参数数 = 3×3+3+3×2+2+2×2+2=263×3+3 + 3×2+2 + 2×2+2 = 263×3+3+3×2+2+2×2+2=26

使用 torchsummary 验证:

summary(model, input_size=(3,))

七、广播机制(Broadcasting)简介

在张量运算中,不同形状的数组有时也能相加。这得益于广播机制

广播规则

  1. 维度不足时,左侧补 1
  2. 维度不匹配时,若某维度为 1,则可扩展至匹配
  3. 若维度不为 1 且不相等,则报错
示例
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])  # (2, 3)
b = np.array([1, 1, 1])                # (3,) → (1, 3) → (2, 3)
print(a + b)
# 成功广播,结果为:
# [[2 3 4]
#  [5 6 7]]

不满足广播条件的例子:

a = np.array([1, 2, 3, 4])     # (4,)
b = np.array([[1,2,3],[2,3,4]]) # (2,3)
# a + b → 报错!无法广播

广播机制


八、损失函数:衡量模型表现的标尺

损失函数(Loss Function)是衡量模型预测值与真实值之间差异的函数。模型的目标就是最小化损失函数的值

损失函数的核心作用


1. 分类任务:交叉熵损失

多分类任务(CrossEntropyLoss)

PyTorch 中使用 nn.CrossEntropyLoss(),它内部自动包含 Softmax + 负对数似然

import torch
import torch.nn as nn
# 预测值(logits)
y_pred = torch.tensor([[0.1, 0.1, 0.3, 1.4, 0.05, 0.05],
[0.02, 0.08, 0.2, 0.2, 0.05, 2.45]])
# 真实标签(无需 one-hot 编码)
y_true = torch.tensor([3, 5])
criterion = nn.CrossEntropyLoss()
loss = criterion(y_pred, y_true)
print("loss-->", loss)

重要提示CrossEntropyLoss 接收的是 logits(未归一化的分数),不是概率!

二分类任务(BCELoss)

使用 Sigmoid + 二分类交叉熵。

y_true = torch.tensor([0, 1, 0], dtype=torch.float32)
y_pred = torch.tensor([0.6901, 0.5459, 0.2469])  # Sigmoid 输出
loss = nn.BCELoss()
my_loss = loss(y_pred, y_true)
print('loss:', my_loss)

2. 回归任务:误差度量

MAE(L1 Loss)

平均绝对误差,对异常值不敏感。

y_true = torch.tensor([1.0, 2.0, 3.0])
y_pred = torch.tensor([2.0, 2.5, 5.0])
loss = nn.L1Loss()
my_loss = loss(y_pred, y_true)
print('MAE loss:', my_loss)

MAE

MSE(L2 Loss)

均方误差,对离群点敏感。

loss = nn.MSELoss()
my_loss = loss(y_pred, y_true)
print('MSE loss:', my_loss)

MSE

Smooth L1 Loss

结合 MAE 和 MSE 的优点,在误差小时像 MSE,大时像 MAE。

loss = nn.SmoothL1Loss()
my_loss = loss(y_pred, y_true)
print('Smooth L1 loss:', my_loss)

Smooth L1


九、反向传播与梯度下降

1. 前向传播 vs 反向传播

一次完整的训练迭代 = 前向传播 + 损失计算 + 反向传播

2. 梯度下降原理

梯度是函数增长最快的方向,负梯度方向就是下降最快的方向。

更新公式:
w_t+1=w_t−η⋅∇_wLw\_{t+1} = w\_t - \eta \cdot \nabla\_w L w_t+1=w_tη∇_wL
其中 η\etaη 是学习率。
梯度下降

批量大小(Batch Size)的影响
类型Batch Size特点
BGD(批量梯度下降)整个数据集稳定但慢
SGD(随机梯度下降)1快但震荡
Mini-batch GD小批量(如 32, 64, 256)最常用,平衡速度与稳定性

十、优化算法进阶

1. Momentum(动量法)

使用指数加权平均累积历史梯度,加速收敛,减少震荡。

optimizer = torch.optim.SGD([w], lr=0.01, momentum=0.9)

Momentum

2. Adam(自适应矩估计)

结合 Momentum 和 RMSProp,自适应学习率,NLP 和大模型中最常用

optimizer = torch.optim.Adam([w], lr=0.01)

3. 学习率衰减策略

训练后期减小学习率,防止震荡。
学习率

  • StepLR:每隔固定步数衰减
  • MultiStepLR:在指定 epoch 衰减
  • ExponentialLR:指数衰减
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.5)

总结

本文系统介绍了神经网络的核心概念:

  • 前向传播:数据从输入到输出的流动过程
  • 激活函数:引入非线性,提升表达能力(ReLU 为王)
  • 参数初始化:决定训练成败的关键(优先选用 Kaiming/Xavier)
  • 损失函数:分类用交叉熵,回归用 Smooth L1
  • 优化算法:SGD + Momentum 或 Adam
  • 学习率调度:防止后期震荡

参考资料

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

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

相关文章

专业做旗袍花的网站是什么网站能用的免费proxy网页

如果你在运行Minecraft时出现内存错误等问题,你可能需要给Minecraft分配更多内存来解决运行故障。如果你玩的是新版本的Minecraft,那么你可以从启动器里直接分配内存(RAM)。如果你使用的是旧版本,那么你需要创建一些文件来改变Minecraft内存使…

做网站可以找设计公司吗商城站人工售票时间表

WordPress博客网站搬家和换域名方法方案一 开设个人博客的朋友使用WordPress不在少数,那么也难免不了更换空间和域名的情况,由于笔者亲历了一次更换空间和域名的情况,将博客从AAA.com 更改为 BBB.com,所以本文就分享一下更换域名…

网站建设小程序开发报价雅诗兰黛网络营销策划书

[vue] 怎么缓存当前打开的路由组件,缓存后想更新当前组件怎么办呢? 可以在路由meta中加入参数, 对打开的路由进行keep-alive的判断, 通过钩子active等个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很…

开源 C# 飞快开发(十六)数据库--sqlserver增删改查

开源 C# 飞快开发(十六)数据库--sqlserver增删改查pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

英语语法填空

test2错题 A Tenyson suggested that we can buy the lady a flower. Tenyson suggested that we should buy the lady a flower.当suggest表示“建议”时,其后的宾语从句使用“should+动词原形”的虚拟语气结构,其中…

深入解析:基于Java的springboot/SSM+vue.js+uniapp小程序的农产品溯源系统附带文章源码部署视频讲解等

深入解析:基于Java的springboot/SSM+vue.js+uniapp小程序的农产品溯源系统附带文章源码部署视频讲解等2025-10-04 12:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: norm…

手机网站设计宽度网站群系统建设标准

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.上一次我们已经使用SpringBoot实现了一个简单的HelloWord程序,辣么接下来我们简单的使用一下他的yml格式的配置文件。 2.在…

wordpress国外主题网站模板在什么网站做兼职

异步复制 MySQL 默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果 crash 掉了,此时主节点上已经提交的事务可能并没有传…

个人网站怎么进后台网站制作经典案例

在快节奏的现代生活中,科技的不断进步使得各类移动设备如手机、平板和笔记本电脑成为人们生活中不可或缺的部分。为了应对这些设备不断增长的能源需求,充电宝市场的崛起迅猛并呈现出持续增长的态势。 在选购移动电源时,如何识别性能出众、质量…

有没有装修做团购的网站代刷网站开发

第一步:项目打包前更改项目config配置 打开项目的 config>index.js文件修改build对象的assetsPublicPath: 属性值为 ./ 如下 第二步:对vue-cli项目进行打包 在运行窗口输入cmd后打开命令窗口,在项目文件下输入npm run build命令 如下&…

php网站开发简历当今做网站的语言有哪些

1.print()函数输出 在python中,使用print()函数可以将结果输出到标准控制台上。 print()函数的基本语法:print(输出内容);例如 a 100b 5 print(9)print(a)print(a*b)print("hello") 使用print函数,不但可以将输出内容到…

从涌现到戏台:AI元人文构想的演进历程

从涌现到戏台:AI元人文构想的演进历程 第一章:起点——在未知中探索"涌现"的可能性 在人工智能快速发展的时代,主流方向聚焦于扩大数据规模、增加模型参数、提升控制精度。与此同时,一个独立的研究路径逐…

详细介绍:FileProvider 配置必须针对 Android 7.0+(API 24+)做兼容

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

题解:P14124 [SCCPC 2021] Nihongo wa Muzukashii Desu

P14124 题解 题目传送门 题意简化 给你 \(n\) 个字符串,根据字符串的后缀按要求更改字符串。 题目分析 一般的转换规则可以分为 5 种,如下表。后缀类型 更改后chimasu tterimasu ^mimasu ndebimasu ^nimasu ^kimasu …

网站上传在空间哪里女孩子奖励自己的资料

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、Static成员 1、概念 2、特性 二、友元 1、友元函数 2、友元类 一、Static成员 1、概念 声…

怎么查看网站是用什么编程语言开发的gta5买房网站建设中

央视网(www.cctv.com)视频下载往往是花屏的,如何处理呢? 如果您是IT技术开发者,那么您可以通过下面步骤自己实现。 用chrome浏览器,F2打开开发者工具,找到当前页面的network 然后找一个接口:https://vdn.a…

上位机知识篇---服务器脚本一直运行方法 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

个人网站域名取名chenqinghua wordpress

题目描述: 小红拿到了一个数组,初始数组为空,她希望你实现以下两种操作: 1. 输入x,y,将x插入在元素y的右边。保证此时数组中没有元素等于x,且数组中存在一个y。特殊的,如果将x插入在数组的最左边&#xff0…

python+vue在线视频课程学习系统设计(源码+文档+调试+基础修改+答疑) - 详解

python+vue在线视频课程学习系统设计(源码+文档+调试+基础修改+答疑) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fa…