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 | 可视化 GUI 的键盘快捷键 |
什么是权重(weight)和偏置(bias)?“交叉熵”又是如何被计算的?训练算法究竟是如何工作的?请到下一部分一探究竟。