0
点赞
收藏
分享

微信扫一扫

伴随方法:线性方程的伴随方程(Adjoint Equation)


伴随方法:线性方程的伴随方程(Adjoint Equation)

伴随方法是 Neural-ODE 中十分重要的一个方法,它让一个计算量复杂到基本无法求解的问题变得有可能。在神经网络中嵌套线性方程或者非线性方程也会遇到同样的问题,这篇文章从最简单的例子线性方程中的网络参数求解中,表达一下伴随方法的思想以及一些公式的推导。

假设现在有一个线性系统 ,其中矩阵 和 都是参数 的函数,那么线性系统可以表示为 。在机器学习领域, 和 可以看做是神经网络, 是神经网络的参数,那么自然而然地,我们的目标就是想要求得损失函数关于网络参数 的导数,然后利用梯度下降以及优化算法来训练网络。

对于一个线性方程,有许多的方法来求解得到 ,假设 会作为模型最后的预测结果,那么最终它会输入到一个损失函数 中,可能会有真实标签与其对应。因此,我们最终要求的就是损失函数关于参数的导数 。

因为 和 都是由 决定的,因此 实际上也是 的隐式函数,所以可以写成 。我们假设参数 的维度为 ,即 ,其他的矩阵以及向量的维度分别为 ,,。有得时候损失函数也会是 的函数,因此具体地写出来损失函数就是 .


注意:为了方便各种符号的简化,下面继续表示这些变量的时候,会省略后面的 ,但是读者应该记住这些变量依旧是 的函数,在求导的时候要一直考虑这一项。


我们想要得到的是 ,要注意的是这里表达的是全微分,因此有:

在每一个变量的下面都标上了各自的维度。因为 和 都是一个向量,因此 是一个雅可比矩阵,在这式子当中, 是最难求的。

我们对于线性系统 的两端,都对 进行求导,可以得到:

我们的目标是求出 这一项,对其进行简单的变换:

方程两边同时左乘 的逆,得到:

同样的,我们在变量下面标上对应的维度。要注意的是,这里 和 的维度是不匹配的,但是我们不拘泥于这里,我们关注的点在于如果要通过最直接的方式去求解 所需要的时间是有多大。这里只需要记住,无论如何,括号里面最终得到的矩阵维度为 的大小。同时也不用去过度的关注矩阵 要如何求逆(因为这里是一个神经网络的输出,所以求逆会使得问题变得更为复杂),因为在后面会发现其实没有必要对 求逆。

将式子 (2) 与线性方程 进行对比可以发现,其实这就是由 个线性方程组成的更大的线性方程。求解一个线性方程可以用 LU 分解或者 QR 分解,它们的时间复杂度为 ,时间花费太过于大,对于神经网络来说,参数一多基本无法求解。因此,我们要使用另外一种更为高效的方法 —— 伴随方法,来求解这个问题。

伴随方法(Adjoint Method)

我们观察 (1) 式子以及 (2) 式,会发现实际上 (1) 式的最后一项就是我们想要求的「目标」,那么我们可以将 (2) 代入到 (1) 式中,得到 (3) 式:

我们发现最后括号里面的那一整块维度是 的,而我们最终需要的只是一个 的向量,这说明,实际上我们不需要额外求解 个线性方程,而只需要额外求解 1 个线性方程就能行了。

我们重新把 (3) 式分块来看:

我们令 ,称 为伴随变量(adjoint variable),然后对这个方程进行如下变换:

最后我们得到 (5) 式:

观察 (5) 式不难发现,这其实与 的形式是完全一样的,而且我们不用计算矩阵 的逆,而是直接用它的转置,关于 这一项,利用自动微分可以很简单地计算出来。

这种求解方法就很好地规避了求逆,并且使得问题的维度大大地减小了。对于伴随方法,可以通过以下三步来计算:

第一步:前向求解 ,得到 的解;

第二步:后向求解伴随方程 ,得到伴随变量 ;

第三步:代回原式:

利用这样的伴随方法,只需要求解两个线性系统就可以得到 。而对于 ,这几个矩阵利用自动微分可以更为简单地求得。

参考:

[1] ​​Machine Learning & Simulation. Adjoint Equation of a Linear System of Equations - by implicit derivative. YouTube​​



举报

相关推荐

0 条评论