回到上一篇 了解机器学习(深度学习)的几个特点
本文目的是通过深度学习的“Hello World”,向读者展示神经网络的训练过程,是用不那么技术化的文字帮你建立对神经网络的直觉。我们将避免使用数学符号,因为数学符号可能会令没有任何数学背景的人反感,而且对解释问题也不是绝对必要的。本文真正目的不是要解决什么手写识别问题,而是通过这个小小的例子引出深度学习后面你需要了解和掌握的知识技术范围。
问题描述
我们这里要解决的问题是,将手写数字的灰度图像(28 像素×28 像素)划分到 10 个类别中(0~9)。我们将使用 MNIST 数据集,它是机器学习领域的一个经典数据集,其历史几乎和这个领域一样长,而且已被人们深入研究。这个数据集包含 60 000 张训练图像和 10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 MNIST 中 的 NIST)在20世纪80年代收集得到。你可以将“解决”MNIST 问题看作深度学习的“Hello World”,正是用它来验证你的算法是否按预期运行。当你成为机器学习从业者后,会发现MNIST一次又一次地出现在科学论文、博客文章等中。在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某个样本对应的类叫作标签(label)
下图给出了 MNIST 数据集的一些样本。
深度学习的“套路”
套用一句流行术语,套路来说,深度学习解决问题的原理或”套路“如下图所示:
上图是深度学习解决问题的大致流程,不管神经网络深度(层数)有多深,都基本是这个流程。从简单的训练权重网络、到加入损失函数到神经网络、到加入优化器到完整神经网络处理流程。
深度学习训练的最终目的是得到一个合适的权重,而要计算出权重需要构建神经网络、选择损失函数、优化器、学习效率以及激活函数等,这些都是为最终训练出合适的权重,简单来说就是这样。
构建神经网络的核心组件是层(layer),它可以把它理解为是一种数据处理模块,看成数据过滤器。进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示
——我们期望这种表示
有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏
(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的 数据过滤器(即层)。经典的卷积神经网络,如VGG,AlexNet,ResNet,GoogleNet,都有较深较复杂的网络结构。
MNIST深度网络构建
按照上述的“套路”,首先构建神经网络,本例设计网络包含 2 个 Dense 层,它们是密集连接(也叫全连接)的神经层。第二层(也是最后一层)是一个 10 路 softmax 层,它将返回一个由 10 个概率值(总和为 1)组成的数组。 每个概率值表示当前