基本函数导数公式
Copyright © Microsoft Corporation. All rights reserved.
适用于License版权许可
更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区
- Content
- 01.0-神经网络的基本工作原理
- 01.1-基本数学导数公式
- 01.2-Python-Numpy库的点滴
- 02.0-反向传播与梯度下降
- 02.1-线性反向传播
- 02.2-非线性反向传播
- 02.3-梯度下降
- 03.0-损失函数
- 03.1-均方差损失函数
- 03.2-交叉熵损失函数
- 04.0-单入单出单层-单变量线性回归
- 04.1-最小二乘法
- 04.2-梯度下降法
- 04.3-神经网络法
- 04.4-梯度下降的三种形式
- 04.5-实现逻辑非门
- 05.0-多入单出单层-多变量线性回归
- 05.1-正规方程法
- 05.2-神经网络法
- 05.3-样本特征数据的归一化
- 05.4-归一化的后遗症
- 05.5-正确的推理方法
- 05.6-归一化标签值
- 06.0-多入多出单层神经网络-多变量线性分类
- 06.1-二分类原理
- 06.2-线性二分类实现
- 06.3-线性二分类结果可视化
- 06.4-多分类原理
- 06.5-线性多分类实现
- 06.6-线性多分类结果可视化
- 07.0-激活函数
- 07.1-挤压型激活函数
- 07.2-半线性激活函数
- 07.3-用双曲正切函数分类
- 07.4-实现逻辑与门和或门
- 08.0-单入单出双层-万能近似定理
- 08.1-双层拟合网络的原理
- 08.2-双层拟合网络的实现
- 09.0-多入多出双层-双变量非线性分类
- 09.1-实现逻辑异或门
- 09.2-理解二分类的工作原理
- 09.3-非线性多分类
- 09.4-理解多分类的工作原理
- 10.0-调参与优化
- 10.1-权重矩阵初始化
- 10.2-参数调优
- 10.3-搜索最优学习率
- 10.4-梯度下降优化算法
- 10.5-自适应学习率算法
- 11.0-深度学习基础
- 11.1-三层神经网络的实现
- 11.2-验证与测试
- 11.3-梯度检查
- 11.4-手工测试训练效果
- 11.5-搭建深度神经网络框架
- 12.0-卷积神经网络
- 12.1-卷积
- 12.2-池化
- 14.1-神经网络模型概述
- 14.2-Windows模型的部署
- 14.3-Android模型的部署
基本数学导数公式
这篇文章的内容更多的是一些可能要用到的数学公式的导数公式和推导,是一种理论基础,感兴趣的同学可以仔细瞅瞅,想直接上手的同学也可以直接跳过这一篇~
大家可以mark一下,以便以后用到时过来查一下,当成字典。
下面进入正题!
- \(y=c\)
\[y'=0 \tag 1\]
- \(y=x^a\)
\[y'=ax^{a-1} \tag 2\]
- \(y=log_ax\)
\[y'=\frac{1}{x}log_ae=\frac{1}{xlna} \tag 3\]
\[(因为log_ae=\frac{1}{log_ea}=\frac{1}{lna})\]
- \(y=lnx\)
\[y'=\frac{1}{x} \tag4\]
- \(y=a^x\)
\[y'=a^xlna \tag5\]
- \(y=e^x\)
\[y'=e^x \tag6\]
- \(y=e^{-x}\)
\[y'=-e^{-x} \tag7\]
- 正弦函数\(y=sin(x)\)
\[y'=cos(x) \tag 8\]
- 余弦函数 \(y=cos(x)\)
\[y'=-sin(x) \tag 9\]
- 正切函数 \(y=tg(x)\)
\[y'=sec^2(x)=\frac{1}{cos^2x} \tag{10}\]
- 余切函数 \(y=ctg(x)\)
\[y'=-csc^2(x) \tag{11}\]
- 反正弦函数 \(y=arcsin(x)\)
\[y'=\frac{1}{\sqrt{1-x^2}} \tag{12}\]
- 反余弦函数 \(y=arccos(x)\)
\[y'=-\frac{1}{\sqrt{1-x^2}} \tag{13}\]
- 反正切函数 \(y=arctan(x)\)
\[y'=\frac{1}{1+x^2} \tag{14}\]
- 反余切函数 \(y=arcctg(x)\)
\[y'=-\frac{1}{1+x^2} \tag{15}\]
- 双曲正弦函数 \(y=sinh(x)=(e^x-e^{-x})/2\)
\[y'=cosh(x) \tag{16}\]
- 双曲余弦函数 \(y=cosh(x)=(e^x+e^{-x})/2\)
\[y'=sinh(x) \tag{17}\]
- 双曲正切函数\(y=tanh(x)=(e^x-e^{-x})/(e^x+e^{-x})\)
\[y'=sech^2(x)=1-tanh^2(x) \tag{18}\]
- 双曲余切函数\(y=coth(x)=(e^x+e^{-x})/(e^x-e^{-x})\)
\[y'=-csch^2(x) \tag{19}\]
- 双曲正割函数\(y=sech(x)=2/(e^x+e^{-x})\)
\[y'=-sech(x)*tanh(x) \tag{20}\]
- 双曲余割函数\(y=csch(x)=2/(e^x-e^{-x})\)
\[y'=-csch(x)*coth(x) \tag{21}\]
导数四则运算
- \[[u(x) + v(x)]’ = u’(x) + v’(x) \tag{30}\]
- \[[u(x) - v(x)]’ = u’(x) - v’(x) \tag{31}\]
- \[[u(x)*v(x)]’ = u’(x)*v(x) + v’(x)*u(x) \tag{32}\]
- \[[\frac{u(x)}{v(x)}]'=\frac{u'(x)v(x)-v'(x)u(x)}{v^2(x)} \tag{33}\]
偏导数
- 如\(Z=f(x,y)\)
则Z对x的偏导可以理解为当y是个常数时,Z单独对x求导:
\[Z'_x=f'_x(x,y)=\frac{\partial{Z}}{\partial{x}} \tag{40}\]
则Z对y的偏导可以理解为当x是个常数时,Z单独对y求导:
\[Z'_y=f'_y(x,y)=\frac{\partial{Z}}{\partial{y}} \tag{41}\]
在二元函数中,偏导的何意义,就是对任意的\(y=y_0\)的取值,在二元函数曲面上做一个\(y=y_0\)切片,得到\(Z = f(x, y_0)\)的曲线,这条曲线的一阶导数就是Z对x的偏导。对\(x=x_0\)同样,就是Z对y的偏导。
复合函数求导(链式法则)
- 如果 \(y=f(u), u=g(x)\) 则
\[y'_x = f'(u)*u'(x) = y'_u*u'_x=\frac{dy}{du}*\frac{du}{dx} \tag{50}\]
- 如果\(y=f(u),u=g(v),v=h(x)\) 则
\[ \frac{dy}{dx}=f'(u)*g'(v)*h'(x)=\frac{dy}{du}*\frac{du}{dv}*\frac{dv}{dx} \tag{51} \]
- 如\(Z=f(U,V)\),通过中间变量\(U = g(x,y), V=h(x,y)\)成为x,y的复合函数\(Z=f[g(x,y),h(x,y)]\)
则
\[ \frac{\partial{Z}}{\partial{x}}=\frac{\partial{Z}}{\partial{U}} * \frac{\partial{U}}{\partial{x}} + \frac{\partial{Z}}{\partial{V}} * \frac{\partial{V}}{\partial{x}} \tag{52} \]
\[ \frac{\partial{Z}}{\partial{y}}=\frac{\partial{Z}}{\partial{U}} * \frac{\partial{U}}{\partial{y}} + \frac{\partial{Z}}{\partial{V}} * \frac{\partial{V}}{\partial{y}} \]
矩阵求导
如\(A,B,X\)都是矩阵,
则
\[ B\frac{\partial{(AX)}}{\partial{X}} = A^TB \tag{60} \]
\[ B\frac{\partial{(XA)}}{\partial{X}} = BA^T \tag{61} \]
\[ \frac{\partial{(X^TA)}}{\partial{X}} = \frac{\partial{(A^TX)}}{\partial{X}}=A \tag{62} \]
\[ \frac{\partial{(A^TXB)}}{\partial{X}} = AB^T \tag{63} \]
\[ \frac{\partial{(A^TX^TB)}}{\partial{X}} = BA^T \tag{64} \]
激活函数求导
sigmoid函数:\(A = \frac{1}{1+e^{-z}}\)
利用公式30,令:\(u=1,v=1+e^{-z}\) 则
\[ A'_z = \frac{u'v-v'u}{v^2}=\frac{0-(1+e^{-z})'}{(1+e^{-z})^2} \tag{70} \]
\[ =\frac{e^{-z}}{(1+e^{-z})^2} =\frac{1+e^{-z}-1}{(1+e^{-z})^2} \]
\[ =\frac{1}{1+e^{-z}}-(\frac{1}{1+e^{-z}})^2 \]
\[ =A-A^2=A(1-A) \]
tanh函数:\(A=\frac{e^{Z}-e^{-Z}}{e^{Z}+e^{-Z}}\)
利用公式23,令:\(u={e^{Z}-e^{-Z}},v=e^{Z}+e^{-Z}\) 则
\[ A'_Z=\frac{u'v-v'u}{v^2} \tag{71} \]
\[ =\frac{(e^{Z}-e^{-Z})'(e^{Z}+e^{-Z})-(e^{Z}+e^{-Z})'(e^{Z}-e^{-Z})}{(e^{Z}+e^{-Z})^2} \]
\[ =\frac{(e^{Z}+e^{-Z})(e^{Z}+e^{-Z})-(e^{Z}-e^{-Z})(e^{Z}-e^{-Z})}{(e^{Z}+e^{-Z})^2} \]
\[ =\frac{(e^{Z}+e^{-Z})^2-(e^{Z}-e^{-Z})^2}{(e^{Z}+e^{-Z})^2} \]
\[ =1-(\frac{(e^{Z}-e^{-Z}}{e^{Z}+e^{-Z}})^2=1-A^2 \]
反向传播四大公式推导
著名的反向传播四大公式是:
\[\delta^{L} = \nabla_{a}C \odot \sigma_{'}(Z^L) \tag{80}\]
\[\delta^{l} = ((W^{l + 1})^T\delta^{l+1})\odot\sigma_{'}(Z^l) \tag{81}\]
\[\frac{\partial{C}}{\partial{b_j^l}} = \delta_j^l \tag{82}\]
\[\frac{\partial{C}}{\partial{w_{jk}^{l}}} = a_k^{l-1}\delta_j^l \tag{83}\]
下面我们用一个简单的两个神经元的全连接神经网络来直观解释一下这四个公式,
每个结点的输入输出标记如图上所示,使用MSE作为计算loss的函数,那么可以得到这张计算图中的计算过公式如下所示:
\[e_{01} = \frac{1}{2}(y-a_1^3)^2\]
\[a_1^3 = sigmoid(z_1^3)\]
\[z_1^3 = (w_{11}^2 * a_1^2 + w_{12}^2 * a_2^2 + b_1^3)\]
\[a_1^2 = sigmoid(z_1^2)\]
\[z_1^2 = (w_{11}^1 * a_1^1 + w_{12}^1 * a_2^1 + b_1^2)\]
我们按照反向传播中梯度下降的原理来对损失求梯度,计算过程如下:
\[\frac{\partial{e_{o1}}}{\partial{w_{11}^2}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{w_{11}^2}}=\frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}a_{1}^2\]
\[\frac{\partial{e_{o1}}}{\partial{w_{12}^2}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{w_{12}^2}}=\frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}a_{2}^2\]
\[\frac{\partial{e_{o1}}}{\partial{w_{11}^1}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{a_{1}^2}}\frac{\partial{a_{1}^2}}{\partial{z_{1}^2}}\frac{\partial{z_{1}^2}}{\partial{w_{11}^1}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{a_{1}^2}}\frac{\partial{a_{1}^2}}{\partial{z_{1}^2}}a_1^1\]
\[=\frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}w_{11}^2\frac{\partial{a_{1}^2}}{\partial{z_{1}^2}}a_1^1\]
\[\frac{\partial{e_{o1}}}{\partial{w_{12}^1}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{a_{2}^2}}\frac{\partial{a_{2}^2}}{\partial{z_{1}^2}}\frac{\partial{z_{1}^2}}{\partial{w_{12}^1}} = \frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\frac{\partial{z_{1}^3}}{\partial{a_{2}^2}}\frac{\partial{a_{2}^2}}{\partial{z_{1}^2}}a_2^2\]
\[=\frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}w_{12}^2\frac{\partial{a_{2}^2}}{\partial{z_{1}^2}}a_2^2\]
上述式中,\(\frac{\partial{a}}{\partial{z}}\)是激活函数的导数,即\(\sigma^{'}(z)\)项。观察到在求偏导数过程中有共同项\(\frac{\partial{e_{o1}}}{\partial{a_{1}^3}}\frac{\partial{a_{1}^3}}{\partial{z_{1}^3}}\),采用\(\delta\)符号记录,用矩阵形式表示,
即:
\[\delta^L = [\frac{\partial{e_{o1}}}{\partial{a_{i}^L}}\frac{\partial{a_{i}^L}}{\partial{z_{i}^L}}] = \nabla_{a}C\odot\sigma^{'}(Z^L)\]
上述式中,\([a_i]\)表示一个元素是a的矩阵,\(\nabla_{a}C\)表示将损失\(C\)对\(a\)求梯度,\(\odot\)表示矩阵element wise的乘积(也就是矩阵对应位置的元素相乘)。
从上面的推导过程中,我们可以得出\(\delta\)矩阵的递推公式:
\[\delta^{L-1} = (W^L)^T[\frac{\partial{e_{o1}}}{\partial{a_{i}^L}}\frac{\partial{a_{i}^L}}{\partial{z_{i}^L}}]\odot\sigma^{'}(Z^{L - 1})\]
所以在反向传播过程中只需要逐层利用上一层的\(\delta^l\)进行递推即可。
相对而言,这是一个非常直观的结果,这份推导过程也是不严谨的。下面,我们会从比较严格的数学定义角度进行推导,首先要补充一些定义。
标量对矩阵导数的定义
假定\(y\)是一个标量,\(X\)是一个\(N \times M\)大小的矩阵,有\(y=f(X)\), \(f()\)是一个函数。我们来看\(df\)应该如何计算。
首先给出定义:
\[ df = \sum_j^M\sum_i^N \frac{\partial{f}}{\partial{x_{ij}}}dx_{ij} \]
下面我们引入矩阵迹的概念,所谓矩阵的迹,就是矩阵对角线元素之和。也就是说:
\[ tr(X) = \sum_i x_{ii} \]
引入迹的概念后,我们来看上面的梯度计算是不是可以用迹来表达呢?
\[ \frac{\partial{f}}{\partial{X}} = \begin{pmatrix} \frac{\partial{f}}{\partial{x_{11}}} & \frac{\partial{f}}{\partial{x_{12}}} & \dots & \frac{\partial{f}}{\partial{x_{1M}}} \\ \frac{\partial{f}}{\partial{x_{21}}} & \frac{\partial{f}}{\partial{x_{22}}} & \dots & \frac{\partial{f}}{\partial{x_{2M}}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial{f}}{\partial{x_{N1}}} & \frac{\partial{f}}{\partial{x_{N2}}} & \dots & \frac{\partial{f}}{\partial{x_{NM}}} \end{pmatrix} \tag{90} \]
\[ dX = \begin{pmatrix} dx_{11} & d{x_{12}} & \dots & d{x_{1M}} \\ d{x_{21}} & d{x_{22}} & \dots & d{x_{2M}} \\ \vdots & \vdots & \ddots & \vdots \\ d{x_{N1}} & d{x_{N2}} & \dots & d{x_{NM}} \end{pmatrix} \tag{91} \]
我们来看矩阵\((90)\)的转置和矩阵\((91)\)乘积的对角线元素
\[ {({(\frac{\partial{f}}{\partial{X}})}^TdX)}_{jj} = \sum_i^N\frac{\partial{f}}{\partial{x_{ij}}}dx_{ij} \]
因此,
\[ tr({(\frac{\partial{f}}{\partial{X}})}^TdX) = \sum_j^M\sum_i^N\frac{\partial{f}}{\partial{x_{ij}}}dx_{ij} = df = tr(df) \tag{92} \]
上式的最后一个等号是因为\(df\)是一个标量,标量的迹就等于其本身。
矩阵迹和导数的部分性质
这里将会给出部分矩阵的迹和导数的性质,作为后面推导过程的参考。性子急的同学可以姑且默认这是一些结论。
\[ d(X + Y) = dX + dY \tag{93} \]
\[ d(XY) = (dX)Y + X(dY)\tag{94} \]
\[ dX^T = {(dX)}^T \tag{95} \]
\[ d(tr(X)) = tr(dX) \tag{96} \]
\[ d(X \odot Y) = dX \odot Y + X \odot dY \tag{97} \]
\[ d(f(X)) = f^{'}(X) \odot dX \tag{98} \]
\[ tr(XY) = tr(YX) \tag{99} \]
\[ tr(A^T (B \odot C)) = tr((A \odot B)^T C) \tag{100} \]
以上各性质的证明方法类似,我们选取式(94)作为证明的示例:
\[ Z = XY \]
则Z中的任意一项是
\[ z_{ij} = \sum_k x_{ik}y_{kj} \\ dz_{ij} = \sum_k d(x_{ik}y_{kj}) = \sum_k (dx_{ik}) y_{kj} + \sum_k x_{ik} (dy_{kj}) = ((dX)Y)_{ij} + (X(dY))_{ij} \]
从上式可见,\(dZ\)的每一项和\((dX)Y + X(dY)\)的每一项都是相等的。因此,可以得出式(94)成立。
神经网络有关公式证明:
首先,来看一个通用情况,已知\(f = A^TXB\),\(A,B\)是常矢量,希望得到\(\frac{\partial{f}}{\partial{X}}\),推导过程如下
根据式(94),
\[ df = d(A^TXB) = d(A^TX)B + A^TX(dB) = d(A^TX)B + 0 = d(A^T)XB+A^TdXB = A^TdXB \]
由于\(df\)是一个标量,标量的迹等于本身,同时利用公式(99):
\[ df = tr(df) = tr(A^TdXB) = tr(BA^TdX) \]
由于公式(92):
\[ tr(df) = tr({(\frac{\partial{f}}{\partial{X}})}^TdX) \]
可以得到:
\[ (\frac{\partial{f}}{\partial{X}})^T = BA^T \]
\[ \frac{\partial{f}}{\partial{X}} = AB^T \tag{101} \]我们来看全连接层的情况
\[ Y = WX + B\]
取全连接层其中一个元素
\[ y = wX + b\]
这里的\(w\)是权重矩阵的一行,尺寸是\(1 \times M\),X是一个大小为\(M \times 1\)的矢量,y是一个标量,若添加一个大小是1的单位阵,上式整体保持不变:
\[ y = (w^T)^TXI + b\]
利用式(92),可以得到
\[ \frac{\partial{y}}{\partial{X}} = I^Tw^T = w^T\]
因此在误差传递的四大公式中,在根据上层传递回来的误差\(\delta\)继续传递的过程中,利用链式法则,有
\[\delta^{L-1} = (W^L)^T \delta^L \odot \sigma^{'}(Z^{L - 1})\]
同理,若将\(y=wX+b\)视作:
\[ y = IwX + b \]
那么利用式(92),可以得到:
\[ \frac{\partial{y}}{\partial{w}} = X^T\]
使用softmax和交叉熵来计算损失的情况下
\[ l = - Y^Tlog(softmax(Z))\]
式中,\(y\)是数据的标签,\(Z\)是网络预测的输出,\(y\)和\(Z\)的维度是\(N \times 1\)。经过softmax处理作为概率。希望能够得到\(\frac{\partial{l}}{\partial{Z}}\),下面是推导的过程:
\[ softmax(Z) = \frac{exp(Z)}{\boldsymbol{1}^Texp(Z)} \]
其中, \(\boldsymbol{1}\)是一个维度是\(N \times 1\)的全1向量。将softmax表达式代入损失函数中,有
\[ dl = -Y^T d(log(softmax(Z)))\\ = -Y^T d (log\frac{exp(Z)}{\boldsymbol{1}^Texp(Z)}) \\ = -Y^T dZ + Y^T \boldsymbol{1}d(log(\boldsymbol{1}^Texp(Z))) \tag{102} \]
下面来化简式(102)的后半部分,利用式(98):
\[ d(log(\boldsymbol{1}^Texp(Z))) = log^{'}(\boldsymbol{1}^Texp(Z)) \odot dZ = \frac{\boldsymbol{1}^T(exp(Z)\odot dZ)}{\boldsymbol{1}^Texp(Z)} \]
利用式(100),可以得到
\[ tr(Y^T \boldsymbol{1}\frac{\boldsymbol{1}^T(exp(Z)\odot dZ)}{\boldsymbol{1}^Texp(Z)}) = tr(Y^T \boldsymbol{1}\frac{(\boldsymbol{1} \odot (exp(Z))^T dZ)}{\boldsymbol{1}^Texp(Z)}) = tr(Y^T \boldsymbol{1}\frac{exp(Z)^T dZ}{\boldsymbol{1}^Texp(Z)}) = tr(Y^T \boldsymbol{1} softmax(Z)^TdZ) \tag{103} \]
将式(103)代入式(102)并两边取迹,可以得到:
\[ dl = tr(dl) = tr(-y^T dZ + y^T\boldsymbol{1}softmax(Z)^TdZ) = tr((\frac{\partial{l}}{\partial{Z}})^TdZ) \]
在分类问题中,一个标签中只有一项会是1,所以\(Y^T\boldsymbol{1} = 1\),因此有
\[ \frac{\partial{l}}{\partial{Z}} = softmax(Z) - Y \]
这也就是在损失函数中计算反向传播的误差的公式。
参考资料
矩阵求导术
点击这里提交问题与建议
联系我们: [email protected]
学习了这么多,还没过瘾怎么办?欢迎加入“微软 AI 应用开发实战交流群”,跟大家一起畅谈AI,答疑解惑。扫描下方二维码,回复“申请入群”,即刻邀请你入群。