neural-networks-and-deep-learning
Michael Nielsen 经典教材《Neural Networks and Deep Lear
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Michael Nielsen 经典教材《Neural Networks and Deep Lear
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:2015年,你刚刚听说"深度学习"这个词,觉得它神秘又遥远。有人在互联网上贴出一本免费电子书籍,手把手教你从零写出一个能识别手写数字的神经网络。你跟着敲代码,突然屏幕上跳出"Accuracy: 98%"——那一刻,机器仿佛"看见"了你在写什么。
这就是 mnielsen/neural-networks-and-deep-learning 所做的事情:它不是一份发布后无人问津的冷门代码,而是与一本影响了数十万读者的经典教材深度绑定的学习伴侣。
Michael Nielsen 是一位计算机科学家和作家,曾在 Yahoo! 实验室、索尼娱乐任职,现为独立研究员与作家。他的写作风格以"让复杂概念变得直觉可触"著称。与许多学术著作不同,他的书《Neural Networks and Deep Learning》从第一页起就坚持一个原则:读者不需要深厚的数学背景,也能理解神经网络究竟在做什么。
这本出版于 2015 年的书籍,是深度学习浪潮早期最具影响力的入门读物之一。它比大多数商业课程更早、更系统地讲解了反向传播(Backpropagation)、卷积神经网络(CNN)、过拟合(Overfitting)与正则化等核心概念。十年后的今天,PyTorch、TensorFlow 已迭代无数版本,而这本教材依然在 AI 学习社区中流传,因为它的核心是教会你"理解",而非追赶框架版本号。
图1:MNIST手写数字数据集示例。仓库中的 mnist_loader.py 负责加载这一经典数据集,network.py 负责构建和训练网络。
这个仓库包含三版核心实现,恰好映射了神经网络教学的三层递进:
第一代:network.py(Python 2 风格)
这是最原汁原味的教学代码。约 200 行,用纯 NumPy 实现了一个全连接前馈神经网络,核心是随机梯度下降(SGD)和反向传播算法。代码写得极尽清晰,每个类、每个方法都有详细注释。作者在文件头部写道:"我专注于让代码简单、易读、易修改。它不是最优化的,也省略了许多理想特性。"
这种"透明优先"的设计哲学贯穿整个仓库。比如 backpropagation 的实现,没有借助任何高级框架,而是把矩阵运算拆开,一步步展示梯度是如何从输出层"反向"传播回输入层的。这是理解深度学习的最佳路径之一——不是调用 model.fit(),而是亲手写出每一步矩阵乘法和激活函数。
图2:过拟合现象。训练损失持续下降,验证损失却开始上升——这是神经网络学习中经典且必须解决的问题。
第二代:network2.py(引入代价函数与正则化)
network2.py 在 network.py 基础上增加了三个重要改进:
交叉熵代价函数(Cross-Entropy Cost):相比二次代价,交叉熵在 sigmoid 输出层能更快地推动学习——当网络犯错时,学习信号更强。这一点对于初学者理解"为什么这个损失函数更好"极有价值。
L2 正则化(权重衰减):防止过拟合的核心技术之一。network2.py 展示了当训练数据有限时,如何通过惩罚大权重来提升泛化能力。
更好的权重初始化:使用均值为 0、方差为 1/sqrt(n_in) 的高斯分布初始化,比原始随机初始化更稳定。
图3:正则化后训练效果对比。实线为加正则化的结果,虚线为无正则化。可以清楚看到正则化如何抑制过拟合。
第三代:network3.py(引入 Theano + GPU 加速 + CNN)
这是功能最强大、也是最具时代局限性的版本。它基于 Theano(已被 PyTorch/JAX 取代的深度学习框架),引入了:
然而,network3.py 的时代烙印也最深。它要求 Theano 0.6 或 0.7,而 Theano 于 2017 年正式停止维护,现代环境几乎无法直接运行此版本。作者明确表示"不会为新版 Theano 做适配"。
仓库 data/mnist.pkl.gz 包含经典的 MNIST 数据集:60,000 张训练图像 + 10,000 张测试图像,每张是 28x28 像素的手写数字(0-9)。这是深度学习领域历史最悠久、最经典的基准数据集。
图4:MNIST数据集中的手写数字样例。神经网络的任务是:从这些模糊的像素图案中学会识别出对应的数字。
此外,仓库还包含了用于 SVM 和平均亮度(Average Darkness)方法的基准实现(mnist_svm.py、mnist_average_darkness.py),让读者直观对比:为什么神经网络比传统机器学习方法更强——简单 SVM 在 MNIST 上的准确率约 98%,而 CNN 可以轻松超过 99%。
仓库的 fig/ 目录包含大量数据可视化 Python 脚本,每个脚本对应书籍某一章的图示。核心概念包括:
梯度消失与不稳定梯度(Unstable Gradients)
深层网络训练困难的原因之一是梯度逐层乘以权重,连乘效应导致早期层梯度趋近于零(消失)或爆炸(爆炸)。fig/more_data.py 用实验展示了:数据量越多,不稳定梯度问题越能被缓解。
图5:更多训练数据有助于缓解深度网络中的梯度不稳定问题。这张图来自书籍第三章的实验数据可视化。
局部极小值 vs 鞍点
早期研究者曾担心:神经网络优化是否会陷入局部极小?Nielsen 在书中用实验数据说明:高维空间中的"局部极小"实际上往往是鞍点(saddle point),真正阻碍训练的是 plateau(高原)和峡谷(ravine)而非局部极小。fig/false_minima.py 生成了相关可视化数据。
图6:高维优化景观中的鞍点示意图。真正的问题不是陷入局部极小,而是过于平坦的梯度高原和狭窄的峡谷。
学习率与优化轨迹
fig/valley.py 和 fig/misleading_gradient.py 分别展示了两个经典陷阱:
图7:学习率设置过大时,优化器在 Loss 曲面上剧烈震荡,无法收敛到最优解。
图8:误导性梯度现象。梯度指向的方向看起来是下山方向,但实际上指向的是曲率较大的区域,导致学习效率极低。
优点:
局限与风险:
xrange、无括号 print),Python 3 环境需手动调整深度学习框架越来越"傻瓜化",写一个图像分类模型只需要 10 行 PyTorch 代码。但这反而凸显了本书的不可替代性:当一切变得太容易时,理解"背后发生了什么"变得更加珍贵。
读完这本书和这个仓库,你将获得一个绝大多数"调参工程师"缺乏的东西:关于反向传播、梯度消失、卷积运算的第一性原理理解。这不是一份用来部署到生产环境的代码,而是一份让你真正理解 AI 在做什么的学习工具。
如果你正在学习 PyTorch 或 TensorFlow,先花两周时间把这个仓库跑通,你会发现后续学习效率大幅提升——因为你已经知道 loss.backward() 背后,梯度是如何一步步计算并更新的。
| 指标 | 数值 |
|---|---|
| GitHub Stars | 17,674 |
| Forks | 7,048 |
| 主语言 | Python |
| 核心文件 | network.py, network2.py, network3.py |
| 依赖框架 | NumPy, SciPy, scikit-learn, Theano |
| 默认分支 | master |
| 创建时间 | 2012年11月 |
| 最新推送 | 2024年6月(主要是文档更新) |
推荐阅读方式:克隆仓库,安装 requirements.txt 中的依赖(Python 2.7 环境),对照书籍第一章至第五章,边读边跑代码。network3.py 的 CNN 实验建议在 GPU 环境下运行,效果更直观。