我发现每次生完病之后,自己总会迷茫一段时间,可能因为打乱了自己的所有计划。以至于现在啥也不想干,但是又比较慌,所以自己得给自己找点事干,要不然估计又快要怀疑人生了。
话不多说了,之前挺好奇TensorFlow是如何实现自动微分的,因为我之前看过的darknet和caffe反向传播过程均是利用矩阵形式的反向传播公式,要是想自定义loss层,必须给定loss关于输出层的偏导数$\delta$(关于这个代表啥,这里不详细解释了),但是像TensorFlow和Pytorch实现了自动微分,你只需要给定loss公式即可,不需要自己求导,感觉还是挺神奇的。上午看了看Hands-on Machine Learning with Scikit-Learn & Tensorflow
这本书,对其中的原理大概有了个理解。下面就把所有内容抄在下面,然后做点笔记。
这个附录解释了 TensorFlow 的自动微分功能是如何工作的,以及它与其他解决方案的对比。
假定你定义了函数$f(x, y) = x^2y + y + 2$,需要得到它的偏导数$\frac{\partial f}{\partial x}$ 和$\frac{\partial f}{\partial y}$,以用于梯度下降或者其他优化算法。你的可选方案有手动微分法,符号微分法,数值微分法,前向自动微分,和反向自动微分。TensorFlow 实现的反向自动微分法。我们来看看每种方案。
首先,在抄袭之前,说明一下在图中使用方框代表变量或常量(不同颜色进行区分),而使用椭圆框表示操作。我之前之所以不太像画反向传播图,就是搞不清楚什么该画什么不该画,如何画。感觉这个教程图画的很好,可以借鉴一下。