homework1真正开始实现needle library,我们将先理解needle如何构建计算图,然后实现几个常用的算子的compute和gradient操作。这之后,利用DFS拓扑排序获得构建的计算图的拓扑序,有了拓扑序也就知道了反向传播偏导的节点计算顺序。拥有了上面的实现后,实现整体的反向模式自动微分算法,这个算法根据计算图的反向拓扑序从后往前计算出所有节点的gradient。
更进一步,我们可以用已经实现的needle的前向计算和反向传播实现一个softmax loss函数。将用上needle来实现homework1的两层神经网络的前向计算和反向求导。
为了方便debug,我将needle的核心文件都放入一个repo,可以直接从命令行运行测试,且提供了vscode config来debug不同测试。hw1 branch是初始状态的作业,可以直接从hw1 branch开始编写和测试代码。
表示计算图中的每个节点,每个value有如下一些结构,
inputs:当前节点的前序节点。下图中的V4的inputs就是V2和V3.op:表示对inputs所有Value的输出的操作。当节点表示原始输入,op = Nonecached_data:缓存当前节点inputs和op计算后的结果。requires_grad:当前节点是否需要计算gradient,默认是trueclass Value:
"""A value in the computational graph."""
# trace of computational graph
op: Optional[Op]
inputs: List["Value"]
# The following fields are cached fields for
# dynamic computation
cached_data: NDArray
requires_grad: bool

compute和gradient函数。当x1和x2是两个needle Tensor的时候,x1 + x2如何执行?