这一章告诉你如何用TensorFlow构建简单的机器学习系统。第一部分回顾构建机器学习系统的基础特别是讲函数,连续性,可微性。接着我们介绍损失函数,然后讨论机器学习归根于找到复杂的损失函数最小化的点的能力。我们然后讲梯度下降,解释它如何使损失最小。然后简单的讨论自动微分的算法思想。第二节侧重于介绍基于这些数学思想的TensorFlow概念。包括placeholders, scopes, optimizers,和TensorBoard, 并实际构建和分析学习系统。最后一节研究如何用TensorFlow训练线性和逻辑回归模型。这一章较长,并介绍许多新的思想。如果你不想了解每一个细节,你可以继续往下读然后在必要时返回来。在后面我们将重复这些基础。
1.函数的数学回顾
第一节回顾概念上理解机器学习所需要的数学工具。我们尽量减少希腊符号侧重概念上的理解而不是技术操作。
在我们讨论的大部分问题里,我们的任务是创建数学函数:
y = f( x)
注意, x和y写成黑体。这提示它们是向量。这个函数可以有任意数量的输入,可以是上百个甚致是上百万个,它的输出也可以是许多个。你想创建的函数的例子有:
• x 包含图像里所有像素的色彩。 如果图像包含猫f(x)等于 1,如果不包含猫则等于0。
• 同上面一样,f( x)应该是数字的向量。第一个数字表示图像包含猫,第二个数字表示图像包含狗,第三个数字表示它包含飞机,等等上千个对象。
• x 包含染色体的 DNA序列。 y 是向量它的长度等于染色体的碱基数量。如果那个碱基编码某个蛋白质则对应元素应为1,否则为0。
• x 描述分子的结构。 (后面我们讨论各种呈现分子的方法) y应为向量每个元素描述一些分子的特理特征:是否易溶于水,是否与某些分子强列结合等。
如你所见,f(x)可以是非常非常复杂的函数。它的输入通常是长的向量,并从输入里提取信息,这些信息是很难从输入直接看出的。
解决这种问题的传统方法是手工设计函数。你从分析问题开始。提示有猫的像素模式是什么?区别编码区域和非编码区域的DNA模式是什么?你可以写计算机代码来识别特定的特征,然后识别产生你想要的结果的特征组合。这个过程很慢而劳动强度大,严重依赖于个人的专业知识。
机器学习采用不同的方法。不是手工设计函函,你让计算机基于数据学习函数。你收集上千个到上百万个图像,每个标签提示是否有猫。你给计算机提供所有的训练数据,然后让计算机找到函数结果接近1表示有猫而函数结查接近0表示没有猫。
“让计算机找到函数”是什么意思?一般来说,你创建一个模型来定义一大类函数,模型包含参数,参数是可以取任意值的变量。通过选择参数的值,你从模型定义的一大类函数里得到特定的函数。计算机的任务是找到参数的值。它试图找到这种值,当你输入训练数据时,输出尽量接近于目标。
函数和可微性
这一节简单的回顾函数和可微的概念。函数f是一种将输入转变为输出的规则。所有的计算机编程语言都有函数,函数的数学定义没有很大的不同。但是通常用于物理学和工程学数学上的函数有些重要的特性例如连续性和可微性。连续函数,宽松的说,就是可以连续的在纸上画而不需要将笔提起的函数,如图3-1所示。 (当然这不是技术上的定义,但这是连续函数的精髓。)
图 3-1. 一些连续函数.
可微性是函数的一种类型的平滑条件。它是说函数里没有尖的转角(如图 3-2).
图3-2. 可微函数.
可微函数的好处是我们可以使用在某个点函数的斜率来找到比当前点更高或更低的值的点。这可以让我们找到函数的最小值。可微函数f的微分记为f′,是另一个函数,它提供原函数在所有点的斜率。概念上的思想是函数在某一点的微分指示了函数值比当前值更低或更高的方向。优化算法按这种方向移动以逼近函数f的最小值。在最小值处,函数的微分为零。刚开始是看不到微分驱动的优化的强大之处的。 学微积分的学生都会觉得在纸上练习找小型函数的最小值很乏味。这些练习并没有什么作用,因为用少量的输入参数找到函数的最小值是微不足道的。当有上百个,上千个,上万个变量时,微分驱动的优化的强大就变得很明显了。在这种规模上,理解函数解析式几乎不可能,并且所有的可视化都是令人担心的练习,它可能失去函数的某些重要特征。在这种规模上,函数的梯度 ∇f ,是多元函数微分f′的泛化,是理解函数和它的行为的最为强大的数学工具。后面我们将深入学习梯度 (那是概念上的;我们不在这里讲梯度的技术细节)。
从高层次看,机器学习简单的来说就是最小化函数:优化算法无非就是合适的函数的最小值发现者。这个定义的好处是数学上简单。但是编码有用的解决方案于最小值的特殊的可微函数到底是什么,我们如何找到它们?