不知道这个问题是否属于这里,但它与优化中的梯度方法密切相关,在这里似乎很热门。无论如何,如果您认为其他社区对此主题有更好的专业知识,请随时迁移。
简而言之,我正在寻找反向模式自动微分的分步示例。关于该主题的文献不多,并且在不了解其背后的理论的情况下,很难理解现有的实现(例如TensorFlow中的内容)。因此,如果有人能详细显示我们传入的内容,我们如何处理它以及从计算图中得出的内容,我将非常感激。
我最难解决的几个问题:
不知道这个问题是否属于这里,但它与优化中的梯度方法密切相关,在这里似乎很热门。无论如何,如果您认为其他社区对此主题有更好的专业知识,请随时迁移。
简而言之,我正在寻找反向模式自动微分的分步示例。关于该主题的文献不多,并且在不了解其背后的理论的情况下,很难理解现有的实现(例如TensorFlow中的内容)。因此,如果有人能详细显示我们传入的内容,我们如何处理它以及从计算图中得出的内容,我将非常感激。
我最难解决的几个问题:
Answers:
假设我们有表达式并想找到导数和。反向模式AD将此任务分为两部分,即正向和反向传递。
首先,我们将复杂的表达式分解为一组原始表达式,即最多由单个函数调用组成的表达式。请注意,尽管没有必要,我也重命名了输入和输出变量以保持一致性:
这种表示的优点是,每个单独表达式的区分规则都是已知的。例如,我们知道导数是,所以。我们将在下面的反向传递中使用此事实。
本质上,前向传递包括评估每个表达式并保存结果。假设我们的输入是:和。然后我们有:
这是魔术的开始,它是从连锁法则开始的。链式规则以其基本形式表示,如果您有变量取决于,而u又取决于,则:
或者,如果通过多个路径/变量u i依赖于,例如:
然后(请参见此处的证明):
就表达式图而言,如果我们有一个最终节点和输入节点,并且从到路径经过中间节点(即,其中),我们可以找到导数为
换句话说,要计算任何中间变量或输入变量w i的输出变量的导数,我们只需要知道其父代的导数和计算原始表达式w p = f (w i)的导数的公式即可。
反向通过从末尾开始(即)并向后传播到所有依赖项。这里有(“种子”的表达式):
这可以被理解为“在变革在完全一样的变化结果 ”,这是相当明显的。
那么我们知道,所以:
线性取决于和,所以和
From definition and rules of partial derivatives, we find that . Thus:
Which, as we already know from forward pass, is:
Finally, contributes to via and . Once again, from the rules of partial derivatives we know that and . Thus:
And again, given known inputs, we can calculate it:
Since and are just aliases for and , we get our answer:
And that's it!
This description concerns only scalar inputs, i.e. numbers, but in fact it can also be applied to multidimensional arrays such as vectors and matrices. Two things that one should keep in mind when differentiating expressions with such objects:
The power of automatic differentiation is that it can deal with complicated structures from programming languages like conditions and loops. However, if all you need is algebraic expressions and you have good enough framework to work with symbolic representations, it's possible to construct fully symbolic expressions. In fact, in this example we could produce expression and calculate this derivative for whatever inputs we want.