第 3 章 从零开始的深度学习 从零开始的深度学习
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
你可能没有意识到,但你现在已经具备了回答我在本书开头提出的有关 Deep Learning 模型的关键问题的所有数学和概念基础:你理解了神经网络是如何工作的--矩阵乘法、损失以及与该损失相关的偏导数所涉及的计算--以及这些计算工作的原因(即微积分中的链式法则)。我们从第一原理出发构建神经网络,将其表示为一系列 "积木",其中每个积木都是一个数学函数,从而实现了这种理解。在本章中,你将学会把这些积木本身表示为抽象的 Python 类,然后使用这些类来构建深度学习模型;在本章结束时,你将确实完成 "从零开始的深度学习"!
我们还将把这些构件对神经网络的描述映射到你以前可能听说过的对深度学习模型的更常规的描述。例如,在本章结束时,你就会知道深度学习模型拥有 "多个隐藏层 "意味着什么。这其实就是理解概念的精髓:能够在高层次描述和实际发生的低层次细节之间进行转换。让我们开始构建这种转换。到目前为止,我们只是从低层次操作的角度来描述模型。在本章的第一部分,我们将把对模型的描述映射到诸如 "层 "之类的常用高层概念,这些概念最终将使我们能够更轻松地描述更复杂的模型。
深度学习的定义:初体验
什么 是"深度学习 "模型?在上一章中,我们将模型定义为由计算图表示的数学函数。这种模型的目的是尝试将输入(每个输入都来自具有共同特征的数据集,例如代表房屋不同特征的独立输入)映射到来自相关分布的输出(例如这些房屋的 价格)。我们发现,如果我们将模型定义为一个函数,将 参数作为其某些运算的输入,我们就可以通过以下程序"拟合 "模型,以最佳方式描述数据:
-
在 "前向传递 "过程中,通过模型重复输入观测数据,并跟踪沿途计算的数量。
-
计算 损失,表示我们的模型预测 与预期输出或目标的偏差程度。
-
利用前向传递计算出的数量和第 1 章中的链式计算法则,计算出每个输入参数最终对这一损失的影响程度。
-
更新参数值,以便下一组观测数据通过模型时,损失有望减少。
一开始,我们使用的模型仅包含一系列将特征转换为目标的线性运算(结果相当于传统的线性回归模型)。这样做有一个预期的局限性,那就是即使 "最优 "拟合,模型也只能表示特征与目标之间的线性关系。
然后,我们定义了一个函数结构,首先应用这些线性运算,然后应用一个非线性运算(sigmoid 函数),最后再应用一组线性运算。我们证明,通过这种修改,我们的模型可以学习到更接近输入和输出之间真实的非线性关系,同时还能学习到输入特征组合和目标之间的关系。
像这样的模型与 Deep Learning 模型之间有什么联系呢?我们先来尝试下一个有些笨拙的定义:深度学习模型是由至少有两个、非连续的非线性函数参与的一系列操作来表示的。
我很快就会说明这个定义的来源,但首先要注意的是,既然 Deep Learning 模型只是一系列运算,那么训练它们的过程其实与我们已经见过的较简单模型的训练过程是相同的。毕竟,让这个训练过程发挥作用的是模型相对于其输入的可微性;正如第 1 章中提到的,可微函数的组成是可微的,因此只要组成函数的各个运算是可微的,那么整个函数也将是可微的,我们就可以使用刚才描述的相同的四步训练过程来训练它。
然而,迄今为止,我们实际训练这些模型的方法一直是通过手动编码前向和后向传递来计算这些导数,然后将适当的量相乘来得到导数。对于第 2 章中的简单神经网络模型,这需要 ...