从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
引言
在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际问题的开发者。
第一部分:全连接层——神经网络的基础单元
1.1 什么是全连接层?
全连接层(Fully Connected Layer,简称FC层)是神经网络中最基本的组件之一。它的核心任务是将输入特征映射到输出空间,并在这个过程中学习特征之间的复杂关系。
公式定义:
全连接层的数学表达式如下:
y = f ( W x + b ) y = f(Wx + b) y=f(Wx+b)
(x):输入向量,表示当前层的输入特征。
(W):权重矩阵,表示每个输入特征对输出特征的影响权重。
(b):偏置向量,为网络提供更大的表达能力。
(f):激活函数,为模型引入非线性。
全连接层的核心是通过权重矩阵和偏置向量的线性变换学习输入和输出之间的映射关系。最终,通过激活函数完成非线性变换,使得网络能够处理复杂的任务。
1.2 为什么需要全连接层?
全连接层的主要作用是:
特征融合:将不同的特征组合起来,捕捉全局信息。
非线性表达:通过激活函数,使网络能够学习复杂的非线性映射关系。
分类和回归任务:在任务的最后几层,全连接层常用于将特征映射为目标类别或回归值。
在图像分类任务中,全连接层负责将卷积层提取的特征映射到最终的分类结果。例如:
输入:卷积层输出的特征(如512维向量)。
输出:分类结果(如10类)。
1.3 全连接层的实现与代码示例
以下是一个简单的全连接网络,用于对MNIST手写数字进行分类:
import torch
import torch.nn as nn
定义全连接神经网络
class FullyConnectedNet(nn.Module):def __init__(self):super(FullyConnectedNet, self).__init__()self.fc1 = nn.Linear(28 * 28, 128) # 输入层到隐藏层self.fc2 = nn.Linear(128, 64) # 隐藏层到另一个隐藏层self.fc3 = nn.Linear(64, 10) # 隐藏层到输出层
def forward(self, x):x = x.view(x.size(0), -1) # 将二维输入展平x = torch.relu(self.fc1(x)) # 激活函数ReLUx = torch.relu(self.fc2(x))x = self.fc3(x) # 输出分类return x
测试网络
model = FullyConnectedNet()
sample_input = torch.randn(1, 28, 28) # 模拟一个MNIST样本
output = model(sample_input)
print(output)
代码解读:
nn.Linear 创建全连接层,定义输入和输出的维度。
torch.relu 使用 ReLU 激活函数引入非线性。
x.view 展平输入张量,为全连接层提供一维向量形式的数据。
1.4 全连接层的局限性
尽管全连接层功能强大,但也有一定局限性:
参数量大:全连接层需要存储和计算大量的权重和偏置,容易导致过拟合。
空间感缺失:无法有效利用输入数据的空间信息(如图像的像素结构),这也是卷积层的用武之地。
计算复杂度高:大规模网络可能导致训练和推理的计算开销过大。
第二部分:损失函数——模型的学习目标
2.1 什么是损失函数?
损失函数是衡量模型预测值与真实值之间差距的数学函数。深度学习的目标是通过优化算法(如梯度下降),不断调整模型参数,以最小化损失函数的值。
损失函数的两种主要类型:
回归问题:预测连续值,常用的损失函数包括均方误差(MSE)和平均绝对误差(MAE)。
分类问题:预测离散值,常用的损失函数是交叉熵损失。
2.2 常见损失函数
- 均方误差(MSE)
M S E = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 MSE = \frac{1}{n} \sum_{i=1}^n (\hat{y}_i - y_i)^2 MSE=n1i=1∑n(y^i−yi)2
适用于回归问题,计算预测值与真实值的平方差。
- 交叉熵损失(Cross Entropy Loss)
用于分类问题,衡量预测分布与真实分布之间的差异:
L = − ∑ i = 1 n y i log ( y ^ i ) L = -\sum_{i=1}^n y_i \log(\hat{y}_i) L=−i=1∑nyilog(y^i)
- 二元交叉熵损失(Binary Cross Entropy)
适用于二分类问题,公式为:
B C E = − 1 n ∑ i = 1 n [ y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) ] BCE = -\frac{1}{n} \sum_{i=1}^n \left[y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)\right] BCE=−n1i=1∑n[yilog(y^i)+(1−yi)log(1−y^i)]
2.3 损失函数的代码实现
以下代码展示了如何使用 PyTorch 计算交叉熵损失:
import torch
import torch.nn as nn
模拟模型输出和真实标签
output = torch.tensor([[0.1, 0.8, 0.1], [0.7, 0.2, 0.1]]) # 模型预测
target = torch.tensor([1, 0]) # 真实标签
定义交叉熵损失
criterion = nn.CrossEntropyLoss()
loss = criterion(output, target)
print(f"Loss: {loss.item()}")
说明:
模型的输出是未经过 softmax 的原始分数(logits),nn.CrossEntropyLoss 会自动应用 softmax。
2.4 如何选择合适的损失函数?
回归问题:MSE 是默认选择,但 MAE 在对异常值敏感的场景中表现更好。
分类问题:交叉熵是首选,尤其是多分类任务。
概率分布建模:使用 Kullback-Leibler 散度(KL 散度)来衡量分布之间的差异。
第三部分:梯度下降——优化的利器
3.1 梯度下降的原理
梯度下降是一种迭代优化算法,通过最小化损失函数来寻找最优参数。它的核心思想是:沿着损失函数的负梯度方向调整参数,直到损失值最小。
参数更新公式:
θ = θ − α ∇ θ J ( θ ) \theta = \theta - \alpha \nabla_\theta J(\theta) θ=θ−α∇θJ(θ)
(\theta):模型参数。
(\alpha):学习率,控制步长大小。
(\nabla_\theta J(\theta)):损失函数对参数的梯度。
3.2 梯度下降的三种变体
批量梯度下降(Batch Gradient Descent):
对整个数据集计算梯度。
优点:稳定。
缺点:计算开销大,尤其在大数据集上。
随机梯度下降(SGD, Stochastic Gradient Descent):
每次使用一个样本计算梯度。
优点:更新速度快。
缺点:收敛不稳定。
小批量梯度下降(Mini-batch Gradient Descent):
每次使用一小部分样本计算梯度。
优点:折中方案,常用于实际深度学习任务。
3.3 梯度下降的代码实现
以下是一个结合 PyTorch 优化器的完整训练过程:
import torch.optim as optim
定义模型、损失函数和优化器
model = FullyConnectedNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
模拟训练过程
for epoch in range(5):optimizer.zero_grad() # 清除上一轮的梯度output = model(sample_input) # 前向传播target = torch.tensor([3]) # 假设真实标签loss = criterion(output, target) # 计算损失loss.backward() # 反向传播optimizer.step() # 更新参数print(f"Epoch {epoch+1}, Loss: {loss.item()}")
优化策略与进阶技巧
动态学习率
在训练过程中,动态调整学习率有助于模型更快地收敛。例如:
from torch.optim.lr_scheduler import StepLR
scheduler = StepLR(optimizer, step_size=2, gamma=0.1)
for epoch in range(5):train() # 假设有训练逻辑scheduler.step()
动量优化
动量方法通过加速梯度下降并减少波动,提高收敛速度:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
Adam优化器
Adam 是一种自适应学习率的优化算法,结合了动量和 RMSProp 的优点,适合大多数任务:
optimizer = optim.Adam(model.parameters(), lr=0.001)
总结
全连接层、损失函数与梯度下降是深度学习的基石。通过本文的详细解析,你不仅理解了它们的理论,还掌握了代码实现和优化技巧。在深度学习的道路上,这三块知识将帮助你构建强大的模型,解决实际问题。
相关文章:

从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
引言 在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际…...

Liebherr利勃海尔 EDI 需求分析
Liebherr 使用 EDI 技术来提高业务流程的效率、降低错误率、加快数据交换速度,并优化与供应商、客户和其他合作伙伴之间的业务沟通。通过 EDI,Liebherr 实现了与全球交易伙伴的自动化数据交换,提升了供应链管理和订单处理的透明度。 Liebher…...

java小练习
小练1.用while语句计算11/2!1/3!1/4!...1/20!的和 public class test_11_17_2 {public static void main(String[] args) {double sum 0;double item 1;int n 20;int i 1;while(i<n){sum item;i i1;item item*(1.0/i);}System.out.println(sum);} } 小练2.计算88888…...

go语言中的占位符有哪些
在Go语言中,占位符主要用于格式化字符串输出,特别是在使用fmt包中的Printf系列函数时。以下是Go语言中常用的占位符: %v:代表值的默认格式,对于字符串是直接输出,对于整型是十进制形式。%v:扩展…...

基于Windows安装opus python库
项目中需要用到一些opus格式的编解码功能,找到网上有opus的开源库。网址:Opus Codec 想着人生苦短,没想到遇上了错误!在这里记录一下过程 过程 安装python库 pip3 install opuslib验证 >>> import opuslib Tracebac…...

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入
《设计模式之行为型模式》系列,共包含以下文章: 行为型模式(一):模板方法模式、观察者模式行为型模式(二):策略模式、命令模式行为型模式(三):责…...

使用nossl模式连接MySQL数据库详解
使用nossl模式连接MySQL数据库详解 摘要一、引言二、nossl模式概述2.1 SSL与nossl模式的区别2.2 选择nossl模式的场景三、在nossl模式下连接MySQL数据库3.1 准备工作3.2 C++代码示例3.3 代码详解3.3.1 初始化MySQL连接对象3.3.2 连接到MySQL数据库3.3.3 执行查询操作3.3.4 处理…...

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置
🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶探索:构建数据库基础 欢迎大家点赞收藏评论😊 目录 📚mysql的安装📕MySQL的登录🌏MySQL配置免密码登录 📚mysql的…...

高级 SQL 技巧讲解
大家好,我是程序员小羊! 前言: SQL(结构化查询语言)是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理,掌握高级 SQL 技巧不仅能显著提高数据分析的效率,还能解决业务中的复…...

浅论AI大模型在电商行业的发展未来
随着人工智能(AI)技术的快速发展,AI大模型在电商行业中扮演着越来越重要的角色。本文旨在探讨AI大模型如何赋能电商行业,包括提升销售效率、优化用户体验、增强供应链管理等方面。通过分析AI大模型在电商领域的应用案例和技术进展…...

【python笔记03】《类》
文章目录 面向对象基本概念对象的概念类的概念 类的定义类的创建(实例的模板)类的实例化--获取对象对象方法中的self关键字面试题请描述什么是对象,什么是类。请观阅读如下代码,判断是否能正常运行,如果不能正常运行&a…...

Flutter 应用在真机上调试的流程
在真机上调试 Flutter 应用的方法有很多,可以使用 USB 数据线连接设备到电脑进行调试,也可以通过无线方式进行 Flutter 真机调试。 1. 有线调试 设备准备 启用开发者模式: Android:进入 设置 > 关于手机,连续点击…...

以太坊基础知识结构详解
以太坊的历史和发展 初创阶段 2013年:Vitalik Buterin 发表了以太坊白皮书,提出了一个通用的区块链平台,不仅支持比特币的货币功能,还能支持更复杂的智能合约。2014年:以太坊项目启动,进行了首次ICO&…...

安全见闻(完整版)
目录 安全见闻1 编程语言和程序 编程语言 函数式编程语言: 数据科学和机器学习领域: Web 全栈开发: 移动开发: 嵌入式系统开发: 其他: 编程语言的方向: 软件程序 操作系统 硬件设备…...

LeetCode100之反转链表(206)--Java
1.问题描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 示例1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2 输入:head [1,2] 输出:[2,1] 示例3 输入:head [] 输…...

牛客周赛第一题2024/11/17日
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C/Rust/Pascal 1秒,其他语言2秒 空间限制:C/C/Rust/Pascal 256 M,其他语言512 M 64bit IO Format: %lld 题目描述 小红这天来到了三…...

麒麟Server下安装东方通TongLINK/Q
环境 系统:麒麟Server SP3 2403 应用:TLQ8.1(Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.17.0.tar.gz) 安装Server 将文件解压到/usr/local/tlq。 cd /opt/tlq/ mkdir /usr/local/tlq/ tar -zxvf Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.1…...

BERT的中文问答系统33
我们在现有的代码基础上增加网络搜索的功能。我们使用 requests 和 BeautifulSoup 来从百度搜索结果中提取信息。以下是完整的代码,包括项目结构、README.md 文件以及所有必要的代码。 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── lo…...

Ubuntu下的Eigen库的安装及基本使用教程
一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4,除了C标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。 基本功能 Eigen适用范…...

【spring 】Spring Cloud Gateway 的Filter学习
介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关,它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中,Filter 扮演着非常重要的角色&#…...

每秒交易数(Transactions Per Second:TPS)详细拆解
每秒交易数(TPS)是指计算机网络每秒可以处理的交易数量。TPS是衡量不同区块链和其他计算机系统速度的关键指标。然而,TPS并不是用来衡量区块链速度的唯一指标。许多人认为,虽然TPS很重要,但最终性实际上是一个更重要的…...

【初阶数据结构与算法】链表刷题之链表分割、相交链表、环形链表1、环形链表I、环形链表II
文章目录 一、链表分割二、相交链表三、环形链表I四、环形链表|| 一、链表分割 题目链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70 我们来看看链表分割的题目描述和它给出的函数: 这个题虽然是以C形式来做࿰…...

【STL】set,multiset,map,multimap的介绍以及使用
关联式容器 在C的STL中包含序列式容器和关联式容器 1.关联式容器:它里面存储的是元素本身,其底层是线性序列的数据结构,比如:vector,list,deque,forward_list(C11)等 2.关联式容器里面储存的…...

新能源二手车交易量有望破百万,二手车市场回暖了吗?
这些年,伴随着新能源汽车市场的高速发展,各种新能源车的二手车也在逐渐增加,不过之前的二手车市场相对比较冷清,就在最近一则新闻传出新能源二手车交易量有望破百万,二手车市场这是回暖了吗? 一、新能源二手…...

哈佛商业评论 | 项目经济的到来:组织变革与管理革新的关键
在21世纪,项目经济(Project Economy)逐步取代传统运营,成为全球经济增长的核心动力。项目已不再是辅助工具,而是推动创新和变革的重要载体。然而,只有35%的项目能够成功,显示出项目管理领域存在巨大的改进空间。本文将详细探讨项目经济的背景、项目管理的挑战,以及适应…...

web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
如果你使用 window.open() 方法打开 PDF 文件,但浏览器不是预览而是下载文件,这可能是由于以下几个原因: 服务器配置:服务器可能将 PDF 文件配置为下载而不是预览。例如,服务器可能设置了 Content-Disposition 响应头…...

【GeekBand】C++设计模式笔记12_Singleton_单件模式
1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题, 但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…...

Pyhon基础数据结构(列表)【蓝桥杯】
a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表(list)有由一系列按照特定顺序排序的元素组成 列表是有顺序的,访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…...

Linux篇(权限管理命令)
目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户(超级管理员) 二、普通权限管理 1. ls查看文件权限 2. 文件…...

深入理解 Spark 中的 Shuffle
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...