作者:夏落,本文内容翻译自jalammar的高赞文章
神经网络基础之可视化和交互式指南
我不是机器学习专家。我只是一个受过训练的软件工程师,我很少和人工智能打交道。我一直想钻研更深入的机器学习,但从来没有真正找到“in”。这就是为什么2015年11月谷歌开源TensorFlow的时候,我非常兴奋,知道是时候开始学习了。听起来不太戏剧化,但对我来说,这实际上有点像普罗米修斯从机器学习的奥林匹斯山把火传给人类。在我的脑海里浮现出这样一个想法:当谷歌研究人员发布他们的Map Reduce论文时,整个大数据领域和Hadoop等技术都得到了大大的加速。这一次,这不是一篇论文,而是经过多年的发展,他们在内部使用的软件。
因此,我开始尽我所能地学习这个主题的基础知识,并意识到需要为在这个领域没有经验的人提供更温和的资源。这是我的尝试。
让我们从一个简单的例子开始。假设你在帮助一个想买房的朋友。她以40万美元的价格买了一栋2000平方英尺(185米)的房子。这个价格合适吗?
没有参照系是不容易判断的。所以你问你的朋友谁在同一个社区买了房子,你最终得到三个数据:
Area (sq ft) (x) | Price (y) |
|---|---|
2,104 | 399,900 |
1,600 | 329,900 |
2,400 | 369,000 |
就我个人而言,我的第一反应是得到每平方英尺180美元的平均价格。
欢迎来到你的第一个神经网络!现在它还没有达到Siri的水平,但是现在你知道了基本的构建块。看起来是这样的:

像这样的图表向我们展示了网络的结构以及它是如何计算预测的。计算从左侧的输入节点开始。输入值向右流动。它乘以权重,结果就是我们的输出。
把2000平方英尺乘以180就得到36万美元。预测的计算是简单的乘法运算。但在那之前,我们需要考虑我们将要乘以的权重。这里我们从一个平均值开始,稍后我们将研究更好的算法,它可以随着我们得到更多的输入和更复杂的模型而扩展。找到权重是我们的“训练”阶段。所以,每当你听说有人“训练”神经网络时,就意味着找到我们用来计算预测的权重。

这是一种预测。这是一个简单的预测模型,它接受一个输入,进行一个计算,并给出一个输出(因为输出可以是连续值,所以我们的technical名称是“回归模型”)
让我们将这个过程形象化(为了简单起见,让我们将价格单位从1美元切换到1000美元)。现在我们的重量是0.180而不是180):

我们能做得比根据我们数据点的平均值来估计价格更好吗?让我们试试。让我们先来定义在这种情况下做得更好意味着什么。如果将我们的模型应用到我们拥有的三个数据点上,它可以做到多好?

有点黄了。黄色不好。黄色表示错误。我们想尽量缩小黄色。
Area (x) | Price ($1000) (y_) | Prediction (y) | y_-y | (y_-y)² |
|---|---|---|---|---|
2,104 | 399.9 | 379 | 21 | 449 |
1,600 | 329.9 | 288 | 42 | 1756 |
2,400 | 369 | 432 | -63 | 3969 |
Average: | 2,058 | |||
在这里我们可以看到实际价格,预测价格,以及它们之间的差异。然后我们需要平均这些差异,这样我们就有了一个数字,告诉我们这个预测模型有多大的误差。问题是,第三行的值是-63。如果我们想用预测值和价格之间的差异作为误差度量标准,就必须处理这个负值。这就是为什么我们要引入一个额外的列来显示误差平方,从而去掉负值。
这就是我们对“做得更好”的定义——更好的模型就是误差更小的模型。误差被测量为我们数据集中每个点的平均误差。对于每个点,通过实际值和预测值之间的差值来衡量误差,并提高到2的幂次方。这称为均方误差(mse)。以它为指导来训练我们的模型并使之成为我们的损失函数(也就是成本函数)。
既然我们已经定义了一个更好的模型的度量标准,让我们用更多的权重值进行实验,并将它们与我们的平均选择进行比较:

我们的线可以更好地近似我们的值,现在我们将这个值添加到公式中。在这种情况下,我们称之为“bias”。这使得我们的神经网络看起来像这样:

我们可以这样来概括,一个神经网络有一个输入和一个输出(spoiler warning:没有隐藏层)如下所示:

在这个图中,W和b是我们在训练过程中发现的值。X是我们插入公式中的输入(在我们的例子中,面积以平方英尺为单位)。Y是预测价格。
计算预测现在使用以下公式:

因此,我们当前的模型通过插入房屋面积x来计算预测,在这个公式中:

你试试训练我们的玩具神经网络怎么样?通过调整权重和偏差刻度盘来最小化损失函数。你能得到低于799的误差值吗?

恭喜你手动训练了你的第一个神经网络!让我们看看如何自动化这个训练过程。
下面是另一个带有autopilot-like功能的例子。这些是GD步骤按钮。他们使用一种称为“梯度下降”的算法,试图逐步走向正确的权重和偏差值,以最小化损失函数。

这两个新的图表可以帮助在处理模型的参数(权重和偏差)时跟踪错误值。跟踪错误是很重要的,因为训练过程都是为了尽可能减少这种误差。
梯度下降法知道它的下一步应该在哪里?知道我们要最小化的函数(我们的损失函数,所有数据点的的平均值),并且知道它当前输入(当前的权重和偏差),损失函数的导数告诉我们为了最小化误差,向哪个方向推和。
房子的大小是决定房价的唯一变量吗?显然还有很多其它因素。我们再加一个变量,看看如何调整我们的神经网络。
假设你的朋友做了更多的研究,发现了更多的数据点。她还发现每间房子有多少个浴室:
Area (sq ft) (x1) | Bathrooms (x2) | Price (y) |
|---|---|---|
2,104 | 3 | 399,900 |
1,600 | 3 | 329,900 |
2,400 | 3 | 369,000 |
1,416 | 2 | 232,000 |
3,000 | 4 | 539,900 |
1,985 | 4 | 299,900 |
1,534 | 3 | 314,900 |
1,427 | 3 | 198,999 |
1,380 | 3 | 212,000 |
1,494 | 3 | 242,500 |
带有两个变量的网络如下:

我们现在必须找到两个权重(每个输入一个)和一个偏差来创建新模型。
计算Y如下所示:

但是我们怎么找到w1和w2呢?这比我们只需要担心一个权重的时候要复杂一些。有一个额外的浴室会在多大程度上改变我们对房子价值的预测?
试着找出正确的权重和偏差。您将从这里开始看到,随着输入变量的增加,模型更复杂。我们开始失去创建简单2d形状的能力,这些形状可以让我们一眼就看到模型。相反,当我们调整模型参数时,我们必须主要依赖于误差值是如何变化的。

直接使用梯度下降即可。
现在我们已经看了具有一个和两个特征的神经网络,我们还可以想办法添加额外的特征,并使用它们来计算得到预测。权重的数量将继续增长,我们的梯度下降的实现将不得不在添加每个特征时进行调整,以便它可以更新与新特征相关联的新权重。
这里需要注意的是,我们不会盲目地向网络提供我们所知道的关于我们的examples的所有信息。我们必须有选择性地选择哪些特性提供给模型。特征选择/处理是一个完整的学科,有自己的一套最佳实践和考虑因素。如果您想查看一个示例,说明如何检查数据集以选择哪些特性来为预测模型提供数据,请查看泰坦尼克号之旅。
参考文献