update chapter 2 (#137)

* update chapter 2

* Update neural_network_layer.md

Co-authored-by: Cheng Lai <laicheng_VIP@163.com>
Co-authored-by: Dalong <39682259+eedalong@users.noreply.github.com>
This commit is contained in:
Jia
2022-03-20 10:01:08 +08:00
committed by GitHub
parent 93ae5a489e
commit 0be67c508d
4 changed files with 5 additions and 4 deletions

View File

@@ -12,7 +12,7 @@ Threads也被广大开发者所接受。因此许多的机器学习用户
然而机器学习模型往往需要针对部署场景数据类型识别任务等需求进行深度定制而这类定制任务需要被广大的AI应用领域的开发者所实现。这类开发者的背景多样其往往不具有熟练使用C和C++的背景因此Caffe这一类库与C和C++深度绑定的编程模型快速成为了制约这一类框架快速推广的巨大瓶颈。
在2016年谷歌率先推出了TensorFlow。相比于传统的CaffeTorch和TheanoTensorFlow提出利用高层次编程语言Python作为面向用户的主要前端语言而利用C和C++实现高性能后端。大量基于Python的前端API确保了TensorFlow可以被大量的数据科学家和机器学习科学家接受同时帮助TensorFlow能够快速融入Python为主导的大数据生态大量的大数据开发库如NumpyPandasScrapy,
在2016年谷歌率先推出了TensorFlow。相比于传统的CaffeTorch和TheanoTensorFlow提出利用高层次编程语言Python作为面向用户的主要前端语言而利用C和C++实现高性能后端。大量基于Python的前端API确保了TensorFlow可以被大量的数据科学家和机器学习科学家接受同时帮助TensorFlow能够快速融入Python为主导的大数据生态大量的大数据开发库如NumpyPandasSciPy
Matplotlib和PySpark。同时Python具有出色的和C语言的互操作性这种互操作性已经在多个Python库中得到验证。因此TensorFlow兼有Python的灵活性和生态同时也通过C/C++后端得以实现高性能。这种设计在日后崛起的PyTorchMXNet和CNTK的机器学习框架得到传承。
随着多个机器学习框架的出现Keras和TensorLayer等高层次机器学习开发库提供了更高层次的Python

View File

@@ -1,6 +1,6 @@
# 编程接口
现代机器学习框架包含大量的组件。这些组件使得用户得以高效开发机器学习算法处理数据部署模型性能调优和使用硬件加速器。在设计这些组件的编程接口时一个核心的诉求是如何平衡框架性能和易用性为了达到最优的性能开发者需要利用硬件亲和的编程语言如C和C++来进行开发。这是因为C和C++的使用使得机器学习框架可以高效硬件的底层API从而最大限度发挥硬件。同时现代操作系统如Linux和Windows提供丰富的基于C和C++的编程接口如文件系统网络编程多线程管理等通过直接调用操作系统API可以降低框架运行的开销。
现代机器学习框架包含大量的组件。这些组件使得用户得以高效开发机器学习算法处理数据部署模型性能调优和使用硬件加速器。在设计这些组件的编程接口时一个核心的诉求是如何平衡框架性能和易用性为了达到最优的性能开发者需要利用硬件亲和的编程语言如C和C++来进行开发。这是因为C和C++的使用使得机器学习框架可以高效调用硬件的底层API从而最大限度发挥硬件性能。同时现代操作系统如Linux和Windows提供丰富的基于C和C++的编程接口如文件系统网络编程多线程管理等通过直接调用操作系统API可以降低框架运行的开销。
从易用性的角度分析机器学习框架的使用者往往具有丰富的行业背景如数据科学家生物学家化学家物理学家等。他们的常用的编程语言是高层次脚本语言PythonMatlabR和Julia。相比于C和C++这些语言在提供编程的易用性的同时丧失了C和C++对底层硬件和操作系统进行深度优化的能力。因此机器学习框架的核心设计目标是其要具有易用编程接口来支持用户用高层次语言如Python来实现机器学习算法同时其也要具备以C和C++为核心的低层次编程接口使得框架开发者可以用C和C++实现大量高性能组件,从而在硬件上高效执行。在本章中,我们将会讲述如何达到这个设计目标。

View File

@@ -116,7 +116,7 @@ net = MLPNet()
有了神经网络组件构建的模型我们还需要定义**损失函数**来计算训练过程中输出和真实值的误差。**均方误差**(Mean Squared ErrorMSE)是线性回归中常用的,是计算估算值与真实值差值的平方和的平均数。
**平均绝对误差**Mean Absolute ErrorMAE是计算估算值与真实值差值的绝对值求和再求平均。
**交叉熵**Cross EntropyCE是分类问题中常用的衡量已知数据分布情况下计算输出分布和已知分布的差值
**交叉熵**Cross EntropyCE是分类问题中常用的衡量已知数据分布情况下计算输出分布和已知分布的差值
有了损失函数,我们就可以通过损失值利用**优化器**对参数进行训练更新。对于优化的目标函数$f(x)$;先求解其梯度$\nabla$$f(x)$,然后将训练参数$W$沿着梯度的负方向更新,更新公式为:$W_t = W_{t-1} - \alpha\nabla(W_{t-1})$,其中$\alpha$是学习率,$W$是训练参数,$\alpha\nabla(W_{t-1})$是方向。
神经网络的优化器种类很多一类是学习率不受梯度影响的随机梯度下降Stochastic Gradient Descent及SGD的一些改进方法如带有Momentum的SGD另一类是自适应学习率如AdaGrad、RMSProp、Adam等。

View File

@@ -187,6 +187,7 @@ class CNN(Cell):
z = self.dense2(z)
z = self.dense3(z)
return z
net = CNN()
```
上述卷积模型进行实例化,其执行将从\_\_init\_\_开始第一个是Conv2DConv2D也是Cell的子类会进入到Conv2D的\_\_init\_\_此时会将第一个Conv2D的卷积参数收集到self.\_params之后回到Conv2D将第一个Conv2D收集到self.\_cells第二个的组件是MaxPool2D因为其没有训练参数因此将MaxPool2D收集到self.\_cells依次类推分别收集第二个卷积参数和卷积层三个全连接层的参数和全连接层。实例化之后可以调用.parameters_and_names来返回训练参数调用用conv.cells_and_names查看神经网络层列表。
上述卷积模型进行实例化,其执行将从\_\_init\_\_开始第一个是Conv2DConv2D也是Cell的子类会进入到Conv2D的\_\_init\_\_此时会将第一个Conv2D的卷积参数收集到self.\_params之后回到Conv2D将第一个Conv2D收集到self.\_cells第二个的组件是MaxPool2D因为其没有训练参数因此将MaxPool2D收集到self.\_cells依次类推分别收集第二个卷积参数和卷积层三个全连接层的参数和全连接层。实例化之后可以调用net.parameters_and_names来返回训练参数调用net.cells_and_names查看神经网络层列表。