小白都能理解的矩阵与向量求导链式法则

您所在的位置:网站首页 标量函数对矢量求导 小白都能理解的矩阵与向量求导链式法则

小白都能理解的矩阵与向量求导链式法则

2024-07-11 04:48| 来源: 网络整理| 查看: 265

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步

0.前言

深度学习中最常见的是各种向量还有矩阵运算,经常会涉及到求导操作。因此准确理解向量矩阵的求导操作就显得非常重要,对我们推导计算过程以及代码书写核对有非常大的帮助。 神经网络中最常见的操作为向量,矩阵乘法,在求导的时候经常需要用到链式法则,链式法则在计算过程中会稍微麻烦,下面我们来详细推导一下,推导过程全程简单明了,稍微有点数学基础的同学都能看明白。

1.标量对标量的链式求导

假设x, y, z都为标量(或者说一维向量),链式关系为x -> y -> z。根据高数中的链式法则 ∂ z ∂ x = ∂ z ∂ y ⋅ ∂ y ∂ x \frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x} ∂x∂z​=∂y∂z​⋅∂x∂y​

上面的计算过程很简单,不多解释。

2.向量对向量链式求导

假设x,y,z都为向量,链式关系为x -> y -> z。如果我们要求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​,可以直接用链接法则求导 ∂ z ∂ x = ∂ z ∂ y ⋅ ∂ y ∂ x \frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x} ∂x∂z​=∂y∂z​⋅∂x∂y​

假设x, y, z的维度分别为m, n, p, ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​的维度为p * m,而 ∂ z ∂ y \frac{\partial z}{\partial y} ∂y∂z​的维度为p * n, ∂ y ∂ x \frac{\partial y}{\partial x} ∂x∂y​的维度为n * m,p * n与n * m的维度刚好为p * m,与左边相同。

3.标量对多向量的链式求导

在深度学习中,一般我们的损失函数为一个标量函数,比如MSE或者Cross Entropy,因此最后求导的目标函数为标量。 假设我们最终优化的目标为z是个标量,x,y分为是m,n维向量,依赖关系为x->y->z。现在需要求的是 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​,维度为m * 1。 易知有 ∂ z ∂ y \frac{\partial z}{\partial y} ∂y∂z​为n * 1, ∂ y ∂ x \frac{\partial y}{\partial x} ∂x∂y​为n * m,则 ( ∂ y ∂ x ) T ⋅ ∂ z ∂ y (\frac{\partial y}{\partial x}) ^ T \cdot \frac{\partial z}{\partial y} (∂x∂y​)T⋅∂y∂z​的维度为m * 1,与左边能对上。 因此有 ∂ z ∂ x = ( ∂ y ∂ x ) T ⋅ ∂ z ∂ y \frac{\partial z}{\partial x} = (\frac{\partial y}{\partial x}) ^ T \cdot \frac{\partial z}{\partial y} ∂x∂z​=(∂x∂y​)T⋅∂y∂z​ 扩展到多个向量 y1 -> y2 -> y3 -> …-> yn -> z ∂ z ∂ y 1 = ( ∂ y n ∂ y n − 1 ⋅ ∂ y n − 1 ∂ y n − 2 ⋯ ∂ y 2 ∂ y 1 ) T ⋅ ∂ z ∂ y n \frac{\partial z}{\partial y_1} = (\frac{\partial y_n}{\partial y_{n-1}} \cdot \frac{\partial y_{n-1}}{\partial y_{n-2}} \cdots \frac{\partial y_2}{\partial y_1}) ^ T \cdot \frac{\partial z}{\partial y_n} ∂y1​∂z​=(∂yn−1​∂yn​​⋅∂yn−2​∂yn−1​​⋯∂y1​∂y2​​)T⋅∂yn​∂z​

以常见的最小二乘求导为例: C = ( X θ − y ) T ( X θ − y ) C = (X\theta - y) ^ T (X\theta - y) C=(Xθ−y)T(Xθ−y) 损失函数C是个标量,假设X为m*n的矩阵, θ \theta θ为 n ∗ 1 n*1 n∗1的向量,我们要求C对 θ \theta θ的导数,令 z = X θ − y z = X\theta - y z=Xθ−y, C = z T z C = z^Tz C=zTz,由上面的连式关系 ∂ C ∂ θ = ( ∂ z ∂ θ ) T ⋅ ∂ C ∂ z = 2 X T ( X θ − y ) \frac{\partial C}{\partial \theta} = (\frac{\partial z}{\partial \theta})^T \cdot \frac{\partial C}{\partial z} = 2X^T(X \theta - y) ∂θ∂C​=(∂θ∂z​)T⋅∂z∂C​=2XT(Xθ−y)

核对一下维度 ∂ C ∂ θ \frac{\partial C}{\partial \theta} ∂θ∂C​是n * 1, X T X^T XT是n * m, X θ − y X \theta - y Xθ−y是m * 1, X T ( X θ − y ) X^T (X \theta - y) XT(Xθ−y)是n * 1,能与左边对上。

其中 ∂ ( X θ − y ) ∂ θ = X \frac{\partial (X \theta - y)}{\partial \theta} = X ∂θ∂(Xθ−y)​=X ∂ ( z T z ) ∂ z = 2 z \frac{\partial (z^Tz)}{\partial z} = 2z ∂z∂(zTz)​=2z

X θ − y X \theta - y Xθ−y为m * 1, θ \theta θ为n * 1, X的维度刚好为m * n。 z T z z^Tz zTz是个标量,对 z z z求导结果为 2 z 2z 2z,与 z z z的维度一致。

所以最小二乘最优解的矩阵表达式为 2 X T ( X θ − y ) = 0 2X^T(X \theta - y) = 0 2XT(Xθ−y)=0 θ = ( X T X ) − 1 X T y \theta = (X^TX)^{-1}X^Ty θ=(XTX)−1XTy

4.标量对多矩阵链式求导

神经网络中,最常见的计算方式是 Y = W X + b Y = WX + b Y=WX+b,其中 W W W为权值矩阵。 看个更为常规的描述: 假设 z = f ( Y ) z = f(Y) z=f(Y), Y = A X + B Y = AX + B Y=AX+B,其中A为m * k矩阵,X为k * 1向量,B为m * 1向量,那么Y也为m * 1向量,z为一个标量

如果要求 ∂ z ∂ X \frac{\partial z}{\partial X} ∂X∂z​,结果为k * 1的维度。 ∂ z ∂ Y \frac{\partial z}{\partial Y} ∂Y∂z​的维度为m * 1, A的维度为m * k ∂ z ∂ X = A T ⋅ ∂ z ∂ Y \frac{\partial z}{\partial X} = A ^ T \cdot \frac{\partial z}{\partial Y} ∂X∂z​=AT⋅∂Y∂z​

左边的维度为k * 1,右边的维度为k * m 与m * 1相乘,也是k * 1,刚好能对上。

当X为矩阵时,按同样的方式进行推导可以得到一样的结论。

如果要求 ∂ z ∂ A \frac{\partial z}{\partial A} ∂A∂z​,结果为m * k矩阵。 ∂ z ∂ Y \frac{\partial z}{\partial Y} ∂Y∂z​的维度为m * 1, X的维度为k * 1, ∂ z ∂ A = ∂ z ∂ Y ⋅ X T \frac{\partial z}{\partial A} = \frac{\partial z}{\partial Y} \cdot X^T ∂A∂z​=∂Y∂z​⋅XT 当X为矩阵时,按同样的方式进行推导可以得到一样的结论。

5.总结

一句话总结就是:标量对向量或者矩阵进行链式求导的时候,按照维度将结果对其就特别容易推导。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3