资讯动态

Datawale Task01 深度学习基础

发布时间:2026/9/27 23:27:00 来源:尧图企业网站定制
Datawale Task01 深度学习基础感谢Datawhale组织的学习活动费曼学习法四步讲出来——把一个概念用最简单的话讲给完全不懂的人听不看原文。找卡壳——讲不下去、含糊其辞、只能背公式的地方就是没懂的地方。回去补——回到原文对应小节把缺口补上。再简化——补完之后换一个类比重新讲一遍删掉所有术语堆砌。1. 综述神经网络是一个带参数的函数训练就是不断调参数让一个叫损失的数字变小。神经网络 可学习的参数化函数 ŷ f(x; θ) ↓ 要变小的目标 损失函数 L L(ŷ, y) ↓ 调参的方向 梯度反向传播 ∇θL ↓ 调参的动作 梯度下降 θ ← θ - η∇θL ↓ 为什么这招在几十亿维还管用 高维几何 过参数化 SGD 随机性四步循环Forward → Loss → Backward → Update模型结构会换MLP、CNN、Transformer、LLM这四步一个都不变。2. 第 1.1 节神经网络是一个可学习的函数一句话核心机器学习的全部任务就是找一个函数y f(x)神经网络特殊在它是一个y f(x; θ)——形式固定、参数可调调参数就是学习。大白话讲解所有任务剥到最后都是同一件事给输入要输出。图片进猫出、句子进情感出、七天气温进明天气温出。数学上就是y f(x)f就是模型。普通函数不够用不是因为它简单而是因为现实任务的四个特点维度爆炸一张 224×224 彩色图就是 150528 个数关系非线性类别不是某一个像素决定的模式分层边缘 → 形状 → 物体规律藏在数据里没法手写规则只能从大量样本里统计出来。所以要的是一个表达能力强、又能被数据调整的函数。神经网络就是这个函数三个关键词关键词含义反面误区函数本质仍是输入到输出的映射不是魔法黑盒参数化行为由一组参数 θ 决定θ 变则行为变不是一套写死的规则可学习θ 由数据自动调出来不用人手填不是理解了数据关键类比可调水龙头参数 水龙头旋钮随机初始化 旋钮随手拧到某个位置输出与目标的差距 水流大小不对计算损失 看一眼差多少更新参数 按偏差拧一下旋钮训练完成 反复拧到水流正好学习 反复拧旋钮仅此而已。不是灌输规则不是理解概念。学习的五个步骤初始化参数随机输出接近胡说前向预测输入 x → 输出 ŷ算偏差这里用到损失函数调参数方向从哪来1.3 节重复 2-4 直到输出够好深度 ≠ 层数多深度真正的含义是分层组织信息浅层看边缘、纹理、颜色中层拼出局部形状狗尾巴、兔耳朵深层整合成完整物体概念数学形式就是函数嵌套ŷ f_L(f_{L-1}(…f_1(x)…))。每层是一个简单子任务串起来解决复杂映射。训练完模型学到了什么学到的不是一份看到 A 就输出 B的规则清单而是一组最优参数 θ以及这组参数决定的函数行为。规律被编码进了参数取值里。所以兔子长了尖耳朵圆眼睛会被判成猫——模型做的是参数驱动的特征映射不是理解本质。这个认知直接决定你后面能不能理解过拟合训练的目标是学通用规律不是背下训练集。背下来就是过拟合。卡壳点卡在网络这个词不是整体是大量简单变换单元按层连接。神经元/连接/激活是沿用生物神经的历史命名人工网络并不真的模拟大脑。卡在可学习把它讲成模型在理解数据就讲砸了。正确讲法是参数在数据引导下的迭代优化。卡在通用性为什么一套东西能做图像、语音、翻译因为这些任务都能抽象成输入 → 输出的映射只是需要不同的网络结构CNN 抓空间、RNN/注意力抓序列、协同过滤抓特征交互本质不变。检验问题用一句话向高中生解释参数化函数。为什么一次函数y kx b干不了图像分类神经网络学完之后模型里存的到底是什么什么叫深度说层数多为什么只是表面答案3. 第 1.2 节损失函数——把做得好不好变成一个数字一句话核心训练的目标是min_θ J(θ)找到一组参数让模型在数据上的平均损失最小。大白话讲解模型输出了但不对只是定性描述训练需要一个可计算的数值。损失函数就是这个评分标准——和考试相反分数越低越好。推导路径每一步都能自己推出来才算懂直接相减ŷ - y房价例子里是280 - 300 -20负号说明偏小但正负误差会互相抵消。取平方(ŷ - y)² 400抵消问题解决这就是最简单的损失函数。推广到 N 个样本求平均 →均方误差 MSELMSE1N∑i1N(y^i−yi)2L_{MSE} \frac{1}{N}\sum_{i1}^{N}(\hat{y}_i - y_i)^2LMSE​N1​i1∑N​(y^​i​−yi​)2分类任务不能用 MSE因为输出是各类别的分数/概率目标是正确类别概率尽可能大→ 用交叉熵。关键的视角转换这节最重要的一步L(y^,y)→ y^f(x;θ) L(f(x;θ),y)L(\hat{y}, y) \xrightarrow{\ \hat{y}f(x;\theta)\ } L(f(x;\theta), y)L(y^​,y)y^​f(x;θ)​L(f(x;θ),y)输入 x 和真实答案 y 都是给定的、改不了的能改的只有 θ。所以比较预测和答案这件事换个角度看就是当前这组参数会产生多大损失。于是训练问题写成min⁡θL(f(x;θ),y)\min_{\theta} L(f(x;\theta), y)θmin​L(f(x;θ),y)把损失画出来就是一张损失平面训练就是在上面找最低点。从单样本到 batch单样本损失L_i L(f(x_i; θ), y_i)全数据集目标J(θ) (1/N) Σ L_i训练即min_θ J(θ)实际训练不用全量数据一次取一小批batch大小 BLbatch1B∑i1BLiL_{batch} \frac{1}{B}\sum_{i1}^{B} L_iLbatch​B1​i1∑B​Li​关键类比教练打分损失函数像教练给动作打分。运动员模型不需要知道标准动作的哲学定义只需要知道这次几分、比上次高还是低。选什么评分表MSE / 交叉熵取决于比的是跳水还是体操——损失函数由任务决定选损失函数就是在定义什么叫好。训练循环x → f(x;θ) → ŷ → L(ŷ,y) ↑ ↓ └── θ ← θ_new ─┘ 要求 L_new L卡壳点最大的卡壳L 10很大然后呢w 该改成 2.1、1.9 还是 10只知道损失多大不等于知道往哪走。参数有几百万个时穷举完全不可行。需要知道的是损失对每个参数有多敏感——这就是梯度是 1.3 节的全部内容。易错把L当成模型的属性。它其实是 θ 的函数输入和答案固定之后唯一变量就是参数。检验问题为什么误差要取平方不能直接ŷ - y回归和分类各用什么损失为什么不能通用把L(ŷ, y)改写成只含 θ 的形式并解释为什么这一步是训练问题的转折点。min_θ J(θ)里的 N 和 B 分别指什么实际训练用哪个4. 第 1.3 节计算图、前向传播、反向传播一句话核心反向传播 在计算图上用链式法则把上游梯度 × 局部导数从损失往回传一次算出所有参数的梯度它只算梯度不改参数。大白话讲解1梯度是什么先看单参数L(w) (w-3)²当前w 1L 4。求导dL/dw 2(w-3)代入得-4。这个 -4 有两层含义符号给方向导数为负 → 增大 w 会让损失减小 → 该往大调。绝对值给敏感度绝对值越大同样大小的微小改动引起的损失变化越剧烈。多参数时把所有偏导数拼成一个向量就是梯度∇θL(∂L∂w1,…,∂L∂wn)\nabla_\theta L \left(\frac{\partial L}{\partial w_1}, \dots, \frac{\partial L}{\partial w_n}\right)∇θ​L(∂w1​∂L​,…,∂wn​∂L​)梯度不是新概念就是所有偏导数打包。2计算图把大公式拆成流水线模型ŷ wx b损失L (ŷ - y)²写在一起是L (wxb-y)²。硬求导可以但真网络嵌套上百层必须拆a wx → ŷ a b → e ŷ - y → L e²画成图就是计算图。它的价值是让依赖路径显式化w → a → ŷ → e → L b → ──→ ŷ → e → L神经网络本质上就是一张超大的计算图每层接前面的输出、做自己的运算、传给下一层。3前向传播顺着箭头算到损失代入x2, w3, b1, y5步骤计算结果a3 × 26ŷ6 17e7 − 52L2²4前向传播必须保存中间值。因为∂L/∂e 2e反向时要用到前向的e2。这就是训练时显存占用高的原因之一不只是存预测还要存给反向用的中间量。4反向传播链式法则倒着走∂L∂w∂L∂e⋅∂e∂y^⋅∂y^∂a⋅∂a∂w2e⋅1⋅1⋅x\frac{\partial L}{\partial w} \frac{\partial L}{\partial e}\cdot\frac{\partial e}{\partial \hat{y}}\cdot\frac{\partial \hat{y}}{\partial a}\cdot\frac{\partial a}{\partial w} 2e \cdot 1 \cdot 1 \cdot x∂w∂L​∂e∂L​⋅∂y^​∂e​⋅∂a∂y^​​⋅∂w∂a​2e⋅1⋅1⋅x代入e2, x2得∂L/∂w 8同理∂L/∂b 2e 4。口诀上游梯度 × 局部导数 传给前一个节点的梯度从∂L/∂L 1起步平方节点乘2e得到 2e减法节点、加法节点原样传乘法节点乘x分给 w 和 x。5为什么高效一个标量损失 ↔ 几亿个参数如果每个参数都从头展开链式法则重复计算爆炸。反向传播复用中间梯度先算一次∂L/∂e、∂L/∂ŷ再分发给 w 和 b 两条分支。这就是反向模式自动微分天然适配少输出、多输入的结构。多条路径的梯度要相加L w² 3w有两条路所以dL/dw 2w 3。6自动微分框架只要知道每个基本算子的局部导数z x y→ ∂z/∂x 1z xy→ ∂z/∂x yz x²→ ∂z/∂x 2x再加上依赖关系就能自动倒推出全部梯度。PyTorch 的autograd就是这个。既不是有限差分近似也不是符号求导。数字演练完整走一遍前向e 2x 2反向∂L/∂e 1×2e 4→∂L/∂w 4×1×1×2 8∂L/∂b 4更新η0.1w 3 - 0.8 2.2b 1 - 0.4 0.6再前向ŷ 2.2×2 0.6 5→L (5-5)² 0这个例子是特意设计的一次就到底。真实训练要成千上万次。卡壳点把反向传播当成自动改参数。它只回答该怎么改算 ∇θL真正改是 Update 的事。把梯度当成全局信息。梯度只描述当前位置附近的局部趋势它不知道整个损失函数长什么样。忘记多路径梯度相加。一个张量被送到多个分支时回来的梯度要累加。忘记前向要存中间值导致想不通显存为什么爆。检验问题dL/dw -4在w1处意味着什么该把 w 调大还是调小计算图解决了什么问题画出L (wxb-y)²的依赖路径。用口诀上游梯度 × 局部导数手工算一遍∂L/∂b。一百万个参数只算一次反向传播就够为什么不会重复算一万次loss.backward()执行完参数变了吗5. 第 1.4 节梯度下降——从梯度到参数更新一句话核心θ ← θ - η∇θL梯度指向局部上升最快的方向所以减去它就是往下降最快的方向走一步η 决定这步走多远。大白话讲解1负号不是规定是必然L(θ) (θ-3)²导数2(θ-3)当前 θ导数含义该往哪走54增大 θ → loss 升调小 θ1−4增大 θ → loss 降调大 θ统一写成θ ← θ - η(dL/dθ)导数为正时减去正数变小导数为负时减去负数变大。一个公式自动覆盖两种情况。高维时 θ 变成向量∇θL 是同样维度的向量反向传播交给优化器的是参数空间里的一个方向不是某个孤立的数。2为什么负梯度一定让 loss 下降局部线性近似小改动 Δθ 下L(θΔθ) ≈ L(θ) ∇θLᵀ Δθ取Δθ -η∇θL代入L(θΔθ) ≈ L(θ) - η‖∇θL‖²因为‖∇θL‖² ≥ 0只要 η 足够小loss 必然不增。这就是全部数学依据。足够小是关键词梯度只在局部可信。走太远线性近似失效。所以训练是看一眼 → 走一小步 → 重新看的循环一步到不了终点。3学习率 η一步走多远η 10⁻⁶稳但慢到天荒地老。η 太大跨过低 loss 区域在两侧来回震荡甚至发散。用L(θ)θ²检验更新后θ_{t1} (1-2η)θ_t。0 η 1→|1-2η| 1θ 逐渐收敛到 0η 1→|1-2η| 1θ 绝对值越来越大发散学习率本质上是在回答我们相信当前梯度描述的局部方向能信多远它是最重要的超参数之一。4Backward 和 Update 是两件事例θ 2backward 算出 ∂L/∂θ 0.5此时θ 仍然是 2。η 0.1执行 update 才变成2 - 0.1×0.5 1.95。对应代码loss.backward()# Backward算梯度应该怎么改optimizer.step()# Update真正把参数改掉5完整训练流程θ⁽⁰⁾ → Forward → Loss → Backward → Update → θ⁽¹⁾ → …希望看到L(θ⁽⁰⁾) L(θ⁽¹⁾) L(θ⁽²⁾) …。注意是希望用 mini-batch 和复杂优化器时 loss 会波动但整体目标不变。关键类比下山站在山上当前 θ环顾四周找最陡的下坡方向梯度朝反方向迈一小步η·步长到新位置重新环顾。你永远看不到山顶全貌只看得见脚下这一小片地形。卡壳点以为 backward 会改参数。必须能明确说出两行代码各干什么。以为负号是人为约定。要能用L(θΔθ) ≈ L(θ) ∇ᵀΔθ推出来。以为 loss 每步必须严格下降。mini-batch 下会抖动。只会背公式不会判断方向。θ5 时导数为正该调小θ1 时导数为负该调大——这种口算必须熟练。检验问题梯度为 0.5、学习率 0.1参数从 2 变成多少为什么减去梯度而不是加上梯度用一句话 一个式子回答。学习率 1e-6 和 100 分别会出什么问题loss.backward()之后参数还是 2这句话对吗6. 第 1.5 节为什么神经网络能够被训练一句话核心不是靠某个定理保证成功而是多个因素让这个几十亿维的非凸问题比二维直觉看起来友好得多网络可微、高维方向多、过参数化解多、SGD 带随机性、真实数据有结构。大白话讲解1二维山谷图是有害直觉小球滚下山的图只是一张切片或投影。d 个参数的真实损失函数是L: R^d → R十亿参数就是十亿维。高维下∇L(θ) 0只说明这里梯度为 0不能判断是谷底还是山顶还要看各方向曲率即 Hessian 矩阵H ∇²L(θ)的特征值临界点Hessian直觉局部极小值所有方向都向上弯往哪走 loss 都升局部极大值所有方向都向下弯往哪走 loss 都降鞍点有的方向上弯、有的下弯某方向像谷底另一方向仍能下降高维下一个点要在所有方向都没有下降空间才算真正的局部极小值。只要还有一个方向能降就还能走。所以让优化变慢的往往是鞍点和平坦区而不只是坏坑。必须守住的边界不能由此推出维度高所以没有局部极小值。那结论太强真实 loss landscape 结构复杂高维几何只是说明到处是孤立坏坑不是合理图景。2过参数化可能根本不用找唯一答案2 个参数要同时满足 3 个独立条件 → 无解只能妥协。参数远多于约束 → 满足条件的解是一整片区域不是一个点。最简单例子θ₁ θ₂ 1的解是整条直线(0,1)、(0.2,0.8)、(2,-1)…无穷多。再加上参数对称性交换两个功能相同的神经元及其下游连接网络算出的函数完全一样即θ_a ≠ θ_b但f(x;θ_a) f(x;θ_b)。所以训练目标从来不是恢复唯一真实参数而是找到任意一组能实现所需函数行为的参数。参数多不只是负担也提供自由度和更多可行路径。边界不是参数越多永远越好算力、显存、数据需求都会涨不同结构优化性质也不同。3SGD 的随机性是帮手完整梯度g ∇L(θ)mini-batch 梯度g_B ∇(1/|B| Σ L_i)两者不等。SGD 看到的是带噪声的梯度估计轨迹是总体向下 持续随机抖动不是光滑下山。这在平坦区完整梯度已很小batch 梯度仍有波动和鞍点扰动帮助离开可能反而有利。边界噪声不保证逃离所有鞍点更不保证全局最优。学习率、batch size、momentum、初始化、结构都会改变结果。副产品同样数据训练两次参数可以完全不同函数却可能一样好。4数据高维但没那么复杂224×224×3 150528 维可每张真实图片只是这空间里极小的一撮。自然图像受现实约束轮廓连续、相邻像素高度相关、光照连续、旋转后仍是同一物体。流形假设真实数据虽然表示在高维空间但有效数据集中在维度低得多的结构附近。所以模型只需要在真实数据会出现的那一小块区域学会映射不用处理整个 150528 维空间。两个流形必须分清概念说的是哪个空间回答什么问题过参数化的低损失区参数空间好解多不多流形假设输入数据空间任务有没有规律边界流形假设不是对所有数据都严格成立的定理真实数据有噪声、离散结构、多尺度变化而且数据有低维结构不能直接推出优化一定容易。5汇总能降 loss ≠ 能泛化能被训练的原因汇总网络由大量连续、几乎处处可导的运算组成 → 反向传播能给出有效局部梯度高维空间充满鞍点和平坦方向不是孤立坏坑过参数化 → 低损失解丰富不必找唯一最优mini-batch 随机性 → 轨迹不锁死在一个方向真实数据本身有结构 → 不是毫无规律的高维映射但这只回答了优化为什么训练 loss 能降。更深的问题是泛化为什么在没见过的数据上也对——参数量远大于样本数的网络完全有能力死记硬背训练集为什么它没有这不是梯度下降找到了低 loss能解释的涉及数据分布、结构的归纳偏置、优化器的隐式偏置、正则化、数据增强、模型规模。能训练出来 ≠ 已经理解它为什么工作。检验问题梯度为 0 的点一定是局部极小值吗还要看什么用θ₁ θ₂ 1解释过参数化为什么反而让优化变简单。参数对称性说明了什么为什么唯一真实参数这个说法没意义用流形假设解释150528 维输入为什么还能学。流形假设和过参数化哪个在说输入空间、哪个在说参数空间loss 降下来了和模型能用之间还差着什么7. 全章串联一张图讲完┌─────────────────────────────────────────────────────────┐ │ 1.1 ŷ f(x; θ) 神经网络 可学习的参数化函数 │ │ 学习 反复调 θ水龙头拧旋钮 │ └───────────────────────┬─────────────────────────────────┘ ↓ 怎么衡量调得好不好 ┌─────────────────────────────────────────────────────────┐ │ 1.2 L L(ŷ, y) → J(θ) 损失函数把差多少变成一个数 │ │ 训练目标min_θ J(θ) │ │ 卡点知道 loss 大小 ≠ 知道往哪调 │ └───────────────────────┬─────────────────────────────────┘ ↓ 需要每个参数的方向和敏感度 ┌─────────────────────────────────────────────────────────┐ │ 1.3 梯度 所有偏导数打包 │ │ 计算图拆开公式暴露依赖路径 │ │ Forward算出 ŷ 和 L顺便存中间值 │ │ Backward上游梯度 × 局部导数从后往前传 │ │ 多路径梯度相加复用中间梯度所以高效 │ │ 只算梯度不改参数 │ └───────────────────────┬─────────────────────────────────┘ ↓ 拿到梯度之后 ┌─────────────────────────────────────────────────────────┐ │ 1.4 θ ← θ - η∇θL 梯度下降真正改参数 │ │ 负号来自局部线性近似η 决定步长 │ │ backward() 算方向step() 执行改动 │ └───────────────────────┬─────────────────────────────────┘ ↓ 这套方法凭什么在几十亿维有效 ┌─────────────────────────────────────────────────────────┐ │ 1.5 二维山谷直觉不可靠 → 高维看 Hessian/鞍点 │ │ 过参数化 → 好解是一片不是一个点 │ │ SGD 随机性 → 轨迹会抖反而可能脱困 │ │ 流形假设 → 输入数据实际集中在低维结构附近 │ │ 剩下的问题优化 ≠ 泛化 │ └─────────────────────────────────────────────────────────┘四步循环背下来步骤回答的问题代码对应Forward模型现在预测什么pred model(x)Loss模型错了多少loss criterion(pred, y)Backward每个参数该往哪改loss.backward()Update真的把参数改掉optimizer.step()8. 费曼自测10 道检验题不看原文能用自己的话答出来才算过关。答不出的题号对应上面的卡壳点回去重讲一遍。用水龙头类比完整讲一遍神经网络的学习过程。神经网络、参数化函数、可学习三个词各删掉一个会怎样为什么分类任务不用 MSE说出两个理由。从L(ŷ,y)推到min_θ J(θ)中间用了哪两个代换画出ŷ wxb、L (ŷ-y)²的计算图标出 w 和 b 各自的路径。前向传播为什么要保存中间结果举一个具体算子说明。用上游梯度 × 局部导数算出∂L/∂w和∂L/∂bx2, w3, b1, y5。θ2、∂L/∂θ0.5、η0.1backward 之后 θ 是多少update 之后呢为什么负梯度方向能保证 loss 下降写出那个近似式。训练 loss 一路降到 0 了模型就一定好用吗为什么9. 常见误解清单误解正确说法神经网络是神秘黑盒它就是一个y f(x; θ)黑的只是维度不是原理神经元堆叠 神经网络的本质堆叠是形式可学习的参数化函数才是本质模型理解了猫和狗只是参数编码的统计规律所以会被尖耳朵兔子骗到神经网络完全模仿大脑只借鉴了连接结构的命名和理念损失函数是通用的由任务决定回归用 MSE分类用交叉熵反向传播会自动修改参数只算梯度改参数是optimizer.step()梯度是全局下降指南只描述当前位置的局部趋势梯度为 0 到谷底了可能是鞍点要看各方向曲率梯度下降的负号是人为规定由局部线性近似推出负梯度才是下降方向参数越多越难训练适度过参数化反而让好解更丰富、更容易找loss 降下来 模型能用那是优化泛化是另一个未解清的问题流形假设是已证明的定理是一种有用的思考假设不是普适保证10. 下一步按原文顺序进入 PyTorch 实践先看Dataset/DataLoader和完整训练循环怎么对应上面的四步再展开 autograd 的 leaf tensor、detach()、no_grad()等实现细节。原文地址 https://jshn9515.github.io/deep-learning-notes

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑