学习如何编写神经网络代码

2025-06-10

学习如何编写神经网络代码

这是我在短时间内尝试学习新知识的系列文章的第二篇。第一篇是关于如何在一周内学习机器学习。

这次我尝试学习神经网络。虽然由于各种原因,我没能在一周内完成,但2015年整个夏秋两季,我对它有了基本的了解。

我所说的基本理解是指我终于知道如何自己从头开始编写简单的神经网络代码。

在这篇文章中,我将给出一些解释并指导您使用我使用的资源,以防您有兴趣自己做这件事。

步骤 1:神经元和前向传播

那么什么是神经网络?我们先从网络部分开始,先了解一下单个神经元。

神经元就像一个函数;它接受一些输入并计算输出。

下图中的圆圈表示一个人工神经元。它的输入为 5,输出为 1。输入是连接到该神经元的三个突触的总和(左侧的三个箭头)。

在最左边,我们看到两个输入值和一个偏差值。输入值为 1 和 0(绿色数字),偏差值为 -2(棕色数字)。

这里的输入可能是两个不同特征的数值表示。如果我们正在构建一个垃圾邮件过滤器,它可能是邮件是否包含多个大写单词,以及是否包含单词“viagra”。

然后将这两个输入乘以所谓的权重,即 7 和 3(蓝色数字)。

最后,我们将其与偏差相加,得到一个数字,在本例中为:5(红色数字)。这就是我们人工神经元的输入。

然后,神经元对这个数字进行某种计算——在我们的例子中是 Sigmoid 函数,然后输出一个输出。这个输出恰好是 1,因为如果我们将数字向上舍入,则 5 的 Sigmoid 函数等于 1(稍后将详细介绍 Sigmoid 函数)。

如果这是一个垃圾邮件过滤器,那么我们输出 1(而不是 0)可能意味着神经元将文本标记为“垃圾邮件”。

来自[维基百科](https://en.wikipedia.org/wiki/Artificial_neural_network)的神经网络插图
来自维基百科的神经网络插图

如果将这些神经元网络连接在一起,就会得到一个神经网络,它会向前传播——从输入输出,通过突触相互连接的神经元,就像左边的图像一样。

我强烈推荐YouTube 上的 Welch Labs 视频,以便更直观地解释这一过程。

第 2 步:理解 Sigmoid 函数

看完 Welch Labs 的视频后,最好花一些时间观看Coursera 机器学习课程的第四周,该课程涵盖神经网络,因为它可以让您更直观地了解它们的工作原理。

这门课程数学性很强,基于 Octave,而我更喜欢 Python。因此,我没有做编程练习,而是通过视频来帮助我理解需要学习的内容。

我意识到需要进一步研究的第一件事是 Sigmoid 函数,因为它似乎是许多神经网络的关键部分。我对这个函数略知一二,因为它在同一门课程的第三周也讲过。所以我回去又看了一遍这些视频。

Sigmoid 函数只是将您的值(沿水平轴)映射到 0 到 1 之间的值。
Sigmoid 函数只是将您的值(沿水平轴)映射到 0 到 1 之间的值。

但看视频并不能完全理解。为了真正理解它,我觉得我需要从头开始编写代码。

因此我开始从头开始编写逻辑回归算法(恰好使用了 Sigmoid 函数)。

我花了一整天的时间,而且这可能不是一个非常好的逻辑回归实现。但这没关系,因为我终于明白了它的工作原理。点击此处查看代码。

您不需要自己完成整个练习,因为它需要一些有关成本函数和梯度下降的知识,而您现在可能还没有这些知识。

但请确保您了解 Sigmoid 函数的工作原理。

步骤3:理解反向传播

理解神经网络从输入到输出的工作原理并不难,至少从概念上来说是这样。

但更困难的是理解神经网络如何通过查看一组数据样本进行实际学习。

这个概念被称为反向传播。

这本质上意味着您查看网络猜测的错误程度,然后相应地调整网络权重。

权重是文章开头我们神经元上的蓝色数字。

该过程是向后进行的,因为您从网络的末端开始(观察网络“猜测”的错误程度),然后在网络中向后移动,同时调整权重,直到最终到达输入。

手工计算需要一些微积分知识,因为它涉及到对网络权重求导。卡恩学院的微积分课程看起来是个不错的入门课程,不过我自己没用过,因为我在大学学过微积分。

注意:有很多库可以为您计算导数,因此如果您想在完全理解数学之前开始编写神经网络代码,那么您也可以这样做。

截图来自 Matt Mazurs [反向传播教程](http://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/)
来自 Matt Mazurs关于反向传播的教程的截图。

我发现理解反向传播的三个最佳来源是:

你绝对应该边读文章边写代码,尤其是前两篇。这样以后遇到困惑的时候,你就能找到一些示例代码来参考。

另外,我再怎么强调这一点也不为过:

通过阅读有关神经网络的知识你不会学到很多东西,你需要通过练习才能记住这些知识。

第三篇文章也很棒,但我更多地把它当作wiki而不是简单的教程,因为它实际上是一本完整的书。它对神经网络中所有重要的概念进行了详尽的解释。

这些文章还将帮助您理解成本函数和梯度下降等重要概念,它们在神经网络中发挥着同样重要的作用。

步骤 4:编写自己的神经网络

在一些文章和教程中,你实际上会编写小型神经网络。一旦你适应了这一点,我建议你全力以赴地学习这个策略。这既有趣,又是一种非常有效的学习方法。

我从IAmTrask的《11行Python代码实现神经网络》这篇文章中也学到了很多东西。它仅用11行代码就包含了海量的知识和概念。

来自 [IAmTrask 教程](https://iamtrask.github.io/2015/07/12/basic-python-network/) 的截图
IAmTrask 教程 截图

按照这个示例编写代码后,你应该按照文章底部的步骤操作,也就是不看教程再实现一遍。这会迫使你真正理解这些概念,并且很可能会暴露出你知识上的漏洞,这并不好玩。然而,当你最终完成它时,你会感觉自己获得了一项新的超能力。

补充一点:做练习的时候,我经常被一些教程使用的矢量化实现搞糊涂,因为这需要一点线性代数知识才能理解。我又一次回到Coursera的机器学习课程,因为第一周包含了完整的线性代数复习部分。这有助于理解矩阵和向量在网络中是如何相乘的。

完成此操作后,您可以继续阅读Denny Britz编写的Wild ML 教程,该教程将指导您完成更强大的神经网络。

来自 [WildML 教程](http://www.wildml.com/2015/09/implementing-a-neural-network-from-scratch/) 的屏幕截图。
WildML 教程 的屏幕截图

此时,你可以尝试从头开始编写自己的神经网络,也可以尝试使用一些已经编写好的网络。找到你感兴趣的数据集,并尝试用你的神经网络进行预测,这非常有趣。

重点是,你现在最好尝试自己感兴趣的东西,而不是听从我的建议。

就我个人而言,我目前正在学习如何使用 Python 库来简化神经网络的编写,比如 Theano、Lasagne 和 nolearn。我正在用它们在Kaggle上进行挑战,这既有趣又能学到很多东西。

祝你好运!

如果您喜欢这篇文章,请不要忘记点击爱心按钮 :)

感谢阅读!我叫 Per,是Scrimba的联合创始人,我热爱帮助人们学习新技能。如果您想与我保持联系,请在TwitterInstagram上关注我。

鏂囩珷鏉ユ簮锛�https://dev.to/scrimba/learning-how-to-code-neural-networks-1mek
PREV
想学习 React.js 吗?这是我的免费课程,通过构建一个聊天应用来讲解。
NEXT
5分钟学会CSS变量