令z(x)=f(x)g(x)。通过乘法求导公式,会很容易通过f(x)和g(x)的导数得到z(x)的导数,当然背公式的事情不值一提。本文在于如何去理解这个导数公式,怎么去推导。
首先第一种方式是通过导数的定义去推导,这个其实也简单,只需要根据定义,写出定义方程,然后做一些简单的变换即可,这种方式也不能给我们更多的insight。所以本文想说的其实是下面的第二种方式。
另外一种方式是将f(x)和g(x)看成不同的个体,先忽略之间的关联,为避免歧义,我们把属于不同部分的变量区分开来,记为f(x),g(y),如下图所示,得到z(x,y)。
那么,通过梯度我们可以得到双变量下函数z的变化量,这个很简单,关键的一步在于,我们怎么理解当x=y时,如何可以直接通过双变量下的函数值变化得到但变量下函数值的变化。
由于单变量下,变量变化对函数值的影响和双变量下两个变量做同等变化对函数值造成的影响是一样的,这一点很直观,甚至可以说是废话。因此,我们只需要在双变量的分析框架下,令x,y的变化一致,即delta x = delta y,就可以得到在点(x,x)下delta x对函数值的影响,从而得到单变量下z(x)的导数。
这里要注意不要和方向为(1,1)的方向倒数混淆在一起。这里单变量下,只有一个变元x,因此delta x是同时作用在f(x)和g(x)上的,但是对于双变量情况,需要delta x和delta y分别作用在f(x),g(y)上才会产生一样的效果,尽管delta x = delta y,但是实际上,这里对于双变量函数z(x,y),其就产生了一个方向为(1,1)的偏移量,且偏移量大小为|(delta x,delta y)|=sqrt(square(delta x)+square(delta y)),所以,这里单变量导数实际上是(1,1)方向上方向导数的根号2倍。
上述的理解就是为了传达一个思想,也是本文的主要目的,那就是,一个复杂函数,其可能由多个部分组成,这些部分又受着相同因素的驱动,这时我们可能比较难直接分析根本因素对最终函数值的影响关系,那么我们可以先将不同部分看作独立的整体,用多变量框架结合梯度思想去简化问题,最后再进行统一变量的整合分析,这样将复杂函数进行逐步拆解,有助于我们对复杂函数的分析。比如我们可以将其应用在复杂神经网络中变量梯度的求解。