机器学习中的矩阵、向量求导

2018-11-25  本文已影响358人  Thinkando

写在前面

本文的目标读者是想快速掌握矩阵、向量求导法则的学习者,主要面向矩阵、向量求导在机器学习中的应用。因此,本教程而非一份严格的数学教材,而是希望帮助读者尽快熟悉相关的求导方法并在实践中应用。在介绍向量求导公式时,本教程中会出现少量证明,但这些证明都很简单,其目的是辅助公式的记忆、提供向量导数计算的实例,请读者不要跳过。另外,本教程假定读者熟悉一元函数的求导。

所谓矩阵求导,本质上只不过是多元函数求导,仅仅是把函数的自变量以及求导的结果排列成了矩阵的形式,方便表达与计算而已。类似地,复合函数的求导法则本质上也是多元函数求导的链式法则,只是将结果整理成了矩阵的形式。从原理上讲,可以对矩阵的每个分量逐元素地求导,得到最终结果;但是这样做太繁琐,极其容易出错,因此推导并记住一些常用的结论在实践中是非常必要的。

矩阵求导本身有很多争议,例如:

因此,本教程的符号体系有可能与其他书籍或讲义不一致,求导结果也可能不一致(例如相差一次矩阵转置,或者是结果矩阵是否平铺成向量等),使用者需自行注意。另外,本教程中有很多笔者自己的评论,例如关于变形的技巧、如何记忆公式、如何理解其他的教程中给出的和本教程中形式不同的结果等。

文中如有错漏,请联系 ruanchong_ruby@163.com,我会尽快订正。

符号表示

变量使用规范

导数符号

导数定义

以前一节规定的符号为基础,根据函数值和自变量的类型,本文对求导结果及其维度进行如下约定:

对上述约定的理解

变量多次出现的求导法则

若某个变量在函数表达式中多次出现,可以单独计算函数对自变量的每一次出现的导数,再把结果加起来。

这条规则很重要,尤其是在推导某些共享变量的模型的导数时很有用,例如 autoencoder with tied weights(编码和解码部分的权重矩阵互为转置的自动编码器)和卷积神经网络(同一个 feature map 中卷积核的权重在整张图不同位置共享)等。

举例(本例中 x 是标量,但该规则对向量和矩阵也是成立的):假设函数表达式是 f(x) = (2x+1)x + x^2,可以先把三个 x 看成三个不同的变量,即把 f 的表达式看成 (2x_1+1)x_2 + x_3^2,然后分别计算 \partial f/\partial x_1 = 2x_2\partial f/\partial x_2 = 2x_1 + 1,和 \partial f/\partial x_3 = 2x_3,最后总的导数就是这三项加起来:2x_2 + (2x_1 + 1) + 2x_3,此时再把 x 的下标抹掉并化简,就得到 6x+1。熟悉这个过程之后,可以省掉添加下标再移除的过程。

如果用计算图(computation graph,描述变量间依赖关系的示意图,后面会举例)的语言来描述本条法则,就是:若变量 x 有多条影响函数 f 的值的路径,则计算 \partial f / \partial x 时需要对每条路经求导最后再加和。 如果想更多地了解计算图和反向传播,推荐阅读 Colah 君的文章。其中详细讲述了计算图如何工作,不仅讲反向传播还讲了前向传播(前向传播对于目前的机器学习算法来说似乎没有太大的用处,但是对于加深计算图的理解很有帮助。RNN 曾经有一种学习算法叫 RTRL 就是基于前向传播的,不过近年来不流行了,被 BPTT 取代了)。

有了上面的基础,我们就可以推导 Batch normalization(以下简称 BN)的求导公式了。 BN 的计算过程为:

image.png

其中 m 是批的大小,x_1x_m 分别是 m 个不同样本对于某个神经元的输入,l 是这个批的总的损失函数,所有变量都是标量。求导的第一步是画出变量依赖图,如下所示(根据左边的变量可以计算出右边的变量,如果为了强调,也可以在边上添加从左向右的箭头):

image.png

左侧,右上,右下分别是三种不同的画法

BN 原论文中给出了反向传播的公式,不过这里我们不妨试着自己手算一遍,加深对计算图的理解。下面的计算暂时不涉及向量/矩阵的求导,只是正常的多元函数求偏导,读者可以放心自己动手算:

常用公式

向量求导的链式法则

实值函数对向量求导

向量数乘求导公式

矩阵迹求导

矩阵求导的链式法则

行列式和逆矩阵求导

常见技巧及注意事项

算例

线性方程组 A\boldsymbol{x}=\boldsymbol{b} 的最小二乘解

F范数的求导公式推导

\begin{align*} \nabla ||XA^T-B||_F^2 & = & \nabla tr((XA^T-B)^T(XA^T-B)) \\ & = & \nabla tr(AX^TXA^T - B^TXA^T - AX^TB + B^TB) \\ & = & \nabla tr(AX^TXA^T) - 2tr(AX^TB) + tr(B^TB)\\ & = & 2tr(XA^TAX^TI) - 2tr(X^TBA) + O \\ & = & 2(I^TX(A^TA)^T + IX(A^TA)) - 2BA \\ & = & 2XA^TA - 2BA \\ & = & 2(XA^T-B)A \end{align*}

PRML (3.33)求导

学习仿射变换

image.png

MLP 的反向传播

RNN 的梯度消失/爆炸问题

Autoencoder with Tied-weight

完整PDF

  1. https://www.mlpod.com/wp-content/uploads/2018/01/matrixvectorderivativesformachinelearning.pdf
上一篇 下一篇

猜你喜欢

热点阅读