homework1真正开始实现needle library,我们将先理解needle如何构建计算图,然后实现几个常用的算子的compute和gradient操作。这之后,利用DFS拓扑排序获得构建的计算图的拓扑序,有了拓扑序也就知道了反向传播偏导的节点计算顺序。拥有了上面的实现后,实现整体的反向模式自动微分算法,这个算法根据计算图的反向拓扑序从后往前计算出所有节点的gradient。

更进一步,我们可以用已经实现的needle的前向计算和反向传播实现一个softmax loss函数。将用上needle来实现homework1的两层神经网络的前向计算和反向求导。

为了方便debug,我将needle的核心文件都放入一个repo,可以直接从命令行运行测试,且提供了vscode config来debug不同测试。hw1 branch是初始状态的作业,可以直接从hw1 branch开始编写和测试代码。

Needle

Value类

表示计算图中的每个节点,每个value有如下一些结构,

class 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

image.png

Op类

needle库的计算执行流程:

当x1和x2是两个needle Tensor的时候,x1 + x2如何执行?