计算图(computational graph)
/ kom-pyoo-TAY-shun-ul graf /
计算图,是一张计算的地图,画成一张由方框和箭头组成的网络。每个方框是一个单一的小运算——一次加法、一次乘法、施加一个激活函数——每个箭头则标示它的结果接下来流向何处。你不再把一个大公式当作一团缠绕的乱麻,而是把它拆成这些细小的步骤,再摆出它们如何相连。这有点像把一份菜谱写成流程图:这一步用上那一步的产出,而那一步又用上更早两步的产出。
何必如此?因为一旦把一项计算摊开成一张图,计算机就能机械地对它进行推理。一个神经网络整个的前向传播——数以百万计的乘法和加法——就是一张巨大的计算图,从一端的输入,一直到另一端的损失(误差)。现代的深度学习工具会在你写普通代码时自动构建这张图,然后用它高效地执行计算,往往还会把计算铺开到许多处理器上。
这张图真正的超能力,在于让学习成为可能。要改进,网络需要知道每个权重的微小改变会如何影响最终的误差。沿着图一步步往回走,在每个方框处运用微积分的链式法则,就能让计算机自动而精确地算出所有这些敏感度。这趟反向行走就是自动微分,它正是反向传播底下的引擎。若没有一张图可循,要训练带着数以百万计参数的网络,简直就是无望之事。
拿一个小表达式 (a + b) × c 来说。它的图里有三个输入方框 a、b、c;一个取 a 和 b 的「+」方框;以及一个取这个和与 c 的「×」方框。要弄清当 a 轻微抖动时最终答案改变多少,你只需从输出沿箭头往回走,在每个方框处把局部的影响相乘。把这个想法放大到数以百万计的方框,你就得到了神经网络学习的方式。
计算图把任何公式拆成相互连接的细小步骤,你可以沿它向前走,也可以向后走。
同一张图会被沿两个方向遍历:向前走算出答案,向后走算出该如何改进它。正是这种可复用的结构,让自动微分、进而让训练,在大规模上切实可行。