TensorFlow 与深度学习 (3) 训练神经网络

我们首先来观察一个正在训练的神经网络。代码会在下一节解释,所以现在不必查看。

我们的神经网络可以输入手写数字并对它们进行分类,即,将它们识别为 0、1、2……9。它基于内部变量(“权重(weights)”和“偏差(bias)”,会在后面进行解释),需要得到正确的值,分类才能正常工作。这个“正确的值”通过训练过程进行学习,这也将在后面详细解释。你现在需要知道的是,训练回路看起来像这样:

1
Training digits => updates to weights and biases => better recognition (loop)

让我们逐个通过可视化的六个面板,了解训练神经网络需要什么。

你可以看到训练数字每次 100 个被送入训练回路;也可以看到当前训练状态下的神经网络是已将数字正确识别(白色背景)还是误分类(红色背景,左侧印有正确的标示,每个数字右侧印有计算错误的标示)。

此数据集中有 50,000 个训练数字。我们在每次迭代(iteration)中将 100 个数字送入训练循环中,因此系统将在 500 次迭代之后看到所有训练数字一次。我们称之为一个「epoch」。

为了测试在现实条件下的识别质量,我们必须使用系统在训练期间从未看过的数字。否则,它可能记住了所有的训练数字,却仍无法识别我刚才写的「8」。MNIST 数据集包含了 10,000 个测试数字。此处你能看到每个数字对应的大约 1000 种书写形式,其中所有错误识别的数字列在顶部(有红色背景)。左边的刻度会给你一个粗略的分辨率精确度(正确识别的数字所占的百分比)。

为了驱动训练,我们来定义损失函数,即一个展示出系统数字识别能力有多糟的值,并且系统会尽力将其最小化。损失函数(loss function,此处为「交叉熵」)的选择稍后会做出解释。你会看到,随着训练的进行,训练和测试数据的损失会减少。这是个好现象,说明神经网络正在学习。X 轴表示了学习过程中的迭代。

准确度(Accuracy)是正确识别的数字的百分比,是分别在训练和测试集上计算出的。如果训练顺利,它会一直上升。

最后的这两幅图表说明了内部变量取值的扩展,即随训练进行而变化的 weight 和 bias。比如偏置从 0 开始,且最终得到的值大致均匀地分布在-1.5 和 1.5 之间。如果系统不能很好地收敛,那么这些图能帮到你。如果你发现 weight 和 bias 扩展到上百上千,那很可能出问题了。

图中的条带为百分数,一共有 7 条带,所以每条带代表所有参数的 100/7 = 14%。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
可视化 GUI 的键盘快捷键

1 ......... 仅显示第 1 张图
2 ......... 仅显示第 2 张图
3 ......... 仅显示第 3 张图
4 ......... 仅显示第 4 张图
5 ......... 仅显示第 5 张图
6 ......... 仅显示第 6 张图
7 ......... 显示 1 和 2 图
8 ......... 显示 4 和 5 图
9 ......... 显示 3 和 6 图
ESC or 0 .. 恢复为显示所有图
Space ..... 暂停/继续
O ......... 框缩放模式(然后使用鼠标)
H ......... 重置所有缩放
Ctrl-S .... 保存当前图像

什么是权重(weight)和偏置(bias)?“交叉熵”又是如何被计算的?训练算法究竟是如何工作的?请到下一部分一探究竟。