# 6.5.2 微积分中的链式法则

微积分中的链式法则（为了不与概率中的链式法则相混淆）用于计算复合函数的导数。 反向传播是一种计算链式法则的算法，使用高效的特定运算顺序。

## 变量是实数

设$x$是实数，$f$和$g$是从实数映射到实数的函数。 假设$y=g(x)$并且$z=f(g(x))=f(y)$。 那么链式法则是说

$$
\begin{aligned}
\frac{dz}{dx}=\frac{dz}{dy} \frac{dy}{dx} && (6.44)
\end{aligned}
$$

> **\[success]**\
> ![](/files/-M44YiyeGvAK-AGJ1sjW) 同一条链路上两个相邻结点之间的偏导相乘\
> 多条并行链路上的偏导结果相加 ![](/files/-M49IPu439mquHGQg28P)\
> 参数共享的情况，先把3个x当作不同的x来看，算完以后再结果全部加起来。

## 变量是向量

我们可以将这种标量情况进行扩展。 假设$x\in R^m, y\in R^n$，$g$是从$R^m$到$R^n$的映射，$f$是从$R^n$到$R$的映射。 如果$y=g(x)$并且$z=f(y)$，那么

$$
\begin{aligned}
\frac{\partial z}{\partial x\_i} = \sum\_j \frac{\partial z}{\partial y\_j} \frac{\partial y\_j}{\partial x\_i}
\end{aligned}
$$

> **\[success]**\
> 相当于从$x\_i$出发，通过多条路径(所有的$y\_j$)到达z。\
> 多条并行的链路是相加的关系。

使用向量记法，可以等价地写成

$$
\begin{aligned}
\nabla\_{x}z = \left ( \frac{\partial y}{\partial x} \right )^\top \nabla\_{y} z && (6.46)
\end{aligned}
$$

这里$\frac{\partial y}{\partial x}$是$g$的$n\times m$的Jacobian矩阵。

> **\[success]**\
> 公式6.46可以看作是公式6.44的高维形式。\
> $\frac{dz}{dy}$中的z是标量，y是向量，向量对标量的偏导仍是向量，记做$\nabla\_{y} z$\
> $\frac{dy}{dx}$中的y是n维向量，x是m维向量，向量对向量的偏导是[Jacobian矩阵](https://windmissing.github.io/mathematics_basic_for_ML/LinearAlgebra/special_matrix.html)，矩阵大小为$n\times m$。

从这里我们看到，变量$x$的梯度可以通过Jacobian矩阵$\frac{\partial y}{\partial x}$和梯度$\nabla\_{y} z$相乘来得到。 反向传播算法由图中每一个这样的Jacobian梯度的乘积操作所组成。

## 变量是张量

> **\[warning]** 为什么跳过了变量是矩阵

通常我们将反向传播算法应用于任意维度的张量，而不仅仅用于向量。

> **\[success]**\
> 这里的“反向传播算法”是指逆着计算图箭头的方向批量计算偏导的过程。（见6.5.3）\
> 不限于前馈网络中的backprop算法。

从概念上讲，这与使用向量的反向传播完全相同。 唯一的区别是如何将数字排列成网格以形成张量。 我们可以想象，在我们运行反向传播之前，将每个张量变平为一个向量，计算一个向量值梯度，然后将该梯度重新构造成一个张量。 从这种重新排列的观点上看，反向传播仍然只是将Jacobian乘以梯度。

> **\[warning]** ?\[?] 这一段看不懂

为了表示值$z$关于张量$X$的梯度，我们记为$\nabla*X z$，就像$X$是向量一样。 $X$的索引现在有多个坐标——例如，一个3维的张量由三个坐标索引。 我们可以通过使用单个变量$i$来表示完整的索引元组，从而完全抽象出来。 对所有可能的元组$i$，$(\nabla\_X z)\_i$给出$\frac{\partial z}{\partial X\_i}$。 这与向量中索引的方式完全一致，$(\nabla*{x} z)\_i$给出$\frac{\partial z}{\partial x\_i}$。 使用这种记法，我们可以写出适用于张量的链式法则。 如果$Y=g(X)$并且$z=f(Y)$，那么

$$
\begin{aligned}
\nabla\_X z = \sum\_j (\nabla\_X Y\_j)\frac{\partial z}{\partial Y\_j}
\end{aligned}
$$

> **\[warning]** ?\[?] 这一段看不懂


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://windmising.gitbook.io/bible-deeplearning/0introduction/0introduction-2/2chainrule.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
