update ch03 (#359)

* fix ch03 table

* fix ch03 table

* update ch03-table-test
This commit is contained in:
Jiarong Han
2022-06-01 11:38:30 +08:00
committed by GitHub
parent 8373fb698b
commit 291e7ffd54
2 changed files with 23 additions and 21 deletions

View File

@@ -9,15 +9,16 @@
在计算框架中基础组件包含张量和算子张量是基础数据结构算子是基本运算单元。在数学中定义张量是基于向量与矩阵的推广涵盖标量、向量与矩阵的概念。可以将标量理解为零阶张量向量为一阶张量我们熟悉的RGB彩色图像即为三阶张量。在计算框架中张量不仅存储数据还存储数据类型、数据形状、维度或秩以及梯度传递状态等多个属性如:numref:`tensor_attr`所示,列举了主要的属性和功能。可以通过[代码示例](https://github.com/openmlsys/openmlsys-pytorch/blob/master/chapter_computational_graph/tensor.py)查看张量的属性和部分操作展示
:张量属性
|张量属性|功能|
|:-: |:-:|
| 形状(shape) | 存储张量的每个维度的长度,如[3,3,3] |
| 维度或秩(dim) | 表示张量维度的数量标量为0向量为1、矩阵为2|
| 数据类型(dtype) |表示存储的数据类型如bool、int8、int16、float32、float64等|
| 存储位置(device) | 创建张量时可以指定存储的设备位置如CPU、GPU等|
| 名字(name) | 张量的标识符 |
| 张量属性 | 功能 |
| -------------- | -------|
| 形状(shape) | 存储张量的每个维度的长度,如[3,3,3] |
| 维度或秩(dim) | 表示张量维度的数量标量为0向量为1、矩阵为2 |
| 数据类型(dtype) | 表示存储的数据类型如bool、int8、int16、float32、float64等 |
| 存储位置(device) | 创建张量时可以指定存储的设备位置如CPU、GPU等 |
| 名字(name) | 张量的标识符 |
:label:`tensor_attr`
张量的形状是一个重要的属性它记录了每个轴的长度也就是张量每个维度的元素数量。秩则代表张量的轴数或者阶数。张量中通常可以保存布尔类型、浮点数、整型数以及复数和字符串数据。每一个张量都具有唯一的数据类型在计算过程中会对所有参与运算的张量进行类型检查当发现类型不匹配时就会报错。部分特殊的计算则必须使用指定的数据类型比如逻辑运算应为布尔类型。在部分计算框架中张量的属性中包含可以指明张量存储的设备位置比如存储于CPU、GPU等。张量数据的存储状态可以分为可变和不可变两种不可变张量一般用于用户初始化的数据或者网络模型输入的数据而可变张量则存储网络权重参数根据梯度信息更新自身数据。
@@ -160,7 +161,7 @@ $$
根据链式法则,相应位置的导数乘积即可将网络得到的损失函数梯度信息传播到每一个权重参数,应用优化器的参数权重更新规则,即可达到神经网络模型参数训练迭代的目的。
根据上述公式我们可以得出循环控制的反向梯度计算过程如下,在下面代码中变量的前缀*grad*代表变量梯度变量,*transpose*代表矩阵转置算子。
根据上述公式我们可以得出循环控制的反向梯度计算过程如下,在下面代码中变量的前缀*grad*代表变量梯度变量,*transpose*代表矩阵转置算子。
```python
grad_X2 = matmul(grad_Y, transpose(W2))
grad_W2 = matmul(transpose(X2), grad_Y)

View File

@@ -22,7 +22,7 @@ def model(X, flag):
```
完成前端语言的模型完整构建表达后,执行模型运算时不会直接接收输入数据进行计算,而是使用计算框架的编译器对模型进行编译。由于在进行静态生成编译时并不读取输入数据,此时需要一种特殊的张量来表示输入数据辅助构建完整的计算图,这种特殊张量就被称之为"数据占位符"。在上述的伪代码中输入数据**X**需要使用占位符在静态图中表示。构造伪代码中的条件控制时由于在静态图模式下构建网络并没有执行任何计算对于条件控制在编译阶段并不会进行逻辑运算完成判断因此需要将条件控制算子以及所有的分支计算子图加入计算图中。在执行阶段网络接受数据流入调度条件控制算子时进行逻辑判断控制数据流入不同的分支计算子图中进行后续计算。由于控制流和静态生成的特殊性在部分计算框架中前端语言Python的控制流不能够被正确编译为等价的静态图结构因此需要使用复杂的图内方法实现控制流。
在后续的章节中我们会继续深入了解计算框架静态生成图结构的过程。静态生成的过程是采用计算框架编译器将代码编译为中间表示。计算框架编译器受传统编译器方案启发,设计体系结构包含两部分:编译器前端和编译器后端。中间表示承上启下贯穿前端和后端,是前端源代码和目标硬件代码之间的中间数据格式。在计算框架编译器中中间表示以计算图形式存在,编译器会根据前端神经网络模型自动构建完整的前向计算图和反向计算图。
静态生成的过程是采用计算框架编译器将代码编译为中间表示。计算框架编译器受传统编译器方案启发,设计体系结构包含两部分:编译器前端和编译器后端。中间表示承上启下贯穿前端和后端,是前端源代码和目标硬件代码之间的中间数据格式。在计算框架编译器中中间表示以计算图形式存在,编译器会根据前端神经网络模型自动构建完整的前向计算图和反向计算图。
![静态生成](../img/ch03/static-gen.svg)
:width:`800px`
@@ -79,14 +79,14 @@ def model(X1, X2):
:静态图和动态图对比
|特性|静态图|动态图|
|:---:| :---: | :---: |
| 即时获取中间结果 | | |
| 代码调试难易 | | 简单 |
| 控制流实现方式 | 特定的语法 | 前端语言语法 |
| 性能 | 优化策略多,性能更佳 | 图优化受限,性能较差 |
| 内存占用 | 内存占用少 | 内存占用相对较多 |
| 部署能力 |可直接部署 | 不可直接部署|
| 特性| 静态图 | 动态图 |
| --- | ------- | ------- |
| 即时获取中间结果| 否 | |
| 代码调试难易 | 难 | 易 |
| 控制流实现方式 | 特定的语法 | 前端语言语法 |
| 性能 | 优化策略多,性能更佳 | 图优化受限,性能较差 |
| 内存占用 | 内存占用少 | 内存占用相对较多 |
| 内存占用 | 可直接部署 | 不可直接部署 |
:label:`cmp_dynamic_static`
针对两种模式的特性,结合任务需求选择合适的模式可以事半功倍,学术科研以及模型开发调试阶段,为了快速验证思想和迭代更新模型结构可以选择动态图模式进行构建算法;网络模型确定,为了加速训练过程或者为硬件部署模型,可以选择静态图模式。
@@ -133,11 +133,12 @@ def model(X, flag):
:主流框架动态图转换静态图支持
|框架|动态图转静态图|
| :-:| :---: |
| TensorFlow |@tf_function追踪算子调度构建静态图<br>其中AutoGraph机制可以自动转换控制流为静态表达 |
| MindSpore | context.set_context(mode=context.PYNATIVE_MODE) 动态图模式,<br> context.set_context(mode=context.GRAPH_MODE) 静态图模式,<br>\@ms_function支持基于源码转换 |
| 框架 | 动态图转静态图 |
| :-----------------:| :--------------------------------------------------: |
| TensorFlow |@tf_function追踪算子调度构建静态图<br>其中AutoGraph机制可以自动转换控制流为静态表达 |
| MindSpore | context.set_context(mode=context.PYNATIVE_MODE)动态图模式,<br>context.set_context(mode=context.GRAPH_MODE) 静态图模式,<br>@ms_function支持基于源码转换 |
| PyTorch | torch.jit.script()支持基于源码转换,<br>torch.jit.trace()支持基于追踪转换 |
| PaddlePaddle | paddle.jit.to_static()支持基于源码转换,<br>paddle.jit.TracedLayer.trace()支持基于追踪转换 |
:label:`dynamic_static_switch`