在机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法中,我们讨论了使用微分法来求解矩阵向量求导的方法。但是很多时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。需要一些简洁的方法。
本文我们讨论矩阵向量求导链式法则,使用该法则很多时候可以帮我们快速求出导数结果。
本文的标量对向量的求导,标量对矩阵的求导使用分母布局, 向量对向量的求导使用分子布局。如果遇到其他资料求导结果不同,请先确认布局是否一样。
1. 向量对向量求导的链式法则
首先我们来看看向量对向量求导的链式法则。假设多个向量存在依赖关系,比如三个向量 x → y → z \mathbf{x} \to \mathbf{y} \to \mathbf{z} x→y→z存在依赖关系,则我们有下面的链式求导法则:
∂ z ∂ x = ∂ z ∂ y ∂ y ∂ x \frac{\partial \mathbf{z}}{\partial \mathbf{x}} = \frac{\partial \mathbf{z}}{\partial \mathbf{y}}\frac{\partial \mathbf{y}}{\partial \mathbf{x}} ∂x∂z=∂y∂z∂x∂y
该法则也可以推广到更多的向量依赖关系。但是要注意的是要求所有有依赖关系的变量都是向量,如果有一个 Y \mathbf{Y} Y是矩阵,比如是 x → Y → z \mathbf{x} \to \mathbf{Y} \to \mathbf{z} x→Y→z, 则上式并不成立。
从矩阵维度相容的角度也很容易理解上面的链式法则,假设 x , y , z \mathbf{x} , \mathbf{y} ,\mathbf{z} x,y,z分别是m,n.p维向量,则求导结果 ∂ z ∂ x \frac{\partial \mathbf{z}}{\partial \mathbf{x}} ∂x∂z是一个 p × m p \times m p×m的雅克比矩阵,而右边 ∂ z ∂ y \frac{\partial \mathbf{z}}{\partial \mathbf{y}} ∂y∂z是一个 p × n p \times n p×n的雅克比矩阵, ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} ∂x∂y是一个 n × m n \times m n×m的雅克比矩阵,两个雅克比矩阵的乘积维度刚好是 p × m p \times m p×m,和左边相容。
2. 标量对多个向量的链式求导法则
在我们的机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量,无法使用上一节的链式求导法则,比如2向量,最后到1标量的依赖关系: x → y → z \mathbf{x} \to \mathbf{y} \to z x→y→z,此时很容易发现维度不相容。
假设 x , y \mathbf{x},\mathbf{y} x,y分别是 m , n m,n m,n维向量, 那么 ∂ z ∂ x \frac{\partial z}{\partial \mathbf{x}} ∂x∂z的求导结果是一个 m × 1 m \times 1 m×1的向量, 而 ∂ z ∂ y \frac{\partial z}{\partial \mathbf{y}} ∂y∂z是一个 n × 1 n \times 1 n×1的向量, ∂ y ∂ x \frac{\partial y}{\partial \mathbf{x}} ∂x∂y是一个 n × m n \times m n×m的雅克比矩阵,右边的向量和矩阵是没法直接乘的。
但是假如我们把标量求导的部分都做一个转置,那么维度就可以相容了,也就是:
( ∂ z ∂ x ) T = ( ∂ z ∂ y ) T ∂ y ∂ x (\frac{\partial z}{\partial \mathbf{x}})^T = (\frac{\partial z}{\partial \mathbf{y}})^T\frac{\partial \mathbf{y}}{\partial \mathbf{x}} (∂x∂z)T=(∂y∂z)T∂x∂y
但是毕竟我们要求导的是 ( ∂ z ∂ x ) (\frac{\partial z}{\partial \mathbf{x}}) (