自动求导
要想熟练掌握深度学习,我觉得有必要先来了解一下什么是计算图,在反向传播过程中,我们最重要的一件事就是求梯度(俗称:求导)。而反向传播的求梯度过程,就是通过计算图实现的!
什么是计算图
通俗来讲,计算图就是把数学表达式用图的方式描绘出来(由于我极其讨厌专业术语,个人觉得这是增大我们学习者学习难度的东西,所以很多东西我都会先转化为我自己可以理解的东西,当然,我也会先提一手专业术语,然后用自己能理解的语言代替,大家可能难以理解,但还请见谅),嗯,这么说来,所谓的计算图,其实也就是一个数学表达式的图画版,换言之,其主要表达的意义,就是一个数学表达式。那么,下面我们来举个例子,帮助大家深入理解计算图:
现有表达式:z= a(bx + c) + dy
其计算图形式就应该如下:
利用计算图求导
现在我们已经得到了计算图,怎么利用计算图进行求导呢。之前在网上瞎逛的时候,看到一个解释挺好的:
If one wants to understand derivatives in a computational graph, the key is to understand derivatives on the edges. If a directly affects c, then we want to know how it affects c. If a changes a little bit, how does c change? We call this the partial derivative of c with respect to a.
我去,居然是英语,你可能顿时就不想看了,我也不想看,那用咱们老实人的话应该怎么说呢:求偏导!没错,上面那段话的中心思想就是求偏导。对每一条边进行求偏导。例如,上图(自己画的,有点丑)中(????= ????(???????? + ????) + ????y),z的值是直接被m与n影响的,那么,m又是如何影响到z的呢
可见,z与m是成正相关的,而且比例系数是1,即其他条件不变的情况下,m怎么变,便多少,z就怎么变,变多少。(我去,如此简单的求偏导,我居然可以写出作文的感觉,服了)
同理,z对n的偏导求法也是一样的。
但是,只是对直接影响的关系求偏导没什么用啊,还不如数学表达式来的痛快,计算图可以轻松的求出间接关系之间的偏导,比如,我现在要求z对x的偏导(即:x对z的影响),那么计算图的计算过程是先求出z对m,对n的偏导(虽然n与x无关,但是只从n看不出来啊),结果标记在对应的边上,再从m向子节点求偏导(对x求偏导),然后结果写在边上,最后把从x开始的边到z结束的边上的值相乘(分叉就加)就可以得出结果了。好吧,把我自己给整糊涂了,直接上图:
但是实际上,这样的求法对于简单的一些运算表达式还可以,假设有一个及其复杂的运算图,从根节点到第一层子节点有a条路径
从第一层到第二层又有b条路径····,那么一共需要计算(不考虑求每条边上的导数值)的就会是a*b*····,这种计算开销还是非常大的,而实际利用机器学习来计算梯度的时候,我们会采用路径分解的方法,给每一条路径加上一个权值,比如z对m求导路径的权重设为0.5 z对n的权重0.5,然后加权求和,再进行运算。好吧,我已经感觉到自己讲不清楚这一块了,直接贴链接吧:http://colah.github.io/posts/2015-08-Backprop/
这部分等我再研读一下再说吧。
小结
其实反向传播的过程就是一个链式求导的过程,只不过我水平有限,暂时无法讲清楚,各位有什么好的思路可以在评论区写出来大家一起探讨。