在微分学最重要的应用是优化问题,即考虑如何把事情做到最好。
在深度学习中,我们“训练”模型,不断更新它们,使它们在看到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个损失函数,即一个衡量“我们的模型有多糟糕”这个问题的分数。
最终,我们真正关系的是生成一个能够在我们从未见过的数据上表现良好的模型。但我们只能将模型与我们实际能看到的数据相拟合。因此,我们可以将拟合模型的任务分解为两个关键问题:
为了更好地理解优化问题和方法,这里对深度学习中常用的微分知识提供了一个非常简短的入门教程。
导数的计算是所有深度学习优化算法的关键步骤。
在深度学习中,我们通常选择对于模型参数可微的损失函数。
简而言之,这意味着,对于每个参数,如果我们把这个参数增加或减少一个无穷小的量,我们可以知道损失会以多快的速度增加或减少。
让我们熟悉一下导数的几个等价符号。给定 y = f ( x ) y=f(x) y=f(x),其中 x x x和 y y y分别是函数 f f f的自变量和因变量。以下表达式是等价的:
f ′ ( x ) = y ′ = d y d x = d f d x = d d x f ( x ) = D f ( x ) = D x f ( x ) f^{\prime}(x)=y^{\prime}=\frac{d y}{d x}=\frac{d f}{d x}=\frac{d}{d x} f(x)=D f(x)=D_{x} f(x) f′(x)=y′=dxdy=dxdf=dxdf(x)=Df(x)=Dxf(x)
到目前为止,我们只讨论了仅含一个变量的函数的微分。在深度学习中,函数通常依赖许多变量。因此,我们需要将微分的思想推广到这些多元函数上。
为了计算某一变量的偏导数,我们仅仅需要将其他变量看到常数进行整体函数的求导即可。
我们可以连结一个多元函数对其所有变量的偏导数,以得到该函数的梯度向量。
之后我们将看到,梯度对于设计深度学习中的优化算法有很大用处。
然而,上面的方法可能很难找到梯度。这是因为在深度学习中,多元函数通常是复合的,所以我们可能没法应用上述任何规则来微分这些函数。幸运的是,链式法则使我们能够微分复合函数。
让我们先考虑单变量函数。假设函数 y = f ( u ) y=f(u) y=f(u)和 u = g ( x ) u=g(x) u=g(x)都是可微的,根据链式法则:
d y d x = d y d u d u d x \frac{d y}{d x}=\frac{d y}{d u} \frac{d u}{d x} dxdy=dudydxdu
现在让我们把注意力转向一个更一般的场景,即函数具有任意数量的变量的情况。
假设可微分函数 y y y有变量 u 1 , u 2 , … , u m u_{1}, u_{2}, \ldots, u_{m} u1,u2,…,um,其中每个可微分函数 u i u_{i} ui都有变量 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn。注意, y y y是 x 1 , x 2 , … , x n x_{1}, x_{2}, \ldots, x_{n} x1,x2,…,xn的函数。对于任意的 i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n,链式法则给出:
d y d x i = d y d u 1 d u 1 d x i + d y d u 2 d u 2 d x i + ⋯ + d y d u m d u m d x i \frac{d y}{d x_{i}}=\frac{d y}{d u_{1}} \frac{d u_{1}}{d x_{i}}+\frac{d y}{d u_{2}} \frac{d u_{2}}{d x_{i}}+\cdots+\frac{d y}{d u_{m}} \frac{d u_{m}}{d x_{i}} dxidy=du1dydxidu1+du2dydxidu2+⋯+dumdydxidum