机器学习入门(10)— 浅显易懂的计算图、链式法则讲解

1. 计算图概念

计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。

2. 计算图求解

问题 1:小明在超市买了 2 个 100 日元一个的苹果,消费税是 10%,请计算支付金额。

计算图通过节点和箭头表示计算过程。节点用○表示,○中是计算的内容。将计算的中间结果写在箭头的上方,表示各个节点的计算结果从左向右传递。用计算图解问题1,求解过程如图5-1 所示。
机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第1张图片
虽然图 5-1 中把“× 2”“× 1.1”等作为一个运算整体用○括起来了,不过只用○表示乘法运算“×”也是可行的。此时,如图5-2 所示,可以将“2”和“1.1”分别作为变量“苹果的个数”和“消费税”标在○外面。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第2张图片
问题 2:小明在超市买了2 个苹果、3 个橘子。其中,苹果每个100 日元,橘子每个150 日元。消费税是10%,请计算支付金额。

使用计算图求解过程如下:
机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第3张图片
综上,用计算图解题的情况下,需要按如下流程进行。
1. 构建计算图。
2. 在计算图上,从左向右进行计算。

这里的第 2 歩“从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation。正向传播是从计算图出发点到结束点的传播。

既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation。反向传播将在接下来的导数计算中发挥重要作用。

3. 计算图特点

计算图的特征是可以通过传递“局部计算”获得最终结果。“局部”这个词的意思是“与自己相关的某个小范围”。局部计算是指,无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果。

用一个具体的例子来说明局部计算。比如,在超市买了 2 个苹果和其他很多东西。此时,可以画出如图5-4 所示的计算图。
机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第4张图片
如图 5-4 所示,假设(经过复杂的计算)购买的其他很多东西总共花费 4000 日元。这里的重点是,各个节点处的计算都是局部计算。这意味着,例如苹果和其他很多东西的求和运算(4000 + 200→4200)并不关心4000 这个数字是如何计算而来的,只要把两个数字相加就可以了。换言之,各个节点处只需进行与自己有关的计算(在这个例子中是对输入的两个数字进行加法运算),不用考虑全局。

综上,计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。虽然局部计算非常简单,但是通过传递它的计算结果,可以获得全局的复杂计算的结果。

4. 计算图最大优点

使用计算图最大的原因是,可以通过反向传播高效计算导数。

问题 1 中,我们计算了购买 2 个苹果时加上消费税最终需要支付的金额。这里,假设我们想知道苹果价格的上涨会在多大程度上影响最终的支付金额,即求“支付金额关于苹果的价格的导数”。设苹果的价格为x,支付金额为L,则相当于求。这个导数的值表示当苹果的价格稍微上涨时,支付金额会增加多少。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第5张图片
如图 5-5 所示,反向传播使用与正方向相反的箭头(粗线)表示。反向传播传递“局部导数”,将导数的值写在箭头的下方。在这个例子中,反向传播从右向左传递导数的值(1→1.1→2.2)。

从这个结果中可知,“支付金额关于苹果的价格的导数”的值是 2.2。这意味着,如果苹果的价格上涨 1 日元,最终的支付金额会增加 2.2 日元(严格地讲,如果苹果的价格增加某个微小值,则最终的支付金额将增加那个微小值的 2.2 倍)

综上,计算图的优点是,可以通过正向传播和反向传播高效地计算各个变量的导数值。

5. 计算图的反向传播

假设存在 y = f(x) 的计算,这个计算的反向传播如图 5-6 所示。
机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第6张图片
如图所示,反向传播的计算顺序是,将信号 E 乘以节点的局部导( ∂ y ∂ x \frac{\partial y}{\partial x} xy),然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中 y = f(x) 的导数,也就是 y 关于 x 的导数( ∂ y ∂ x \frac{\partial y}{\partial x} xy )。

比如,假设 y = f(x) = x2,则局部导数为 ∂ y ∂ x \frac{\partial y}{\partial x} xy= 2x。把这个局部导数乘以上游传过来的值(本例中为E),然后传递给前面的节点。

这就是反向传播的计算顺序。通过这样的计算,可以高效地求出导数的值,这是反向传播的要点。

6. 链式法则

复合函数是由多个函数构成的函数。比如,z = (x + y)2 是由式(5.1)所示的两个式子构成的。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第7张图片
链式法则是关于复合函数的导数的性质,定义如下。

如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第8张图片
总结一句话:大学课本中的多元函数求导过程。

7. 链式法则和计算图

尝试将式(5.4)的链式法则的计算用计算图表示出来。如果用“**2”节点表示平方运算的话,则计算图如图 5-7 所示。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第9张图片
如图所示,计算图的反向传播从右到左传播信号。反向传播的计算顺序是,先将节点的输入信号乘以节点的局部导数(偏导数),然后再传递给下一个节点。

比如,反向传播时,“**2”节点的输入是 ∂ z ∂ x \frac{\partial z}{\partial x} xz,将其乘以局部导数 ∂ z ∂ t \frac{\partial z}{\partial t} tz(因为正向传播时输入是 t、输出是 z,所以这个节点的局部导数是 ∂ z ∂ t \frac{\partial z}{\partial t} tz),然后传递给下一个节点。

另外,图5-7 中反向传播最开始的信号 ∂ z ∂ z \frac{\partial z}{\partial z} zz 在前面的数学式中没有出现,这是因为 ∂ z ∂ z \frac{\partial z}{\partial z} zz=1,所以在刚才的式子中被省略了。

图 5-7 中需要注意的是最左边的反向传播的结果。根据链式法则 ∂ z ∂ z \frac{\partial z}{\partial z} zz ∂ z ∂ t \frac{\partial z}{\partial t} tz ∂ t ∂ x \frac{\partial t}{\partial x} xt = ∂ z ∂ t \frac{\partial z}{\partial t} tz ∂ t ∂ x \frac{\partial t}{\partial x} xt = ∂ z ∂ x \frac{\partial z}{\partial x} xz,成立,对应 “ z 关于 x 的导数”。也就是说,反向传播是基于链式法则的。

把式(5.3)的结果代入到图 5-7 中,结果如图 5-8 所示, 的结果为2(x + y)。

机器学习入门(10)— 浅显易懂的计算图、链式法则讲解_第10张图片

数学表达式参考:https://www.cnblogs.com/jngwl/articles/10096017.html

参考:《深度学习入门:基于Python的理论与实现》

你可能感兴趣的:(Machine,Learning)