15.3_函数的优先级

15.3 函数的优先级

funcs列表包含了接下来要处理的候选函数列表,但现在的做法是(直接)取出候选列表中的最后一个元素。当然,我们需要的是从funcs列表中取出合适的函数。拿刚才的例子来说,我们要从[B,A]列表中取出更接近输出方的B。解决这个问题的办法是给函数赋予优先级。如果B的优先级比A的优先级高,就可以先取出B。

应当如何设置优先级呢?其中一种方法是“解析”给定的计算图。比如可以使用一种叫作“拓扑排序”的算法,根据节点的连接方式给节点排序。这种排好的顺序就是优先级。还有一种不依赖该算法的简单方法,这种方法我们见过。

我们见过在进行普通计算(即正向传播)时,函数生成变量的过程。换言之,我们已经知道了哪个函数生成了哪个变量。由此,我们可以按照图15-8的方式记录函数和变量的“辈分”关系。


图15-8 正向传播中函数和变量的“辈分”关系

图15-8所示的“辈分”关系正好与优先级相对应。在反向传播时,如果按照从后代到先代的顺序处理,就可以保证“子辈”在“父辈”之前被取出。以图15-8为例,在函数B和函数A之间做选择时,会先取出“后代”B。以上就是按照正确的顺序进行反向传播的方法,在下一个步骤,我们将实现这种方法。

步骤16

复杂的计算图(实现篇)

本步骤将实现上一步骤提到的方法。首先在正向传播中实现“辈分”的设置,然后在反向传播中,按照从后代到先代的顺序取出函数。修改完成后,无论计算图多么复杂,反向传播都会按照正确的顺序进行。