第 291 题:实现一个简化版TensorFlow的自动微分。
题目
实现一个简化版TensorFlow的自动微分。
完整讲解
一、自动微分的含义
- 自动微分(Autodiff):给定计算图与目标对某变量的导数,自动求出图中所有节点对该变量的梯度;用于训练神经网络。反向模式即从输出反向传播梯度,一次反向得到所有参数梯度,与 TensorFlow/PyTorch 类似。
二、计算图与反向传播
- 计算图:将计算表示为有向图,节点为张量或操作(加减乘、激活等),边为依赖。前向执行时记录依赖与中间结果;反向时按拓扑逆序,对每个节点用链式法则把「输出对当前节点的梯度」传给输入,并累加多出边时的梯度。
- 链式法则:若 $y = f(u), u = g(x)$,则 $\frac{\partial y}{\partial x} = \frac{\partial y}{\partial u} \frac{\partial u}{\partial x}$。对每个 op 定义反向规则:已知输出梯度,求输入梯度。例如 multiply(a,b) 的反向为 grad_a = grad_output * b,grad_b = grad_output * a。
三、简化版实现要点
- 数据结构:节点存 value、op 类型、输入节点指针;边即输入输出关系。前向时递归或拓扑执行,并建反向边(或记录依赖)。
- 反向:从 loss 节点开始,队列或栈按拓扑逆序访问;对每个节点根据 op 类型计算输入梯度并累加到输入节点的 grad;需处理多路使用同一节点时的梯度累加。
- 典型 op:matmul、add、relu、softmax 等各有标准反向公式;可先实现标量/小规模再扩展为张量(按元素或广播)。
- 与 TensorFlow 的简化:不需完整 API,只需「建图→前向→反向→取梯度」的闭环;可固定 dtype 与 shape 简化实现。
面试要点
- 能说清自动微分(反向模式)的目的与计算图、链式法则的关系。
- 能写出若干 op 的反向规则(如 multiply、matmul、relu);能说明简化版实现的数据结构与反向遍历顺序、梯度累加。
记忆要点
- 自动微分:计算图+反向传播;每 op 定义反向规则(输出梯度→输入梯度);反向按拓扑逆序、多路累加。
- 简化版:节点存 value/op/输入;前向建图,反向从 loss 遍历并累加 grad。