正向自动微分

上面的过程只需要如下代码便能实现,在求出 f 的同时还能同步算好对 x1 的偏导,但是缺点也很明显,没办法同时求出对 x1 和 x2 的偏导。
const auto x1 = ad::FTangent(2, 1);
const auto x2 = ad::FTangent(5, 0);
const auto fx = ad::ln(x1) + x1 * x2 - ad::sin(x2);对 fx 的打印结果如下:

实现
forward_mode_tensor.h forward_mode_tensor.cpp
遗憾 反向自动微分
学了几天,反向自动微分的原理倒是搞懂了,但是怎么实现真的是一头雾水,搜来搜去看到的东西越来越高深,有点被打击到了,放下吧,来日若有机会再搞。
貌似也没那么难,反正是搞出来了。主要还是构建计算图等等
主要思路
因为要放计算图就在 Tensor 类中放一个 static 的 PtrGraph,每有一个新的原子操作就在重载的操作符中 new 一个新的 Tensor 放到计算图中,由于这是一个有向图,所以通过逆邻接表能很容易完成反向传播梯度的操作。
ad::Tensor x1 = ad::tensor(2);
ad::Tensor x2 = ad::tensor(5);
ad::Tensor f = ad::ln(x1) + x1 * x2 - ad::sin(x2);
f.Backward();
实现
“PtrGraph.h”在图