☰
深度学习基础与数学原理:从线性分类器到卷积神经网络
2026/10/23 3:21:40 网站建设 项目流程

简介:这份PDF系统梳理了深度学习入门所需的核心概念与数学原理,聚焦线性分类器、前馈神经网络与卷积神经网络三大主线,从图像识别挑战与数据驱动过程讲起,适合AI初学者、算法工程师或准备系统补强深度学习基础的读者。资源为单个PDF文档,压缩包约7.83MB,内容采用从数据准备、假设函数、损失函数到优化与评估的完整框架展开,并配有数学推导与实现细节。全书按图像分类、线性分类器、前馈网络、卷积网络、实现细节逐步递进,数学推导完整。目前已有579人学习浏览。通过阅读可掌握Softmax分类器、交叉熵损失、梯度下降与误差反向传播、CNN中卷积层、池化层、全连接层的原理与作用,并能理解傅里叶变换、im2col等实现技巧,为后续应用与实战打下扎实基础。

1. 说到深度学习就头大?先搞懂它是谁、能干什么

很多人都被“深度学习”四个字吓住,觉得那得先把高等数学、线性代数、概率论啃完才有资格碰。我当年也是这么想的,结果发现完全不是这么回事。深度学习说白了,就是让计算机从大量例子里自己总结规律——就像小朋友认识“猫”,不是靠背定义,而是看了几十张猫的照片之后自然就会认了。这份《深度学习基础及数学原理》正是沿着这条直觉主线,把图像分类、线性分类器、前馈神经网络、卷积神经网络一层层拆开讲清楚。它适合所有刚接触深度学习、想先搞懂“核心概念到底是什么、先学什么”的零基础新手。读完你会明白:原来深度学习不是玄学,而是一条有清晰步骤的流程。

2. 数据驱动与线性分类器:机器是怎么从例子里学会分类的

2.1 语义鸿沟:为什么机器看图和你看图不一样

人类识别图像里的物体非常容易,几毫秒就能说出“这是一只猫”。但计算机拿到一张图像时,看到的不是一个完整画面,而是一堆数字。比如一张 1024×768 的彩色图片,有红、绿、蓝三个通道,实际存下来是 1024×768×3=2359296 个整数,每个数都在 0 到 255 之间。把这两百多万个数字映射成一个“猫”的标签,这个从数字到语义的跨越,就叫语义鸿沟。

为什么这个问题难到写不出规则?因为同一个物体在不同照片里,像素值可能天差地别:换个角度、离远一点近一点、有遮挡、光照变了、目标和大背景融为一体、同一类目标长得完全不一样……文档里把这些挑战总结为视角变化、尺度变化、形变、遮挡、光照改变、背景融合、类内变化七大类。任何一个都足以让“按像素规则判断”的算法崩溃。所以图像分类从计算机视觉诞生起,就是一块公认的硬骨头。

2.2 数据驱动:不写规则,让模型从例子中自己学

写一个排序算法很容易:给一堆数字,比大小、交换位置,规则是明确的。但图像识别不一样,你没办法用手把两百万个像素的规则一条条写出来。那怎么办?回头想想人是怎么认出猫的——靠经验。机器里的经验就是数据。

我们把每个类别的许多张图收集在一起,每张图都配好一个标签,组成训练集;用一个学习算法去读这个训练集,产出一个分类器(也叫模型);下次来一张新图,模型给出自己的判断。这个流程,就是数据驱动过程。它涉及的四个零件值得先记在心里:训练数据、假设函数、损失函数、优化算法。后面所有模型,包括神经网络和卷积神经网络,都是在这四个零件的基础上换不同的“假设函数”而已。

2.3 假设函数与损失函数:打分和纠错

先看假设函数。假设函数就是模型用来给输入打分的那个数学式子。线性分类器用的是最简单的一种:h(x)=Wx+b。x 是输入的图像向量,W 叫权值,b 叫偏置。如果有 K 个类别,输出就是 K 个分数,哪个类分数高,模型就倾向把图像判给哪个类。把 W 的每一行理解成“某个类的原型模板”,打分的过程就是比一比输入像不像这个模板,这个角度对新手非常友好。

光有打分还不够,模型怎么知道自己打错了?损失函数就是干这个的:把模型给出的分数和真实标签做比较,错得越离谱损失越大。文档里用的是交叉熵损失,配合 Softmax 把分数变成概率后取负对数。还有一个容易被忽略的细节是正则化:它会在损失函数里加一项对参数大小的惩罚,让参数别太大、别太集中。这样模型就不会只盯着输入的某几个维度,而是更均衡地考虑全部信息,在新数据上的表现往往更稳。这就是泛化能力的来源。

2.4 梯度下降与 Softmax:第一个完整训练流程

模型知道了自己错在哪,剩下的事就是调整参数让错误变小。梯度下降的做法很朴素:先随机给一组参数,算出损失,然后沿着损失下降最快的方向迈一小步,重复很多次。这个“下降最快的方向”由梯度决定,步子大小由学习率 α 控制。如果每次只用一个样本更新,叫随机梯度下降 SGD;如果用一小批样本更新,叫小批量梯度下降,它在实际中最常用,既快又稳。

# softmax 线性分类器最小训练流程(Python 风格伪代码) import numpy as np # 超参数:学习率、正则强度、迭代轮数、批量大小 alpha = 0.1 # 学习率,决定每次更新迈多大步子 lmbda = 0.01 # 正则强度,惩罚过大的权重 T = 1000 # 总共更新参数的轮数 batch_size = 128 # 每轮抽多少个样本 # 1. 参数初始化:W 用很小的随机值,b 全设为 0 W = np.random.normal(0, 0.01, (K, n)) b = np.zeros(K) for t in range(T): # 2. 随机抽一小批训练样本 batch_x, batch_y = sample_batch(data, batch_size) # 3. 前向:线性打分 + softmax 转成概率 scores = batch_x.dot(W.T) + b # 每个样本得到 K 个分数 probs = softmax(scores) # 分数转成概率,和为 1 # 4. 计算损失:平均交叉熵 + 权重平方惩罚 loss = cross_entropy(probs, batch_y) loss += 0.5 * lmbda * np.sum(W * W) # 5. 反向:算出每个参数的梯度 dscores = probs - one_hot(batch_y, K) # 概率减去真实标签位置 dW = dscores.T.dot(batch_x) / batch_size + lmbda * W db = np.sum(dscores, axis=0) / batch_size # 6. 更新参数:朝梯度的反方向迈一小步 W -= alpha * dW b -= alpha * db

这段代码就是文档算法 1 的骨架。K 是类别数,n 是图像像素维数,比如输入 32×32×3 的图像,n 就是 3072。sample_batch 负责抽一个小批量,one_hot 把标签变成只在正确类别位置为 1、其余为 0 的向量。第五步里 probs 减去 one_hot,是 Softmax 分类器非常漂亮的推导结果:预测概率与真实标签的差。dW 里的 lmbda*W 是正则项在梯度里的体现,除以 batch_size 是为了让不同批量大小下更新的步长保持一致。

提示:第一次写这个流程,最容易出错的是更新参数前忘了除以 batch_size。损失能算出来,但步长会随批量大小变动,小批量时模型容易崩。学习率从 0.1 或 0.01 起步试,正则系数一般取 0.01、0.001 量级。

3. 从线性到非线性:前馈神经网络在加什么料

3.1 线性分类器的天花板

Softmax 线性分类器只能学出一条直线(高维情况下是超平面)来切分类别。很多问题没法这样切:比如数据是环形的,一类在圈里,一类在圈外,一条直线永远分不开。这不是模型没调好,是模型能力到顶了。判断一个分类器是不是线性,就看它画出的决策边界是不是直线或平面,是的话,它对非线性数据的分类能力天然有限。

早期研究者怎么破局?两条路:特征工程和核方法。特征工程是手动设计能帮分类器分开数据的特征,代价是非常依赖人的经验,换个任务就要重新设计,比如这个任务用颜色直方图好用,换个任务就得想新的。核方法换了一种方式,把数据映射到高维空间再切,但它不会告诉你应该用什么特征,对新手来说像个黑匣子。于是有了第三条路:表示学习,让模型自己决定用什么特征。这就是神经网络登场的原因。

3.2 人工神经元与多层架构

前馈神经网络做的事,简单说就是把多个“线性打分”叠起来,中间再插一些非线性函数。一个神经元就是一次加权求和加一次激活:先对输入乘权重求和,再过一个激活函数,比如 ReLU(max(0, x))。这个过程和线性分类器长得一模一样,区别只在多了一个“激活”步骤。

两层网络可以写成 h = W2 * max(0, W1x + b1) + b2。外面的 W2、b2 和 Softmax 线性分类器长得很像,内层的 max(0, W1x + b1) 负责把原始像素变成更高级的中间特征。有了这一层非线性变换,模型就不再是直线了,可以拟合弯曲的决策边界。下面是一个前向传播示例:

# 两层前馈神经网络的前向传播示意 h1 = np.maximum(0, x.dot(W1) + b1) # 第一层:线性变换 + ReLU 激活 scores = h1.dot(W2) + b2 # 第二层:在特征上再做线性打分

x 是输入图像向量,W1 是第一层权重,h1 是隐藏层输出,也就是模型自己学出来的特征。np.maximum(0, ...) 就是 ReLU,把所有负数归零,给模型带进非线性。scores 拿到 K 个类别的分数,后面接 Softmax 和交叉熵损失,和上一章的流程完全一样。

3.3 表示学习:为什么网络能自动找特征

神经网络最妙的地方在于,你不用告诉它“先用边缘特征,再用部件特征”。它自己会在训练中学会分层组织:靠前的层学到边缘、角点这些基础模式,靠后的层把它们组合成眼睛、轮子这些部件,最后一层再组合成对分类有用的整体判断。这个逐层抽象的过程就是表示学习,也是“深度学习”中“深”的含义。

我第一次学到这里时最大的震撼是:没人给网络设计过特征,它只是被数据推着走,就自发形成了从简单到复杂的特征层级。这也是深度学习和传统方法最本质的分水岭——模型自己决定学什么特征,人只负责给数据和定目标。

3.4 反向传播:让误差从输出端传回每一层

多层网络参数比线性分类器多得多,梯度怎么算?答案是链式法则。从最后的损失开始,先算出输出层的梯度,再一层一层往前传,每一层用上一层传过来的梯度乘上本层对输入的导数,最后得到每个 W、b 的更新量。这个算法叫误差反向传播,理解它只需要一句话:每一层的梯度都来自下一层传来的梯度乘以本层的局部导数。

工程实现上,反向传播要利用前向传播过程中缓存下来的中间结果,不然每一层都得把原始输入重新算一遍,浪费巨大。还有一个小细节值得新手注意:ReLU 在反向传播时,正数部分的导数是 1,负数部分是 0,所以它除了制造非线性,还天然起到了“一部分神经元不参与本周更新”的作用。等前向和反向都跑顺了,前馈神经网络对你来说就再也不是黑匣子了。

4. 卷积神经网络:图像识别王牌怎么一步步搭起来

4.1 卷积层:在局部窗口里找模式

如果用全连接网络直接处理图像,一张 32×32×3 的图像就有 3072 个输入,第一层再配上几百个神经元,参数量就上百万,而且图像的空间结构全被抹平。卷积神经网络换了个思路:图像的局部特征,比如边缘、纹理,在哪个位置都可能出现,不如用一个小的窗口在所有位置上扫一遍,同样的模式在哪里都认得出。

这个“小窗口”就是卷积核。比如一个 3×3 的卷积核在图片上从左到右、从上到下扫过去,每滑到一个位置就和对应的像素做加权求和,把结果写进输出特征图。一个卷积核学一种模式,一张图同时跑几十个卷积核,就能提取几十种特征。参数是共享的:同一个核扫全图,所以参数量大大小于全连接网络。这也是卷积神经网络能在图像任务上站稳脚跟的两个核心原因:局部连接加参数共享。

输出特征图的尺寸有个简单算法:输出长度 =(输入长度 - 卷积核边长 + 两倍填充)/ 步长 + 1。填充 pad 是为了不让边缘信息被扫丢,步长 stride 控制窗口滑动的间隔。新手先不必纠结这两个超参数的精确取值,理解成“维持尺寸不掉、控制特征图大小”的工具就够了。

4.2 汇合层与 ReLU:压缩、去冗余、加非线性

卷积层提取完特征后,特征图往往太大、太细碎。汇合层 pool 的作用就是做压缩:常见的是取一个 2×2 窗口里的最大值(最大池化)或平均值(平均池化),一次就把特征图的长宽各缩一半。好处是计算量下降,而且模型对目标轻微移位没那么敏感——猫往左挪了几个像素,最大池化的输出几乎不变。

ReLU 层则是把特征图里的负数全部归零。它代码虽然简单,但至关重要:如果没有 ReLU 这类非线性激活函数,再怎么堆卷积层,整体还是一个线性变换,学不出弯曲的决策边界。卷积、ReLU、池化常常打包成一组来用:先卷积提取特征,再用 ReLU 激活,最后池化压缩。

4.3 全连接层与完整 CNN:从特征到分类

一套完整的 CNN 可以分成两段:前面是卷积 + ReLU + 池化组成的特征提取器,把原始图像变成一组紧凑的高级特征;后面接一个全连接层,把这组特征映射成 K 个类别的分数,再配 Softmax 和交叉熵损失。分类那段其实就是第 2 章学过的线性分类器,所以前面学的东西一点都没浪费。

一个典型的小 CNN 结构可以这样描述:

# 一个最小 CNN 的层结构描述(模块示意) conv3x3-16 -> relu -> pool2x2 # 第 1 组:16 个卷积核,池化压缩 conv3x3-32 -> relu -> pool2x2 # 第 2 组:32 个卷积核,池化再压缩 fc-128 -> relu # 全连接:把高级特征组合起来 fc-K # 输出 K 个类别的分数

每一组卷积层都在做同一件事:原图变成特征图,特征图再变成更大的特征图。越往后特征图越小、通道越多,含义也从“边缘”升级成“部件”。训练它用的还是第 2 章那套东西:交叉熵损失、梯度下降、反向传播,没有额外魔法。

4.4 预测和评估:怎么判断模型好不好

模型训练完,要在一批训练时没见过的图像上做预测,和真实标签一比,算准确率,这个过程叫评估。训练损失低只代表老题做得好,测试集准确率高才说明模型真的学会了新题怎么做。这也是整份文档反复强调的:数据驱动流程四个零件都到位后,最后一步永远是用测试集检验,而不是在训练集上自我感动。

5. 新手避坑指南:先绕过这四个最常见的坑

5.1 损失不降反升

现象:训练了好几轮,损失值不仅没降,反而比初始值还高,曲线一路往上走。

原因:最常见是学习率 α 设太大。参数每次迈的步子太大,越过谷底后在两边来回震荡,甚至发散。另一个容易被忽略的原因是输入数据没做标准化,不同维度数值范围差太多,梯度方向被带偏。

解决:先把学习率调小一个数量级试试,比如从 0.1 改成 0.01;同时对输入做标准化,把每个像素减均值除以标准差,让数据分布居中且尺度统一。改了这两个之后,损失曲线一般都会回到下降轨道。

5.2 训练集挺好,测试集翻车

现象:训练集上准确率 95%,一到测试集只有 60%,模型把题背下来了,新题不会做。

原因:过拟合。模型的参数太多,或者训练数据太少、太单一,模型把训练样本的细节和噪声都记住了,没有学到普适规律。

解决:加 L2 正则化,让权重不要太大、太集中;做数据增强,比如对训练图像做随机裁剪,相当于免费增加训练样本多样性;如果是神经网络,还可以用文档里提到的“退出”(dropout),训练时随机让一部分神经元失活,逼模型学得更稳健,别过度依赖某几个神经元。

5.3 损失变成 NAN 或 inf

现象:训练到一半,损失输出变成 nan 或者 inf,之后再也救不回来。

原因:Softmax 里要对分数做 exp 运算,分数一大,e 的几百次方直接溢出成 inf;inf 参与后续计算,整个训练就崩了。

解决:在计算 Softmax 前,先对每个样本的分数向量减去它自己的最大值。这个操作数学上不改变结果,但能把指数里的数压到负数或 0 的区间,彻底规避溢出。文档第 6 章专门讲了 Softmax 的数值稳定性问题,动手实现时一定要先做这一步。

5.4 初始化不当,模型根本不学

现象:参数随便初始化,训练跑了很久损失纹丝不动,像冻住了一样。

原因:W 初始化太大会让梯度爆炸,太小会让梯度消失,两种情况都会让更新量变得异常,模型学不动。

解决:按文档建议来初始化:W 从均值为 0、标准差 0.01 的高斯分布里采样,b 全部设为 0。之后再看 loss 曲线决定要不要调整。初始化不是玄学,但它决定了训练起点的好坏,值得每次重开实验前都检查一遍。

6. 下一步学什么:从读懂文档到跑通你的第一个模型

6.1 建议的练习顺序

读文档和动手做是两回事,我强烈建议每个零基础新手按这个顺序走一遍。

第一步,把第 2 章的 Softmax 线性分类器流程在纸上手动推一遍:取 3 个类别、3 个特征,算一遍分数、Softmax、交叉熵、梯度,哪怕只有 2 个样本也行,亲手算出每个数字,你会确信公式不是从天而降的魔法。

第二步,用 numpy 把那个训练流程真的跑起来,用随机生成的两簇数据做实验,观察学习率从 0.1 改到 1.0 时 loss 曲线的变化。这是成本最低的实验,也是理解梯度下降最快的办法。

第三步,把模型换成两层前馈神经网络,在你刚写的训练框架里加上 ReLU 和反向传播,体会一下“非线性”带来的决策边界变化。

第四步,再换成 CNN,找一个手写数字识别数据集动手训练。到这一步,你就已经把这份文档里三类模型都用过了。

6.2 回头重点看哪几节

跑通之后再回去读文档第 6 章“实现细节”:数值稳定性的处理、卷积操作怎么用 im2col 实现、参数更新与数据初始化。第一次读这些会觉得抽象,但当你自己踩过 NAN 和过拟合的坑之后,再回头看每一节写的都是你踩过的坑的解法。

我从那次之后养成了一个习惯:每次新开一个训练,都先打印 loss 曲线的前 50 步,确认它在下降,再去做别的事;每次改超参数,也只改一个变量。这个习惯帮我少翻了很多次车。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询