简介:微软AI-For-Beginners 中文版课程资料包面向零基础到入门阶段的AI学习者,对应一套12周、24课的系统课程,可用于自学、课堂教学或读书会共读。内容围绕符号人工智能与知识表示推理、神经网络与深度学习、计算机视觉和自然语言处理展开,并结合TensorFlow、PyTorch示例说明模型概念,同时涉及遗传算法、多智能体系统及道德AI原则,配有练习、测验与实验室活动。压缩包共375个文件、约56.7MB,以png插图、md课程文档、ipynb交互式笔记为主,另有json配置、py脚本、js前端资源及少量视频、图片和网页文件,便于按课程章节阅读与动手实验。已有140人学习下载。整体结构完整,适合据此安排学习路径、复现示例代码、完成课后练习,并借文档与 notebook 对照理解传统AI到深度学习的知识脉络。
1. 从一份“读得懂却跑不动”的课程说起
攒了几百 G 的视频课,真到要写第一行model.fit的时候还是得现搜——这是很多人囤课的真实状态。AI-For-Beginners 中文版这套人工智能课程资源的设计方向刚好相反:每一节理论后面都跟着一个能直接执行的 notebook 和一组课后练习,内容从 AI 导论、符号系统、神经网络,一路铺到计算机视觉、NLP、遗传算法、强化学习和 AI 伦理。它适合两类人:想系统过一遍 AI 主线、但受不了纯视频节奏的转行者;以及天天调包、却说不清反向传播和卷积在干什么的初中级工程师。它不适合指望靠它直接上手大模型微调的人,重心仍在经典机器学习与深度学习基础。下面按“这套课有什么、环境怎么搭、练习代码怎么改、哪里会翻车”四件事拆开讲。
2. 课程骨架拆成岗位语言:六块内容分别喂给谁
拿到一个课程仓库,最怕的是从头到尾顺着读,读到第三课就跟不上了。我的习惯是先把目录结构摊开,看清楚每块内容对应哪类工程问题,再决定精读、泛读还是跳过。这套课的组织方式是按主题分目录编号,每个目录下是“预习材料 + 讲解 notebook + 实验/作业 + 课后测验”的组合,主题之间是并列而非强依赖,这给了按需取舍的空间。
2.1 导论与符号 AI:先分清规则系统和学习系统的边界
开头几课讲的是 AI 的定义、发展脉络,以及符号推理、知识表示、专家系统这一类“非学习”路线。很多人会直接把这块划成历史课跳过,但它其实是后面所有内容的分界线:什么情况下该写规则,什么情况下该喂数据训模型,这个判断力在真实项目里比会调几个超参值钱得多。
符号 AI 那部分的练习通常要求用搜索算法(广度优先、A* 之类)解一个图上的路径或推箱子问题。代码量不大,但能直观感受到“状态空间爆炸”是什么——把状态数从几十加到几万,同一份代码从秒级变成跑不动。带着这个体感再去看后面的神经网络,你会更容易理解为什么大家宁愿要一个近似解,也不去穷举。
这一块我建议至少把练习跑一遍,不要只看 notebook 输出。跑的过程里你会碰到状态表示、去重、启发函数设计这几个具体问题,它们和后面特征工程、损失函数设计是同一类思维方式。
2.2 神经网络主线:感知机到 Keras 的完整闭环
这是全课最核心的一段,从单个感知机、激活函数、多层网络讲到反向传播,再落到 TensorFlow/Keras 的实现。它的好处是讲解和代码贴得很紧:前面用几行 numpy 手写一遍前向和梯度,后面立刻用 Keras 同样的结构再搭一次,两次结果放在一起对照,梯度消失、学习率过大这些概念就不再是抽象名词。
看这段时容易犯的错是只跑 Keras 那部分。手写梯度那段代码虽然短,但它决定了你后面看到loss不降时能不能定位问题。我一般会要求自己至少能手推一遍单个神经元的链式求导,然后回到代码里找到对应的那几行,看它和公式是否对得上。
框架层面,课程把 TensorFlow/Keras 作为主线,部分练习也给出了可替代实现的思路。如果你所在团队用别的框架,不必换环境重学,把结构对着抄一遍即可——层类型、损失函数、优化器这些概念是通用的,差异在 API 拼写。
2.3 计算机视觉与 NLP:两条最能出成果的支线
视觉部分从图像基础、卷积核、池化讲到 CNN 和迁移学习,练习里比较典型的是手写数字或服饰分类,以及用预训练主干做小样本微调。NLP 部分从文本清洗、分词、词袋讲到词向量和序列模型,练习会涉及情感分类或文本生成。这两块是绝大多数人学完之后最能立刻用在工作里的内容,优先级可以排在前面。
视觉练习里最值得动手改的是迁移学习那段:把预训练主干的参数冻住,只训最后的分类头,然后逐步解冻几层再训,看准确率和训练时间怎么变。这个对照实验做一次,比看十篇讲 fine-tune 的文章都管用。NLP 那边则建议把分词器单独拎出来看,尤其是中文场景——课程示例以英文为主,换成中文语料后分词结果会和你直觉差很远,这个落差必须亲手体验一次。
2.4 遗传算法、强化学习与伦理:容易被跳过但面试常问的三块
剩下的三块内容经常被当成选修跳过,实际上各有各的用处。遗传算法那部分讲的是用种群、交叉、变异去搜一个解,练习通常是优化一个函数或者调一个简单策略,代码很轻,适合拿来理解“不用梯度也能做优化”这类思路。强化学习从多臂老虎机讲到 Q-learning,再到简单的环境交互,重点是回报设计和探索-利用平衡,不是把算法背下来。
伦理那一块在课程里是独立章节,讲偏见、隐私、可解释性和负责任的设计。这部分没有太多代码,但讨论题值得认真写一遍——真实项目里数据偏差导致模型在某些群体上表现差,是很常见的事,提前建立这个意识比事后补救便宜得多。
2.5 每课的四件套怎么排时间
每个主题基本是“预习材料 → 讲解 notebook → 实验/作业 → 课后测验”四件套。合理的节奏是:预习花 20 分钟扫一遍关键词,notebook 花 40 分钟边跑边改,实验花 1 到 2 小时自己写,测验 10 分钟用来暴露盲点。不要四件套全做满,也不要只跑 notebook 就过。
| 模块 | 核心技术点 | 练习产出 | 常见工程场景 |
|---|---|---|---|
| 导论与符号 AI | 状态搜索、知识表示 | 搜索算法解题脚本 | 规则引擎、路径规划 |
| 神经网络 | 反向传播、优化器 | 手写梯度 + Keras 对照 | 结构化数据分类 |
| 计算机视觉 | CNN、迁移学习 | 图像分类与微调实验 | 质检、识别类需求 |
| NLP | 分词、词向量、序列模型 | 文本分类 / 生成 | 舆情、工单归类 |
| 遗传算法 / 强化学习 | 种群搜索、Q-learning | 函数优化、简单环境 | 排程、策略调优 |
| AI 伦理 | 偏差、可解释性 | 案例分析 | 模型上线评审 |
注意:中文翻译分支有时滞后于主分支,个别 notebook 的说明和代码对不上。遇到描述和实际行为不一致,以代码和运行结果为准,别硬按文字改参数。
3. 本地环境搭起来:conda 加 Jupyter 的最小可跑配置
课程提供的 notebook 看着是“点一下就能跑”,但把所有模块的依赖装进同一个全局 Python,几乎必然打架:视觉那套要 OpenCV,NLP 那套要分词和向量库,强化学习又有自己的环境包,版本区间互相挤压。这一章的目标很明确——搭一个干净、可复现、能顺利跑完大部分 notebook 的环境,并把常见的路径和内核问题一次解决掉。
3.1 为什么建议独立环境而不是全局装
全局环境的问题不是“装不上”,而是“装上了但某天突然坏了”。你在全局装了 A 版本的数值库,另一个项目升级到 B 版本,回头再跑课程 notebook 就报符号找不到。用 conda 建独立环境,等于给这套课划了一块自留地,坏了直接删掉重建,不影响其他项目。
另一个理由是 Python 版本。深度学习框架对解释器版本有明确的支持区间,太新或太旧都会在二进制依赖上出问题。课程 notebook 在 Python 3.9 到 3.11 之间的兼容性比较稳,我一般固定用 3.10,既不会踩到新版本的坑,也不会因为太旧而装不上新包。
如果你机器上有 GPU,还要额外考虑驱动和框架版本的匹配。稳妥顺序是先建 CPU 环境把课跑通,确认代码逻辑没问题,再换成 GPU 版本重装框架,这样出问题时能立刻判断是环境问题还是代码问题。
3.2 环境创建与依赖安装
# 1) 建一个专用环境,Python 版本固定在 3.10 conda create -n ai4beg python=3.10 -y # 2) 激活环境 conda activate ai4beg # 3) 先装 Jupyter 相关,保证 notebook 能打开 pip install jupyter notebook nbconvert ipykernel # 4) 再装课程常用的计算与可视化依赖 pip install numpy pandas matplotlib scikit-learn # 5) 深度学习框架(CPU 版先跑通) pip install tensorflow # 6) 视觉与文本两块的补充依赖 pip install opencv-python nltk这段命令的顺序有讲究。先装 Jupyter 再装框架,是为了避免框架把某些底层依赖升到高版本、反过来把 notebook 服务搞崩。conda create里的-y是跳过确认,批量脚本里必加;-n ai4beg是环境名,后面注册内核时要和它保持一致,写错一个字母就会变成两个环境。
第 5 步装的是 CPU 版框架,体积小、装得快,适合先验证代码。等确认 notebook 能跑通,再按官方说明换成 GPU 版本,不要一上来就追求 GPU,否则报错信息会混在驱动问题里,很难分辨。
第 6 步里nltk装完之后还要单独下载语料数据,这一步经常被漏掉,导致跑 NLP 练习时报“资源找不到”。常见做法是在 notebook 开头加一句下载命令,或者提前在命令行执行一次,让数据落到默认缓存目录。
3.3 注册内核与路径检查
环境建好不等于 notebook 能用。Jupyter 启动时可能仍然指向系统解释器,表现就是明明装了框架,import还是报找不到。解决办法是把当前环境注册成一个独立内核。
# 把当前 conda 环境注册为 Jupyter 内核 python -m ipykernel install --user --name ai4beg --display-name "Python (ai4beg)" # 确认注册结果,输出里应该能看到刚写的名字 jupyter kernelspec list # 确认当前解释器位置,应该指向 conda 环境目录 python -c "import sys; print(sys.executable)"--name是内核的内部标识,--display-name是 notebook 界面上显示的名字,两个都写清楚,以后在 Kernel 菜单里一眼就能认出来。jupyter kernelspec list用来确认注册成功,如果列表里没有,多半是注册时用的 python 不是当前环境的。
第三行是排查利器。任何时候import报错,先跑这一句,看路径是不是落在envs/ai4beg下面。如果不是,说明 notebook 选错了内核,或者在错误的终端里启动了服务,先解决这个再谈别的。
还有一件容易被忽略的事:notebook 的工作目录是它自己所在的文件夹,不是仓库根目录。课程里很多练习用相对路径读数据,直接双击打开就可能找不到文件。我的习惯是从仓库根目录启动 Jupyter,然后在 notebook 里用pathlib基于文件位置拼路径,而不是靠当前工作目录碰运气。
from pathlib import Path # 以 notebook 文件自身位置为基准,向上找到数据目录 BASE = Path.cwd() DATA_DIR = BASE / "data" # 路径不存在时直接报出来,比让后续读取失败更容易定位 assert DATA_DIR.exists(), f"数据目录不存在: {DATA_DIR}" print("数据目录:", DATA_DIR.resolve())这段代码的核心是把“当前在哪”变成显式判断。Path.cwd()拿到当前目录,/运算符拼子路径,比字符串拼接更安全,Windows 和 Linux 都不用改。assert那一行是给自己留的后悔药:路径错了立刻停,而不是等到读文件时才抛一个看不出原因的异常。
3.4 数据集与离线准备
课程练习用的多是公开小数据集,框架自带的加载函数会在线拉取并缓存到用户目录下的隐藏文件夹。第一次跑会慢,之后走缓存就快了。如果所在网络环境不稳定,建议提前把数据文件准备好,放进缓存目录或者项目内的data/下,再把代码里的加载路径改成本地路径。
视觉练习里的图片数据集通常是按类别分文件夹存放,读的时候要注意目录层级和标签映射顺序。我见过最常见的错误是训练集和验证集的类别顺序不一致,模型训练时准确率看着挺高,一评估就塌——这种情况不是模型的问题,是数据组织的问题。稳妥做法是打印一次类别到索引的映射,确认两边完全一致再开始训练。
文本练习要额外注意编码。中文语料常见 UTF-8 和 GBK 混用,读进来先统一编码,再做清洗和分词,否则会出现一堆乱码字符混进词表,最后表现为模型效果莫名其妙地差。
4. 练习代码怎么改:从照抄 notebook 到跑出自己的对照实验
notebook 跑通只是起点。真正让这套课产生价值的,是把它里面的示例改成自己的实验:换数据、调参数、记录结果、对比差异。这一步做扎实了,课程就从“看过”变成“会做”。下面按从简到繁的顺序,讲四个可落地的改造动作。
4.1 先把 notebook 抽成可重复执行的脚本
notebook 适合探索,不适合反复跑。同一份代码改三次参数就要点三次全部运行,很容易漏掉某个单元格,得到的结果自己都说不清对应哪次配置。第一步改造是把它转成脚本,用命令行参数控制变量。
# 把 notebook 转成 Python 脚本,输出到同目录 jupyter nbconvert --to script lesson.ipynb # 批量执行一遍所有 notebook,用来做回归验证 jupyter nbconvert --to notebook --execute --inplace lesson.ipynb第一条命令生成一个同名.py文件,里面是带单元格分隔注释的连续代码,方便你删掉展示性内容、只保留训练逻辑。第二条是“执行但不改内容”的模式,--inplace表示把执行结果写回原文件;批量跑的时候去掉文件名、给一个目录,就能一次性检查所有 notebook 是否还能跑通。
转换之后建议做两件事:把绘图和打印砍掉大半,只留关键指标;把路径、超参、数据源提到文件开头,集中管理。这一步做完,后面改参数就是改几行常量,不用在几百行里翻。
4.2 改三个参数就能做一次消融实验
深度学习练习里最值得动手的是对照实验。不用一上来就改网络结构,先把学习率、批大小、训练轮数这三个参数动一遍,看损失曲线和最终指标怎么变。这个过程的收益远大于把模型精度从 0.97 抠到 0.98。
import numpy as np import tensorflow as tf from tensorflow import keras # 固定随机种子,保证同一组参数跑出来的结果可比 SEED = 42 np.random.seed(SEED) tf.random.set_seed(SEED) # 加载课程里常用的手写数字数据集,并做归一化 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() x_train = x_train.astype("float32") / 255.0 x_test = x_test.astype("float32") / 255.0 # 最简全连接网络,层宽和激活函数都可以作为消融变量 model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation="relu"), keras.layers.Dense(10, activation="softmax"), ]) # 学习率和批大小是本轮实验的两个自变量 model.compile( optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss="sparse_categorical_crossentropy", metrics=["accuracy"], ) history = model.fit( x_train, y_train, epochs=5, batch_size=64, validation_split=0.1, verbose=2, )代码本身不复杂,关键在于每一行的作用要清楚。归一化那两行把像素值压到 0 到 1,是让梯度处于合理量级的常规操作,去掉之后训练很容易发散。validation_split=0.1从训练集里切一成做验证,避免直接拿测试集调参。
learning_rate=1e-3是常见起点,调大十倍往往会出现损失剧烈震荡甚至变成 nan,调小十倍则收敛变慢但更稳。batch_size=64影响的是梯度噪声和显存占用,改小噪声大、收敛抖,改大更平滑但泛化可能变差。epochs=5只是够看趋势,真要比较收敛速度得拉到 20 轮以上,同时开早停。
做消融的正确姿势是一次只改一个变量,其余保持不动,跑完记下指标。三个参数两两组合就是九组实验,每组几分钟,一晚上能跑完,得到的是你自己对超参的直觉,而不是别人的结论。
4.3 把结果落成文件,而不是截图
跑完实验最容易犯的错是靠记忆和截图对比。过两天再回来看,根本分不清哪条曲线对应哪组参数。解决办法很简单:每次训练把配置和指标追加写进一个 CSV。
import csv import json from datetime import datetime from pathlib import Path LOG = Path("runs.csv") def log_run(cfg: dict, metrics: dict) -> None: """把一次实验的配置和最终指标追加到 CSV,方便事后排序对比""" row = { "time": datetime.now().isoformat(timespec="seconds"), "cfg": json.dumps(cfg, ensure_ascii=False), # 配置整体序列化,避免列数膨胀 **{k: round(float(v), 4) for k, v in metrics.items()}, } # 首次写入时补表头 new_file = not LOG.exists() with LOG.open("a", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=list(row.keys())) if new_file: writer.writeheader() writer.writerow(row)这里把配置整体塞进一列 JSON,是为了避免每加一个参数就要改表结构。round(float(v), 4)统一精度,防止浮点尾巴让对比变乱。newline=""是 Windows 下必加的参数,不加会出现空行。时间戳用 ISO 格式,排序即时间序。
有了这份 CSV,比较实验就不再靠眼睛:按准确率排序,看哪组参数最好;按时间排序,看改动带来的趋势。再进一步可以画一张散点图,横轴是训练时长,纵轴是验证准确率,性价比一目了然。
4.4 视觉和文本两课的改造点不一样
视觉练习的改造重点在迁移学习。把预训练主干的trainable设为False,只训分类头,记一组指标;再解冻最后几层继续训,再记一组。两次的差异能直观告诉你“预训练特征值不值钱”。注意解冻之后学习率要调小一个量级,否则预训练权重会被冲掉。
文本练习的改造重点在分词和序列长度。课程示例用英文,词表小、切分规则简单;换成中文语料后,分词粒度直接决定词表大小和序列长度。maxlen设太短会截掉关键信息,设太长则大部分位置是填充,浪费算力还稀释信号。我的做法是先统计句子长度分布,取覆盖九成样本的分位数作为maxlen,比拍脑袋定一个数靠谱。
两块都别忘了固定种子。视觉里还有数据增强,增强本身带随机性;文本里有权重初始化和 dropout,同样随机。种子不固定,同一份代码两次跑出来的指标能差一两个点,这时候讨论参数好坏没有意义。
5. 跑不通先看这里:五类高频翻车与排查路径
环境和代码的问题,九成集中在几个固定位置。下面这五条是反复遇到的,按“现象 → 原因 → 解决”写清楚,遇到时按顺序对号入座,比漫无目的地搜报错快得多。
5.1 框架装上了,import 却报二进制加载失败
现象:pip install显示成功,进入 Python 执行import tensorflow时报动态库加载失败,或者提示某个 DLL 找不到。
原因:多半是解释器版本与框架的预编译包不匹配,或者系统缺少运行库。在 32 位解释器上装 64 位包也会出现同类报错。另一个常见来源是环境里同时存在多个版本的同名包,加载到了错误的那个。
解决:先确认解释器位数和版本,用python -c "import platform; print(platform.architecture(), platform.python_version())"看一眼。确认无误就删掉环境重建,别在坏环境里反复重装——重装往往只是把冲突换了个位置。系统层面的运行库缺失,按框架官方说明补齐即可。
5.2 notebook 里选不到刚建的环境
现象:终端里conda activate之后一切正常,打开 notebook 却在 Kernel 菜单里找不到对应名字,或者选了之后仍然报“模块不存在”。
原因:Jupyter 服务是在另一个环境里启动的,它只认注册过的内核,不认当前激活的 conda 环境。另一种情况是注册时用错了 python,把系统解释器注册进去了。
解决:回到目标环境执行python -m ipykernel install --user --name ai4beg --display-name "Python (ai4beg)",然后用jupyter kernelspec list确认。还不行就检查 notebook 里import sys; print(sys.executable)的输出,路径不对就说明内核选错了。
5.3 代码没改,数据却读不到
现象:示例代码在自己机器上跑,报文件不存在,路径看着没问题。
原因:notebook 的工作目录是它所在文件夹,而不是仓库根目录。课程里不少练习写的是相对根目录的路径,直接打开就错位了。Windows 上的反斜杠和中文目录名也会加剧这个问题。
解决:统一用pathlib基于文件位置拼路径,并在读取前加一次存在性断言。目录名尽量用英文,必须用中文时确保全程 UTF-8。启动 Jupyter 时从仓库根目录起,能省掉大部分路径错位。
5.4 图表里的中文变成方块
现象:画图时标题和坐标轴标签里的中文显示为方框,负号也变成方块。
原因:绘图库的默认字体不含中文字形,遇到中文就回退成占位符。负号问题是另一套配置,默认用了 Unicode 减号,某些字体里没有这个字形。
解决:显式指定一个系统里存在的中文字体,并把负号关掉。
import matplotlib.pyplot as plt # 指定中文字体,名字必须是系统里真实安装的 plt.rcParams["font.sans-serif"] = ["SimHei", "Noto Sans CJK SC", "WenQuanYi Zen Hei"] plt.rcParams["axes.unicode_minus"] = False # 关闭 Unicode 负号,避免显示成方块列表里放多个候选字体,按顺序回退,跨平台时不用改代码。字体名写错不会报错,只会静默失效,所以设完要实际画一张带中文的图验证一次。
5.5 训练跑完,损失不降或者直接变成 nan
现象:fit正常结束,但损失曲线几乎是一条水平线,或者几轮之后突然跳到 nan。
原因:常见三种。输入没归一化,像素值在 0 到 255 之间,梯度量级失控;学习率偏大,一步跨过最优点;标签和输出维度对不上,损失函数算出异常值。
解决:按顺序排查。先打印一个 batch 的输入范围,确认已经缩放到合理区间;再把学习率降一个量级重跑;最后检查输出层单元数和标签最大值是否一致。三者都排除后,再看是不是数据里有空值或异常样本。
提示:任何一次“结果不对”的排查,都先跑一遍最小可复现样例——单 batch、单轮、关掉数据增强。能在这个最小配置下复现问题,定位速度会快很多。
6. 把课程作业变成能拿出手的工程件:三条验证路径
课程跑通之后,多数人会停在“我都看过了”这一步。区别在于有没有做验证:能不能证明自己改的东西真的有效。我一般用三条路径来验证,成本从低到高,收益也递增。
| 验证方式 | 具体动作 | 判定标准 | 大致耗时 |
|---|---|---|---|
| 复现性验证 | 固定种子连跑两次同一配置 | 两次指标差异在千分位内 | 20 分钟 |
| 对照验证 | 只改一个超参,其余不动 | 能说清指标变化的方向和幅度 | 1 到 2 小时 |
| 迁移验证 | 换成自己的数据重跑整条链路 | 流程无改动,仅替换数据与路径 | 半天 |
第一条最容易被忽略,但它是后面两条的前提。种子不固定,你根本不知道指标波动来自参数还是随机性。第二条是训练直觉的核心,一次只动一个变量,把结果记进 CSV,几轮下来你对学习率和批大小的敏感度就有了。第三条最能暴露问题:课程数据是清洗好的,换成自己的数据后,缺失值、类别不平衡、编码混乱会一个接一个冒出来,这些才是真实项目里的主要工作量。
自动化这块,我会用一条命令把所有 notebook 执行一遍,作为改动后的回归检查。
# 执行目录下所有 notebook,出错即中断,用于改动后的回归验证 jupyter nbconvert --to notebook --execute --inplace \ --ExecutePreprocessor.timeout=600 \ --ExecutePreprocessor.kernel_name=ai4beg \ lessons/*.ipynb--ExecutePreprocessor.timeout=600把单格超时放宽到十分钟,训练类 notebook 默认超时经常不够。kernel_name显式指定,避免用到系统内核。--inplace会把输出写回原文件,所以跑之前先提交一次版本,出问题能回滚。
血泪经验是:不要在所有 notebook 都改完之后才跑这条命令。改一个跑一个,报错范围小、定位快。等积累到十几个再一起跑,你会同时面对一堆互相掩盖的错误,排查时间翻好几倍。
从那以后我每次动课程代码,哪怕只改了一个学习率,也会先把最小配置跑一遍、把结果写进 CSV,再谈别的。这个习惯看着笨,但省下的返工时间最多。希望帮到你。
本文还有配套的精品资源,点击获取