Skip to content

Commit

Permalink
fix typo and change one sentence in ndarray.md (#707)
Browse files Browse the repository at this point in the history
* fix typo in ndarray.md

* change translation in linear-algebra.md
  • Loading branch information
thebesttv authored Mar 26, 2021
1 parent dd8924e commit 4ae3eea
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 21 deletions.
34 changes: 17 additions & 17 deletions chapter_preliminaries/linear-algebra.md
Original file line number Diff line number Diff line change
Expand Up @@ -354,8 +354,8 @@ A.shape, A.sum()
A.shape, tf.reduce_sum(A)
```

默认情况下,调用求和函数会将一个张量在所有轴上汇总为一个标量
我们还可以[**指定求和汇总张量的轴**]。以矩阵为例为了通过求和所有行的元素来汇总行维度(轴0),我们可以在调用函数时指定`axis=0`
默认情况下,调用求和函数会将一个张量沿所有轴汇总为一个标量
我们还可以[**指定张量求和汇总所沿的轴**]。以矩阵为例为了通过求和所有行的元素来汇总行维度(轴0),我们可以在调用函数时指定`axis=0`
由于输入矩阵沿0轴汇总以生成输出向量,因此输入的轴0的维数在输出形状中丢失。

```{.python .input}
Expand Down Expand Up @@ -540,7 +540,7 @@ tf.reduce_sum(x * y)

## 矩阵-向量积

现在我们知道如何计算点积,我们可以开始理解 *矩阵-向量积*(matrix-vector products)。回顾分别在 :eqref:`eq_matrix_def` 和 :eqref:`eq_vec_def` 中定义和可视化的矩阵 $\mathbf{A} \in \mathbb{R}^{m \times n}$ 和向量 $\mathbf{x} \in \mathbb{R}^n$。让我们从可视化矩阵$\mathbf{A}$开始,用它的行向量表示
现在我们知道如何计算点积,我们可以开始理解 *矩阵-向量积*(matrix-vector products)。回顾分别在 :eqref:`eq_matrix_def` 和 :eqref:`eq_vec_def` 中定义并画出的矩阵 $\mathbf{A} \in \mathbb{R}^{m \times n}$ 和向量 $\mathbf{x} \in \mathbb{R}^n$。让我们将矩阵$\mathbf{A}$用它的行向量表示

$$\mathbf{A}=
\begin{bmatrix}
Expand All @@ -550,7 +550,7 @@ $$\mathbf{A}=
\mathbf{a}^\top_m \\
\end{bmatrix},$$

其中每个$\mathbf{a}^\top_{i} \in \mathbb{R}^n$ 都是行向量,表示矩阵的 $i^\mathrm{th}$ 行。[**矩阵向量积 $\mathbf{A}\mathbf{x}$ 是一个长度为 $m$ 的列向量, $i^\mathrm{th}$ 元素是点积 $\mathbf{a}^\top_i \mathbf{x}$**]
其中每个$\mathbf{a}^\top_{i} \in \mathbb{R}^n$ 都是行向量,表示矩阵的第 $i$ 行。[**矩阵向量积 $\mathbf{A}\mathbf{x}$ 是一个长度为 $m$ 的列向量,其第 $i$ 个元素是点积 $\mathbf{a}^\top_i \mathbf{x}$**]

$$
\mathbf{A}\mathbf{x}
Expand All @@ -569,9 +569,9 @@ $$
$$

我们可以把一个矩阵 $\mathbf{A}\in \mathbb{R}^{m \times n}$ 乘法看作是一个从 $\mathbb{R}^{n}$ 到 $\mathbb{R}^{m}$ 向量的转换。这些转换证明是非常有用的。例如,我们可以用方阵的乘法来表示旋转。
我们将在后续章节中讲到,我们也可以使用矩阵向量乘积来描述在给定前一层的值时计算神经网络的每一层所需要的计算
我们将在后续章节中讲到,我们也可以使用矩阵-向量积来描述在给定前一层的值时,求解神经网络每一层所需的复杂计算

在代码中使用张量表示矩阵向量积,我们使用与点积相同的 `dot` 函数。当我们为矩阵 `A` 和向量 `x` 调用 `np.dot(A, x)`时,会执行矩阵向量积。注意,`A` 的列维数(沿轴1的长度)必须与 `x` 的维数(其长度)相同。
在代码中使用张量表示矩阵-向量积,我们使用与点积相同的 `dot` 函数。当我们为矩阵 `A` 和向量 `x` 调用 `np.dot(A, x)`时,会执行矩阵-向量积。注意,`A` 的列维数(沿轴1的长度)必须与 `x` 的维数(其长度)相同。

```{.python .input}
A.shape, x.shape, np.dot(A, x)
Expand Down Expand Up @@ -606,7 +606,7 @@ $$\mathbf{A}=\begin{bmatrix}
b_{k1} & b_{k2} & \cdots & b_{km} \\
\end{bmatrix}.$$

用行向量$\mathbf{a}^\top_{i} \in \mathbb{R}^k$ 表示矩阵$\mathbf{A}$ $i^\mathrm{th}$ 行,并让列向量$\mathbf{b}_{j} \in \mathbb{R}^k$ 作为矩阵$\mathbf{B}$ $j^\mathrm{th}$ 列。要生成矩阵积 $\mathbf{C} = \mathbf{A}\mathbf{B}$,最简单的方法是考虑$\mathbf{A}$的行向量和$\mathbf{B}$的列向量:
用行向量$\mathbf{a}^\top_{i} \in \mathbb{R}^k$ 表示矩阵$\mathbf{A}$的第 $i$ 行,并让列向量$\mathbf{b}_{j} \in \mathbb{R}^k$ 作为矩阵$\mathbf{B}$的第 $j$ 列。要生成矩阵积 $\mathbf{C} = \mathbf{A}\mathbf{B}$,最简单的方法是考虑$\mathbf{A}$的行向量和$\mathbf{B}$的列向量:

$$\mathbf{A}=
\begin{bmatrix}
Expand Down Expand Up @@ -658,12 +658,12 @@ B = tf.ones((4, 3), tf.float32)
tf.matmul(A, B)
```

矩阵矩阵乘法可以简单地称为 **矩阵乘法**,不应与 哈达玛积 混淆。
矩阵-矩阵乘法可以简单地称为 **矩阵乘法**,不应与 哈达玛积 混淆。

## 范数
:label:`subsec_lin-algebra-norms`

线性代数中一些最有用的运算符是 *范数*(norms)。非正式地说,一个向量的*范数*告诉我们一个向量有多大。
线性代数中最有用的一些运算符是 *范数*(norms)。非正式地说,一个向量的*范数*告诉我们一个向量有多大。
这里考虑的 *大小*(size) 概念不涉及维度,而是分量的大小。

在线性代数中,向量范数是将向量映射到标量的函数 $f$。向量范数要满足一些属性。
Expand All @@ -679,12 +679,12 @@ $$f(\mathbf{x} + \mathbf{y}) \leq f(\mathbf{x}) + f(\mathbf{y}).$$

$$f(\mathbf{x}) \geq 0.$$

这是有道理的,因为在大多数情况下,任何东西的最小的*大小*是0。最后一个性质要求最小范数,并且只有由所有零组成的向量才能达到最小范数
这是有道理的,因为在大多数情况下,任何东西的最小的*大小*是0。最后一个性质要求范数最小为0,当且仅当向量全由0组成

$$\forall i, [\mathbf{x}]_i = 0 \Leftrightarrow f(\mathbf{x})=0.$$

你可能会注意到,范数听起来很像距离的度量。如果你还记得小学时的欧几里得距离(想想毕达哥拉斯定理),那么非负性的概念和三角不等式可能会给你一些启发。
事实上,欧几里得距离是一个范数:具体而言,它是 $L_2$ 范数。假设$n$-维向量$\mathbf{x}$中的元素是$x_1, \ldots, x_n$ [**$L_2$ *范数* 是向量元素平方和的平方根:**]
事实上,欧几里得距离是一个范数:具体而言,它是 $L_2$ 范数。假设$n$维向量 $\mathbf{x}$ 中的元素是$x_1, \ldots, x_n$,其 [**$L_2$ *范数* 是向量元素平方和的平方根:**]

(**$$\|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2},$$**)

Expand All @@ -707,7 +707,7 @@ u = tf.constant([3.0, -4.0])
tf.norm(u)
```

在深度学习中,我们更经常地使用平方 $L_2$ 范数。你还会经常遇到 [**$L_1$ 范数,它表示为向量元素的绝对值之和:**]
在深度学习中,我们更经常地使用 $L_2$ 范数的平方。你还会经常遇到 [**$L_1$ 范数,它表示为向量元素的绝对值之和:**]

(**$$\|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right|.$$**)

Expand All @@ -731,11 +731,11 @@ $L_2$ 范数和 $L_1$ 范数都是更一般的$L_p$范数的特例:

$$\|\mathbf{x}\|_p = \left(\sum_{i=1}^n \left|x_i \right|^p \right)^{1/p}.$$

类似于向量的$L_2$ 范数,[**矩阵**] $\mathbf{X} \in \mathbb{R}^{m \times n}$ (***弗罗贝尼乌斯范数*(Frobenius norm) 是矩阵元素的平方和的平方根**)
类似于向量的$L_2$ 范数,[**矩阵**] $\mathbf{X} \in \mathbb{R}^{m \times n}$ (***弗罗贝尼乌斯范数*(Frobenius norm) 是矩阵元素平方和的平方根**)

(**$$\|\mathbf{X}\|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2}.$$**)

弗罗贝尼乌斯范数满足向量范数的所有性质。它的行为就好像它是矩阵形向量的 $L_2$ 范数。调用以下函数将计算矩阵的弗罗贝尼乌斯范数。
弗罗贝尼乌斯范数满足向量范数的所有性质。它就像是矩阵形向量的 $L_2$ 范数。调用以下函数将计算矩阵的弗罗贝尼乌斯范数。

```{.python .input}
np.linalg.norm(np.ones((4, 9)))
Expand All @@ -757,14 +757,14 @@ tf.norm(tf.ones((4, 9)))
虽然我们不想走得太远,但我们可以对这些概念为什么有用有一些直觉。在深度学习中,我们经常试图解决优化问题:
*最大化* 分配给观测数据的概率;
*最小化* 预测和真实观测之间的距离。
为物品(如单词、产品或新闻文章)分配向量表示,以便最小化相似项目之间的距离,最大化不同项目之间的距离。
用向量表示物品(如单词、产品或新闻文章),以便最小化相似项目之间的距离,最大化不同项目之间的距离。
通常,目标,或许是深度学习算法最重要的组成部分(除了数据),被表达为范数。


## 关于线性代数的更多信息

就在这一部分,我们已经教会了你们所有的线性代数,你们将需要这些线性代数来理解大量的现代深度学习
线性代数还有很多,其中很多数学对于机器学习非常有用。例如,矩阵可以分解为因子,这些分解可以显示真实世界数据集中的低维结构。机器学习的整个子领域都侧重于使用矩阵分解及其向高阶张量的泛化来发现数据集中的结构并解决预测问题。但这本书的重点是深度学习。我们相信,一旦你开始动手尝试在真实数据集上应用了有效的机器学习模型,你会更倾向于学习更多数学。因此,虽然我们保留在后面介绍更多数学知识的权利,但我们将在这里结束这一部分
仅用一节,我们就教会了你所需的,用以理解大量的现代深度学习的全部线性代数
线性代数还有很多,其中很多数学对于机器学习非常有用。例如,矩阵可以分解为因子,这些分解可以显示真实世界数据集中的低维结构。机器学习的整个子领域都侧重于使用矩阵分解及其向高阶张量的泛化来发现数据集中的结构并解决预测问题。但这本书的重点是深度学习。我们相信,一旦你开始动手尝试并在真实数据集上应用了有效的机器学习模型,你会更倾向于学习更多数学。因此,虽然我们保留在后面介绍更多数学知识的权利,但我们这一节到此结束

如果你渴望了解有关线性代数的更多信息,你可以参考 [线性代数运算的在线附录](https://d2l.ai/chapter_appendix-mathematics-for-deep-learning/geometry-linear-algebraic-ops.html) 或其他优秀资源 :cite:`Strang.1993,Kolter.2008,Petersen.Pedersen.ea.2008`

Expand Down
8 changes: 4 additions & 4 deletions chapter_preliminaries/ndarray.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ tf.constant([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

这本书不是关于软件工程的。我们的兴趣不仅仅限于从数组读取和写入数据。我们想在这些数组上执行数学运算。一些最简单且最有用的操作是 *按元素*(elementwise) 操作。它们将标准标量运算符应用于数组的每个元素。对于将两个数组作为输入的函数,按元素运算将二元运算符应用于两个数组中的每对位置对应的元素。我们可以基于任何从标量到标量的函数来创建按元素函数。

在数学表示法中,我们将通过符号 $f: \mathbb{R} \rightarrow \mathbb{R}$ 来表示 *一元* 标量运算符(只接收一个输入)。这意味着该函数从任何实数($\mathbb{R}$)映射到另一个实数。同样,我们通过符号 $f: \mathbb{R}, \mathbb{R} \rightarrow \mathbb{R}$ 表示 *二元* 标量运算符,这意味着该函数接收两个输入,并产生一个输出。给定同一形状的任意两个向量$\mathbf{u}$和$\mathbf{v}$ 和二元运算符 $f$,我们可以得到向量$\mathbf{c} = F(\mathbf{u},\mathbf{v})$。具体计算方法是$c_i \gets f(u_i, v_i)$ ,其中 $c_i$、u_i$ 和 $v_i$ 分别是向量$\mathbf{c}$、$\mathbf{u}$ 和 $\mathbf{v}$中的元素。在这里,我们通过将标量函数升级为按元素向量运算来生成向量值 $F: \mathbb{R}^d, \mathbb{R}^d \rightarrow \mathbb{R}^d$。
在数学表示法中,我们将通过符号 $f: \mathbb{R} \rightarrow \mathbb{R}$ 来表示 *一元* 标量运算符(只接收一个输入)。这意味着该函数从任何实数($\mathbb{R}$)映射到另一个实数。同样,我们通过符号 $f: \mathbb{R}, \mathbb{R} \rightarrow \mathbb{R}$ 表示 *二元* 标量运算符,这意味着该函数接收两个输入,并产生一个输出。给定同一形状的任意两个向量$\mathbf{u}$和$\mathbf{v}$ 和二元运算符 $f$,我们可以得到向量$\mathbf{c} = F(\mathbf{u},\mathbf{v})$。具体计算方法是$c_i \gets f(u_i, v_i)$ ,其中 $c_i$、$u_i$ 和 $v_i$ 分别是向量$\mathbf{c}$、$\mathbf{u}$ 和 $\mathbf{v}$中的元素。在这里,我们通过将标量函数升级为按元素向量运算来生成向量值 $F: \mathbb{R}^d, \mathbb{R}^d \rightarrow \mathbb{R}^d$。

对于任意具有相同形状的张量,[**常见的标准算术运算符(`+``-``*``/``**`)都可以被升级为按元素运算**]。我们可以在同一形状的任意两个张量上调用按元素操作。在下面的例子中,我们使用逗号来表示一个具有5个元素的元组,其中每个元素都是按元素操作的结果。

Expand Down Expand Up @@ -219,8 +219,8 @@ tf.exp(x)

除了按元素计算外,我们还可以执行线性代数运算,包括向量点积和矩阵乘法。我们将在 :numref:`sec_linear-algebra` 中解释线性代数的重点内容(不需要先修知识)。

[**我们也可以把多个张量连结在一起**],把它们端对端地叠起来形成一个更大的张量。
我们也可以 *连结*(concatenate) 多个张量在一起,将它们端到端堆叠以形成更大的张量。我们只需要提供张量列表,并给出沿哪个轴连结。下面的例子分别演示了当我们沿行(轴-0,形状的第一个元素)和按列(轴-1,形状的第二个元素)连结两个矩阵时会发生什么情况。我们可以看到,第一个输出张量的轴-0长度 ($6$) 是两个输入张量轴-0长度的总和 ($3 + 3$);第二个输出张量的轴-1长度 ($8$) 是两个输入张量轴-1长度的总和 ($4 + 4$)。
[**我们也可以把多个张量 *连结*(concatenate) 在一起**],把它们端对端地叠起来形成一个更大的张量。
我们只需要提供张量列表,并给出沿哪个轴连结。下面的例子分别演示了当我们沿行(轴-0,形状的第一个元素)和按列(轴-1,形状的第二个元素)连结两个矩阵时会发生什么情况。我们可以看到,第一个输出张量的轴-0长度 ($6$) 是两个输入张量轴-0长度的总和 ($3 + 3$);第二个输出张量的轴-1长度 ($8$) 是两个输入张量轴-1长度的总和 ($4 + 4$)。

```{.python .input}
X = np.arange(12).reshape(3, 4)
Expand Down Expand Up @@ -428,7 +428,7 @@ computation(X, Y)
## 转换为其他 Python 对象

[**转换为 NumPy 张量**]很容易,反之也很容易。转换后的结果不共享内存。
这个小的不便实际上是非常重要的:当你在 CPU 或 GPU 上执行操作的时候,此时Python的NumPy包也希望使用相同的内存块执行其他操作时,你不希望停止计算
这个小的不便实际上是非常重要的:当你在 CPU 或 GPU 上执行操作的时候,如果 Python 的 NumPy 包也希望使用相同的内存块执行其他操作,你不希望停下计算来等它


```{.python .input}
Expand Down

0 comments on commit 4ae3eea

Please sign in to comment.