李沐的《动手学深度学习》课程视频,在深度学习自学者群体里的地位有点特殊。它不是那种几十集的刷题课,也不是只讲概念的科普视频,而是真正把一本开源教材的每一小节都拆开讲、带着你一行一行过代码的硬核长课。很多人点开播放列表,看到191集这个数字会先吸一口气,然后开始纠结:是要从头到尾全看吗?哪些模块能跳过去?学了几个月能不能把代码跑通?这篇文章就把这191集拆开给你看,按模块盘清楚每个篇章在讲什么,再根据零基础、有机器学习经验、工程向转型这三种情况,各给一条明确的学习路径。适合正在犹豫要不要学、以及已经开始但进度卡住的人收藏参考。
1. 课程内容全景:为什么这套课能成为“教材级”自学资源
1.1 课程、教材、代码三者之间的关系
李沐这套课程和《动手学深度学习》这本书是同源的,作者团队把书里的每一节内容扩展成视频讲解,配套的Jupyter Notebook代码可以随开随跑。191集这个数字在不同剪辑版本里不完全一致,有些是按框架分开的,有些是合并的,但主体模块基本是同一套框架。也就是说,课程本身是“视频+教材+可运行代码”三合一的组合,这是它比大多数网课强的地方:任何一个概念讲完,紧接着就是一个能跑的实验,你在notebook里改改参数,立刻能看到效果变化。
很多人容易忽略的一点:看视频只是使用这套资源的最小环节。真正的学习发生在你亲自运行代码、修改代码、观察结果的过程中。我的经验是,课上讲10分钟的概念,自己动手调20分钟比听10遍都管用。
1.2 先修要求:数学和编程底线到底要多少
被问得最多的就是“我数学不好能不能学”。我的答案一直都是:不需要你变成数学系学生,但这几个东西不能完全没有。线性代数里,矩阵乘法、转置、形状要熟悉,因为整个深度学习代码都在和张量形状打交道;微积分里,导数、偏导、链式法则要能认出来,反向传播的核心就是链式法则;概率统计里,期望、方差、常见分布的基本概念要有个印象。换句话说,不需要会证明,但需要看公式时能知道它大概在说什么。
编程方面,Python的基础语法得先过关,尤其是列表推导式、字典、类的基本用法和NumPy的常见操作。如果这些还没掌握就去看课,很容易在跑notebook时一头雾水。个人建议,正式上课之前,最好能独立写一个小的Python脚本去处理一组数据,比如读CSV、做简单统计、输出结果。有这个能力垫底,跟课会顺很多。
1.3 定位判断:它是“动手学”,不是“理论证明课”
这套课程最容易被误解的点在于名字里的“动手”两个字。它不是让你先学完所有数学再做实验,而是用一个又一个可运行的例子把抽象概念带出来。整体难度是在学的过程中一点点升高的,前面偏简单,越往后越需要时间消化。正因如此,它适合的是愿意动手实操的人,而不是只想“听一遍就懂”的旁观者。如果你能在看每个小节前先点开notebook跑一遍,再看视频去验证理解,学习效率会明显高于跟着视频无脑看下去。
1.4 值不值得从头到尾学
直接说我的判断:对大多数人,不需要“必须”从头到尾。课程是按教材顺序排的,不是按每个人的学习目的排的。如果你是想系统打底,建议按顺序学主流模块;如果是项目驱动,完全可以把课程当作一部“可以按目录查的工具书”,哪里不懂查哪里。后面的学习路径部分我会专门展开说这层怎么选。
2. 191集按模块拆解:每个篇章到底在教什么
2.1 预备知识与线性神经网络:把“训练循环”长在肌肉里
课程开头这部分的模块,对应的是“能跑起第一个模型”的阶段。预备知识里会讲到数据操作(张量)、数据预处理、线性代数、微积分和自动求导。很多初学者觉得这些内容太偏理论,但其实它们在为后面所有模型打底——比如张量形状搞不清楚,后面写卷积层代码会反复报错;自动求导不理解的,后面手动实现反向传播时会一脸懵。
线性神经网络分两块:线性回归和softmax回归。这块最大的收获是第一次完整见到“模型定义—损失函数—优化算法—训练循环”这个流程:拿数据喂给模型,算损失,求梯度,更新参数,反复迭代。这个流程会陪伴你整个深度学习生涯,可以说,把这段代码闭着眼睛写出来,后面的课都会轻松很多。
2.2 多层感知机与深度学习计算:从几层网络走向工程结构
多层感知机模块讨论的是“如果只用线性变换,再多层也还是线性的,怎么办”。于是引入激活函数(ReLU、Sigmoid等)给模型非线性能力,接着讲权重衰减、暂退法(dropout)这些正则化手段,再讲前向传播和反向传播的计算过程。为什么这章能劝退一批人?因为数学公式开始变多,模型也不像之前那么好调。但只要抓住一条主线——训练过程中信息的传播方向,前向传播把输入变成预测,反向传播把损失导数传回每一层,用来更新参数——很多细节就能挂在这条主线上,不容易散。
深度学习计算模块是容易被当成“无聊章节”跳过的部分,但我建议至少扫一遍:层和块、参数管理、自定义层、读写文件、GPU使用。这块解决的是“模型在工程上怎么组织、怎么保存、怎么部署”的基本问题。比如你在实际项目里经常会遇到需要把模型文件保存再加载的情况,如果没看过这章,遇到“load模型报错”时多半会束手无策。
2.3 卷积神经网络:视觉任务的主战场
从这部分开始,课程进入“视觉”这个最经典的深度学习应用领域。卷积神经网络(CNN)模块从最基础的卷积层开始讲,然后是填充和步幅怎么影响输出形状、多输入多输出通道到底是什么意思、汇聚层为什么能降低特征分辨率。基础结构讲完,课程就带着你走一遍从LeNet到ResNet的经典网络演进史:LeNet、AlexNet、VGG、NiN、GoogLeNet、批量规范化、ResNet、DenseNet。
我的建议是:网络结构不一定要全部手写,但必须跟着代码过一遍,理解每个网络解决的核心问题。比如ResNet的跳跃连接是为了缓解深网络梯度消失的问题,DenseNet用稠密连接来加强特征复用。能用自己的话说出“为什么这个网络要这样设计”,比背住每层参数重要得多。章节最后还会涉及一些更偏应用的视觉内容,属于拓展视野。
2.4 循环神经网络与序列建模:处理有先后顺序的数据
处理图片时,像素之间讲的是空间关系;而文本、语音、时间序列这些数据,本质上是按顺序排列的。循环神经网络(RNN)模块就是为这类数据准备的。课程会先讲序列模型和文本预处理,再讲语言模型是干什么的,最后过渡到RNN单元的内部结构。
RNN刚接触时会觉得计算图循环来循环去很绕。其实一个很粗的类比是:你在音乐软件里点歌,系统会根据你前面的点歌历史预测你下一首要点什么。RNN做的就是这个事情,它把“前面出现过的信息”压缩成一个隐藏状态,每往后读一步,都会用这个隐藏状态和当前输入一起决定下一步的预测。比较难的是梯度在时间步上反向传播时会消失或爆炸,这也是后面GRU、LSTM这些门控结构存在的意义。课程会把GRU、LSTM、深度循环网络、双向循环网络都过一遍,还会讲机器翻译的编码器—解码器架构和序列到序列模型。这部分内容量很大,但不需要一口气啃完,可以拆开学。
2.5 优化算法与计算性能:训练总出问题时回看这章
很多学员学到CNN或RNN时会发现,模型结构照抄没问题,但loss就是不掉或者训练特别慢。这时候去翻优化算法模块非常对症。课程会讲梯度下降、随机梯度下降、小批量随机梯度下降的区别,接着是动量法、AdaGrad、RMSProp、Adam,以及学习率调度策略。不要小看这部分,动手实验时最常见的问题就是学习率设置不合理,要么大得loss乱跳,要么小得半天不动。
计算性能模块则偏工程底层一点,包括编译器和解释器的差别、异步计算、自动并行、硬件的选择策略、多GPU训练,还有参数服务器思路。对刚开始学习的人来说,这一部分建议放后面;等你自己开始训练比较大的模型、觉得显存不够用或者GPU利用率上不去时,再回来看,会发现每一条都踩在痛点上。
2.6 计算机视觉、自然语言处理与注意力机制:走向综合应用
课程最后的大模块是把前面学到的能力综合起来。计算机视觉部分除了前面CNN的经典结构外,还会讲图像增广、微调(迁移学习的重要工具)、目标检测(锚框、SSD、R-CNN系列)、语义分割、样式迁移,以及GAN的基本思想。自然语言处理部分会讲词嵌入(word2vec)、GloVe、情感分析、BERT,还有自然语言推理。最后的注意力机制模块会统一讲Bahdanau注意力、多头注意力、自注意力,最后用Transformer收尾,这也是现代大模型底层的核心结构。
到了这个阶段,课程每个小节的信息密度都很高,代码也更长更复杂。真正学到这里时,建议不要追求一天看好几集,而是宁可慢一点,把每个notebook拆成几段来运行和调试,搞清楚每段代码在做什么。
把上面的内容汇总一下,可以形成下面这张快速索引表,我建议把它收藏下来,学完一个模块勾一个模块。
| 模块范围 | 核心知识点 | 建议侧重 |
|---|---|---|
| 预备知识 | 张量、自动求导、数据预处理 | 打好基础 |
| 线性神经网络 | 线性回归、softmax回归 | 必须吃透训练循环 |
| 多层感知机 | 激活函数、正则化、前向/反向传播 | 建立非线性理解 |
| 深度学习计算 | 参数管理、自定义层、GPU | 工程入门 |
| 卷积神经网络 | 卷积、池化、经典网络、目标检测 | 视觉方向重点 |
| 循环神经网络 | RNN、GRU、LSTM、seq2seq | 序列方向重点 |
| 优化算法 | SGD、Adam、学习率调度 | 排错必备 |
| 计算性能 | 多GPU、自动并行、硬件 | 按需选读 |
| 视觉与NLP进阶 | 图像增广、BERT、Transformer | 实际项目参考 |
3. 三条学习路径:按照基础对号入座
3.1 完全零基础:建议按主干顺序学,时间预算4到6个月
如果你是刚接触深度学习的纯新人,我的建议是先不要想“哪里能跳”,而是按课程自带顺序把主干模块走一遍,走完再做减法。前期花两三周过预备知识部分,同时补一补Python和NumPy;然后进入线性神经网络和多层感知机,这两个模块是整个体系的骨架,代码一定要亲手敲,最好能脱离notebook的提示独立写出来。CNN和RNN是接下来两个大块,难度开始上升,每天能高质量看一个小节就很不错。优化算法建议在训练模型遇到困难时再系统看,计算性能模块可以先跳过,到后面训练大模型时再回看。整个流程走下来通常需要4到6个月,前提是几乎每天都有学习时间。
3.2 有机器学习基础但没做过深度学习:2到3个月集中攻坚
如果你已经接触过机器学习,比如懂线性回归、逻辑回归、SGD这些概念,那预备知识里的很多数学内容可以快速刷过,不用在理论推导上花太多时间。直接从线性神经网络开始会更高效,但要注意,即便概念都懂,课程里的代码实现和sklearn那种调包风格差别很大,必须在PyTorch的tensor操作上多花时间适应。多层感知机、CNN、RNN、注意力机制这几个模块是核心重点,建议逐个吃透,每个模块都完成配套代码练习。计算性能和深度学习计算这类偏工程的章节,挑自己需要的看就行,整体时间预算2到3个月。
3.3 在职工程师或项目驱动型学习者:按目标模块切入,不追求全看完
对这部分读者来说,191集课程更像一本带视频的代码参考手册。建议先明确自己的实际任务属于哪类:如果做图像分类,直接切入CNN模块,再重点看微调(迁移学习)和目标检测;如果做文本分类或理解类任务,直接看RNN到注意力机制,尤其要把Transformer吃透;如果做推荐系统或时序预测,序列模型、优化算法是主要参考。采用这种方式时,唯一的建议是“定向补基础”——看CNN之前,至少要把线性神经网络和多层感知机快速过一遍,因为课程后面的所有内容都建立在“训练循环”这个概念上,直接跳太狠容易看不懂代码。
3.4 关于学习节奏和复习的通用建议
无论走哪条路径,都建议把视频总时长和练习时间控制在1比2以上:看一集视频只用二三十分钟,但跑通并理解配套的notebook可能要花一两个小时。我的习惯是每完成一个模块就建一个Markdown笔记,把当时卡住的问题、最后的解决方式、训练出来的loss曲线都贴进去。不要追求永远往前赶,学新的内容时如果发现自己连前面模块的核心概念都要重新查,说明节奏快了,先回头巩固。
4. 跟课实操:最容易卡住我的几个环节
4.1 环境问题:先把PyTorch和d2l工具包装好
课程代码依赖一个叫d2l的工具包,里面有课程封装好的训练函数、画图函数和数据处理函数。建议不要在系统Python里直接装,而是建一个独立虚拟环境,比如用conda:
conda create -n d2l python=3.9 conda activate d2l pip install jupyter d2l接着装PyTorch。CPU版本可以满足课程绝大多数实验,如果电脑有NVIDIA显卡,可以装GPU版本,训练快一些。注意安装时要按照自己系统的命令执行,直接照搬某些过时教程里的命令可能会踩坑。另外,Jupyter Notebook运行时如果import d2l失败,先把内核切换成d2l环境,大部分这类问题都是内核没选对。
4.2 没GPU能不能学?初期预算不够的话CPU完全够用
一个常被问的问题:是不是必须买显卡才能学这门课。我的建议是,前几章和大部分练习用CPU跑完全没问题,尤其线性回归、多层感知机、小规模CNN,CPU跑起来也就是慢一点,并不会真的让人等不下去。真的学到目标检测、BERT这种大模型时,再考虑租借云端GPU也不迟。在没有GPU的情况下,把代码跑通、观察loss变化、理解每个模块的机制,这些目标都可以实现。卡在“没显卡所以我先不学”这个心理门槛上,才是真正影响进度的东西。
4.3 代码报错的基本排查链路
跟课过程中,最常见的报错集中在张量维度不匹配、设备不一致(CPU与GPU之间的tensor不能直接运算)、API版本变化这三类。遇到报错时,我的排查顺序是:先看最底下的异常类型,再定位到出错的代码行,然后打印相关张量的shape和dtype,确认是什么地方不匹配。如果是设备不一致,把其中一个tensor移动到另一个设备再运算;如果是API变化,去查对应框架版本的官方文档或课程讨论区。总之,把“看报错信息”当成一种技能来练,而不是害怕它。正是通过亲手处理这些报错,才会真正理解数据是怎么在网络里流动的。
4.4 别急着“看下一集”,把Notebook当主战场
课程视频固然讲得好,但我在实际跟课时发现,最重要的不是“看完”,而是“跑完+改完”。一个小节看完了,最好立刻把notebook里核心单元格重置,凭记忆加上代码辅助重新实现一遍;跑通之后,再故意改几个参数,比如把学习率从0.1改成1.0,观察loss曲线为什么会飞掉;把卷积核大小改大,看模型参数量和训练时间怎么变。这个过程能建立的直觉,是纯看视频完全给不了的。等到后面学到更复杂的模型,这种“动一下参数看结果”的习惯会变成最重要的调试手段。
4.5 卡住超过一个点,先放一放
跟这套课几乎必然会在某个模块卡住,我当年卡得最久的是RNN的反向传播和Transformer的多头注意力。遇到这种情况,不用硬啃,更合理的做法是先把卡住的代码放一放,往前继续学下一节,过几天再回头重看。你会发现大脑在后台帮你整理了信息,第二次理解的速度会快很多。卡住不是笨,是大脑正在适应新的抽象层级。
5. 学完这套课之后:怎么判断自己“真的学会了”
5.1 三个可操作的自测标准
学完整套课或者自己的目标路径后,不要只看“我刷完了191集”来确认成就感。更好的判断方式是三个自测:第一,能不能不靠视频,只凭教材或自己的笔记,从零写出一个可运行的LeNet做MNIST分类;第二,能不能清楚解释每一个模型的动机,比如为什么CNN适合图像、为什么RNN需要门控、为什么Transformer能并行;第三,能不能把课程里的某个模型改一改迁移到自己的数据上。如果这三条基本能做到,那就说明课程内容已经成为你的工具,而不只是看过的视频列表。
5.2 考察自己是否能做一个小项目作为收尾
学完不是终点,真正让能力落地的是一个完整的项目。不需要多复杂,可以是找一套不在课程里的数据(比如一个不常见的图像分类数据集、一摞自己收集的文本),把课程里学过的微调方法或BERT模型套上去,从数据准备、模型训练到指标评估完整跑一遍。这个过程会让你遇到大量课程里没提到但真实世界里一定会遇到的问题:数据清洗怎么处理、类别不均衡怎么办、训练时间太长能不能早停。把这些问题解决掉,深度学习才算真正入门,这门课的完整价值才真正兑现。
5.3 最容易让学习效果打折的三个误区
一是“重视频数量轻动手”,每天刷十几集,笔记和练习却完全跟不上,到头来只会“眼熟”。二是“抄代码不思考”,跑通就完事,从不去改参数、不看结果差异,学完脑子里留下的只是复制粘贴记忆;三是“线性推进没有复习”,每个模块之间其实有强依赖关系,学完CNN后隔两三周回头快速翻一翻之前笔记的人,和只往前冲不回头的人,后期的理解深度会差很多。只要避开这三个误区,这套课的性价比在所有自学资源里算是第一梯队。
如果非要说一条我最想安利给后来者的经验,那就是:用“复现+改动”的方式跟这套课,每一小节都亲手动过,哪怕进度慢到一周只学三四个小时,也比“光看不练”刷完全部集数要好得多。我自己在学到Transformer时一度很受挫,后来把注意力计算拆成一行行带打印的代码逐段运行,才真正理解Q、K、V三个矩阵在做什么。希望这套模块拆解和学习路径能帮你少走一些弯路。祝每个打开191集第一集的你,最后都能在这套课里找到自己需要的那块拼图。