高等数学——复杂函数的求导方法

本文始发于个人公众号:TechFlow,原创不易,求个关注

上一篇文章我们复习了函数求导的定义和一些常见函数的导数,今天这篇文章我们回顾一下复杂函数的求导方法。先强调一下,今天的文章很重要,想要看懂机器学习各种公式推导,想要能够自己推一推各种公式,函数求导是基础中的基础,在算法这个领域,它比积分要重要得多。

我们先来看第一种情况:多个函数进行四则运算的导数。

函数四则运算求导法则

我们假设\(u=u(x)\)和\(v=v(x)\)都在x点有导数,那么它们进行加减乘除四则运算之后的结果的导数有如下性质:

\[
\begin{aligned}
\left[u(x) \pm v(x)\right]'&= u'(x) \pm v'(x) \\left[u(x)v(x)\right]' &= u'(x)v(x) + u(x)v'(x) \\left[\frac{u(x)}{v(x)}\right] &= \frac{u'(x)v(x)-u(x)v'(x)}{v^2(x)} (v(x) \neq 0)
\end{aligned}
\]

我们来看一下证明过程,熟悉证明过程并不是炫技,除了能加深对公式的理解之外,更重要的是防止遗忘。即使以后真的不记得公式的细节了,也可以临时推导一下,这是学算法和数学很重要的技巧。

我们先来看第一个,第一个很容易证明,我们直接套一下导数的公式即可:

\[
\begin{aligned}
\left[u(x) \pm v(x) \right]'
&= \lim_{\Delta x \to 0} \frac{\left[u(x+\Delta x) \pm v(x + \Delta x) \right] - \left[u(x) \pm v(x) \right] }{\Delta x} \&= \lim_{\Delta x \to 0}\frac{u(x+\Delta x)}{\Delta x} \pm \lim_{\Delta x \to 0} \frac{v(x+\Delta x)}{\Delta x} \&= u'(x) \pm v'(x)
\end{aligned}
\]

第二个式子同样套用公式:

\[
\begin{aligned}
\left[u(x)v(x)\right]' &= \lim_{\Delta x \to 0} \frac{u(x+\Delta x) v(x + \Delta x) - u(x) v(x)}{\Delta x} \&= \lim_{\Delta x \to 0} \frac{u(x+\Delta x) v(x + \Delta x) - u(x)v(x+ \Delta x) + u(x)v(x+\Delta x) - u(x) v(x)}{\Delta x} \&= \lim_{\Delta x \to 0} \frac{(u(x+\Delta x) - u(x))v(x+\Delta x) + u(x)(v(x+\Delta x) - v(x))}{\Delta x} \&= \lim_{\Delta x \to 0}v(x+\Delta x) \frac{u(x+\Delta x) - u(x)}{\Delta x} + \lim_{\Delta x \to 0}u(x)\frac{v(x+\Delta x) - v(x)}{\Delta x}\&=v(x+\Delta x)u'(x) + u(x)v'(x) \&=u(x)v'(x) + u'(x)v(x)
\end{aligned}
\]

最后是第三个式子的推导,也并不复杂:

\[
\displaystyle
\begin{aligned}
\left[\frac{u(x)}{v(x)}\right] &= \lim_{\Delta x \to 0}\frac{\frac{u(x+\Delta x)}{v(x+\Delta x)} - \frac{u(x)}{v(x)}}{\Delta x} \&= \lim_{\Delta x \to 0}\frac{v(x)u(x+\Delta x)-v(x+\Delta x)u(x)}{v(x+\Delta x)v(x)\Delta x} \&=\lim_{\Delta x \to 0} \&= \lim_{\Delta x \to 0}\frac{v(x)u(x+\Delta x)-v(x)u(x)+v(x)u(x)-v(x+\Delta x)u(x)}{v(x+\Delta x)v(x)\Delta x} \&=\lim_{\Delta x \to 0} \frac{\frac{u(x+\Delta x)-u(x)}{\Delta x}v(x)-\frac{v(x+\Delta x)-v(x)}{\Delta x}u(x)}{v(x+\Delta x)v(x)}\&=\frac{u'(x)v(x)-u(x)v'(x)}{v^2(x)}
\end{aligned}
\]

反函数求导法则

推导完了四则运算的求导法则,我们再来看一下反函数的求导法则。

我们陷在了看结论,如果函数\(x=f(y)\)在区间\(I_y\)内单调、可导并且\(f'(x)!=0\),那么它的反函数\(y=f^{-1}(x)\)在区间\(I_x=\{x|x=f(y), y\in I_y\}\)内也可导,那么:

\[\left[f^{-1}(x)\right]'=\frac{1}{f'(y)}\]

关于这个结论的证明很简单,因为\(x=f(y)\)在区间内单调、可导,所以它的反函数\(y=f^{-1}(x)\)存在,并且也单调且连续。

所以:

\[
\begin{aligned}
\Delta y=f^{-1}(x+\Delta x)-f^{-1}x \neq 0 \\frac{\Delta y}{\Delta x} = \frac{1}{\frac{\Delta x}{\Delta y}}=\frac{1}{f'(y)}
\end{aligned}
\]

由于\(y=f^{-1}(x)\)连续,\(\displaystyle\lim_{\Delta x \to 0}\Delta y=0\),所以上式成立。

我们来看一个例子:\(x=\sin y, y\in \left[-\frac{\pi}{2}, \frac{\pi}{2} \right]\),则\(y=\arcsin x\)是它的反函数,根据上面的公式,我们可以得到:

\[(\arcsin x)'=\frac{1}{(\sin y)'}=\frac{1}{\cos y}\]

由于\(\cos y= \sqrt{1-\sin^2 y} = \sqrt{1-x^2}\),代入上式可以得到:

\[(\arcsin x)'=\frac{1}{\sqrt{1-x^2}}\]

利用同样的方法,我们还可以求出其他反三角函数的导数,由于这些并不太常用,所以我们就不多介绍了,感兴趣的同学可以自己利用导数的定义推导一下,我想应该也不难。

复合函数求导

这是最后一个法则,也是本篇文章的重点,因为经常用到。我们现在已经搞定了一些常见的函数,还搞定了常见函数加减乘除之后求导的结果,但是对于一些看起来比较复杂的函数,我们并不能一下写出它们的导数。

比如说:\(\sin (x^2+3x)\),比如\(\ln (3x -1)\)等等,这些函数基本上都可以确定是连续并且可导的,但是我们一下子并不能写出它们的导数,而且要通过导数的定义推导也非常麻烦,对于这些导数就需要用到今天的重头戏,也就是复合函数的求导法则了。

对于复合函数而言,拥有如下法则:如果函数\(u=g(x)\)在点x处可导,并且\(y=f(u)\)在点\(u=g(x)\)处也可导,那么复合函数\(y=f[g(x)]\)在x处可导,它的导数为:

\[\frac{dy}{dx}=f'(u)\cdot g'(x)=\frac{dy}{du}\cdot \frac{du}{dx}\]

如果复合函数的数量更多也是一样的,我们按照顺序依次相乘即可。由于公式的形式像是一根链条一样依次所以,复合函数求导法则也叫链式求导法则。在举例之前,我们先来证明一下。

由于\(y=f(u)\)在点u处可导,因此

\[\displaystyle\lim_{\Delta u \to 0}\frac{\Delta y}{\Delta u} = f'(u)\]

因为\(f'(u)\)存在,所以我们将它变形为:

\[\frac{\Delta y}{\Delta u} = f'(u) + a\]

其中a是\(\Delta u \to 0\)时的无穷小,我们对两边同时乘上\(\Delta u\),可以得到:

\[\Delta y = f'(u)\Delta u + a\cdot \Delta u\]

上式当中\(\Delta u\)和a都是无穷小,所以当\(\Delta u \to 0\)时,\(\Delta y=0\),我们对上式两边同时除以\(\Delta x\),得:

\[\displaystyle\frac{\Delta y}{\Delta x}=f'(u)\frac{\Delta u}{\Delta x} + a\cdot\frac{\Delta u}{\Delta x}\]

于是:

\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=\lim_{\Delta x \to 0}[f'(u)\frac{\Delta u}{\Delta x}+a\frac{\Delta u}{\Delta x}]\]

又根据\(u=g(x)\)在点x处可导,所以有:

\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta u}{\Delta x}=g'(x)\]

我们代入,就可以得到:

\[\displaystyle \lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=f'(u)\cdot \frac{\Delta u}{\Delta x}=f'(u)\cdot g'(x)\]

其实我们都知道相比于公式的证明,公式的运用更加重要,下面我们就来看两个例子,来巩固一下这个链式求导法则:

\(y=\ln \sin 3x\),求\(\frac{dy}{dx}\)

我们令\(u=3x, g=\sin u\)

所以:

\[
\begin{aligned}
\frac{dy}{dx}&=\frac{dy}{dg}\cdot \frac{dg}{du}\cdot\frac{du}{dx}\&=\frac{1}{g}\cdot \cos u\cdot 3\&=3\frac{\cos 3x}{\sin 3x} \&=3 \cot 3x
\end{aligned}
\]

还记得我们之前推导线性回归时候用到的均方差的公式吗:

\[f(\theta) = \frac{1}{m}(\theta X-Y)^2\]

我们来试着学以致用,求一下\(f(\theta)\)的导数,在机器学习当中,X和Y都是样本都是已知的参数,要求的是\(\theta\),所以我们对\(\theta\)求导:

\[
\begin{aligned}
f'(\theta) &= \frac{1}{m}\cdot 2 \cdot (\theta X - Y)\cdot X \&=\frac{2}{m}X^T(\theta X - Y)
\end{aligned}
\]

这个结果其实就是之前我们说的梯度,梯度本来就是由导数计算得到的,所以理解了链式求导的公式,可以再回过头看看之前线性回归和梯度推导的公式,相信会有更深刻的体会。

今天的文章篇幅有些长,但是除去证明之后,剩下的内容并不多,重要的是它的应用范围很广,所以希望大家都能学会。

如果觉得有所收获,请顺手扫码点个关注吧,你们的举手之劳对我来说很重要。

原文地址:https://www.cnblogs.com/techflow/p/12306205.html

时间: 2024-10-08 15:26:09

高等数学——复杂函数的求导方法的相关文章

MATLAB 单变量函数一阶及N阶求导

1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms x代表着声明符号变量x,只有声明了符号变量才可以进行符号运算,包括求导. %f(x)=sin(x)+x^2; %我们输入的要求导的函数 y = diff(sin(x)+x^2); %代表着对单变量函数f(x)求一阶导数 disp('f(x)=sin(x)+x^2的导数是'); pretty(y);

多维高斯概率密度函数对协方差矩阵求导

(没有字,全是图,居然因为字数不够不让发首页,只能来凑字数了) 在模式识别与机器学习中,高斯函数,特别是多维的高斯函数占着非常重要的地位.而其中高斯函数对均值和协方差矩阵的求导尤为重要,因为在用ML.MAP 或者其他方法计算最优值的时候,都会用到高斯函数的求导.虽然对均值求导的过程以及形式在很多博客中都有,但是对协方差矩阵求导的推导甚至是形式都寥寥无几.所以这里我把其简易版的推导以及最后的形式给出,以飨读者.

【转载】softmax的log似然代价函数(求导过程)

全文转载自:softmax的log似然代价函数(公式求导) 在人工神经网络(ANN)中,Softmax通常被用作输出层的激活函数.这不仅是因为它的效果好,而且因为它使得ANN的输出值更易于理解.同时,softmax配合log似然代价函数,其训练效果也要比采用二次代价函数的方式好. 1. softmax函数及其求导 softmax的函数公式如下: 其中,表示第L层(通常是最后一层)第j个神经元的输入,表示第L层第j个神经元的输出,表示自然常数.注意看,表示了第L层所有神经元的输入之和. softm

机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法

在机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法中,我们讨论了定义法求解矩阵向量求导的方法,但是这个方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦.因此我们需要其他的一些求导方法.本文我们讨论使用微分法来求解标量对向量的求导,以及标量对矩阵的求导. 本文的标量对向量的求导,以及标量对矩阵的求导使用分母布局.如果遇到其他资料求导结果不同,请先确认布局是否一样. 1. 矩阵微分 在高数里面我们学习过标量的导数和微分,他们之间有这样的关系:$df =f'(x)dx$.

『PyTorch』第三弹_自动求导

torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在其上的操作.一旦完成了你的运算,你可以调用 .backward()来自动计算出所有的梯度,Variable有三个属性: 访问原始的tensor使用属性.data: 关于这一Variable的梯度则集中于 .grad: .creator反映了创建者,标识了是否由用户使用.Variable直接创建(No

矩阵求导问题

复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix. x is a column vector, A is a matrix practice:

进一步完善之后的一元N次方程求导算法

祝大家节日快乐.......写代码就是过节.... package com.system.Tools; /** * 这个类,实现对函数的求导算法 * 最大目标  实现对任意多元函数的偏导数和全导数的求导算法 * 最小目标  实现对一元N次函数的求导算法 *  * @author Administrator */public class SystemMathTools { /* *  还不是很完善,需要进一步修改...     *      *  by comsci 2019.2.4 经过进一步的

求导总结

复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix. 其中a,b,x都为列向量,并且都与x有关,S(a),S(b)分别代表向量a,b的反对称矩阵 x is a column vector, A is a matrix $d(A*x)/dx=A$ $d(x^T*A)/dx^T=A$ $d(x^T*A)/dx=A^T$ $d(x^T*A*x)/dx=x^T(A^T+A)$ practice: 原文地址:https://www.cnblogs.com/mataiyuan/

对任意函数求导的sas模拟

*模拟求导 步长一定要比阈值小,才能得出准确的结果; data Derivation (keep=interval slope); * function y = 1/x only concern about x>0; deltaX = 1e-6; *割线变为切线时x1减小的步长; x0 = 2; y0 = 0; %function(y0,x0);*需要求导的点; put y0; slope = 0; *需要求得的斜率,即倒数; interval = 5; *x0与x1的在x轴的间距,也是判定停止