mirror of
https://github.com/openmlsys/openmlsys-zh.git
synced 2026-04-09 05:38:52 +08:00
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:
@@ -12,7 +12,7 @@ Threads)也被广大开发者所接受。因此,许多的机器学习用户
|
||||
|
||||
然而,机器学习模型往往需要针对部署场景,数据类型,识别任务等需求进行深度定制,而这类定制任务需要被广大的AI应用领域的开发者所实现。这类开发者的背景多样,其往往不具有熟练使用C和C++的背景,因此Caffe这一类库与C和C++深度绑定的编程模型快速成为了制约这一类框架快速推广的巨大瓶颈。
|
||||
|
||||
在2016年,谷歌率先推出了TensorFlow。相比于传统的Caffe,Torch和Theano,TensorFlow提出利用高层次编程语言:Python作为面向用户的主要前端语言,而利用C和C++实现高性能后端。大量基于Python的前端API确保了TensorFlow可以被大量的数据科学家和机器学习科学家接受,同时帮助TensorFlow能够快速融入Python为主导的大数据生态(大量的大数据开发库如Numpy,Pandas,Scrapy,
|
||||
在2016年,谷歌率先推出了TensorFlow。相比于传统的Caffe,Torch和Theano,TensorFlow提出利用高层次编程语言:Python作为面向用户的主要前端语言,而利用C和C++实现高性能后端。大量基于Python的前端API确保了TensorFlow可以被大量的数据科学家和机器学习科学家接受,同时帮助TensorFlow能够快速融入Python为主导的大数据生态(大量的大数据开发库如Numpy,Pandas,SciPy,
|
||||
Matplotlib和PySpark)。同时,Python具有出色的和C语言的互操作性,这种互操作性已经在多个Python库中得到验证。因此,TensorFlow兼有Python的灵活性和生态,同时也通过C/C++后端得以实现高性能。这种设计在日后崛起的PyTorch,MXNet和CNTK的机器学习框架得到传承。
|
||||
|
||||
随着多个机器学习框架的出现,Keras和TensorLayer等高层次机器学习开发库提供了更高层次的Python
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 编程接口
|
||||
|
||||
现代机器学习框架包含大量的组件。这些组件使得用户得以高效开发机器学习算法,处理数据,部署模型,性能调优和使用硬件加速器。在设计这些组件的编程接口时,一个核心的诉求是:如何平衡框架性能和易用性?为了达到最优的性能,开发者需要利用硬件亲和的编程语言如:C和C++来进行开发。这是因为:C和C++的使用使得机器学习框架可以高效硬件的底层API,从而最大限度发挥硬件。同时,现代操作系统(如Linux和Windows)提供丰富的基于C和C++的编程接口(如文件系统,网络编程,多线程管理等),通过直接调用操作系统API,可以降低框架运行的开销。
|
||||
现代机器学习框架包含大量的组件。这些组件使得用户得以高效开发机器学习算法,处理数据,部署模型,性能调优和使用硬件加速器。在设计这些组件的编程接口时,一个核心的诉求是:如何平衡框架性能和易用性?为了达到最优的性能,开发者需要利用硬件亲和的编程语言如:C和C++来进行开发。这是因为:C和C++的使用使得机器学习框架可以高效调用硬件的底层API,从而最大限度发挥硬件性能。同时,现代操作系统(如Linux和Windows)提供丰富的基于C和C++的编程接口(如文件系统,网络编程,多线程管理等),通过直接调用操作系统API,可以降低框架运行的开销。
|
||||
|
||||
从易用性的角度分析,机器学习框架的使用者往往具有丰富的行业背景(如数据科学家,生物学家,化学家,物理学家等)。他们的常用的编程语言是高层次脚本语言:Python,Matlab,R和Julia。相比于C和C++,这些语言在提供编程的易用性的同时,丧失了C和C++对底层硬件和操作系统进行深度优化的能力。因此,机器学习框架的核心设计目标是:其要具有易用编程接口来支持用户用高层次语言如Python来实现机器学习算法,同时其也要具备以C和C++为核心的低层次编程接口,使得框架开发者可以用C和C++实现大量高性能组件,从而在硬件上高效执行。在本章中,我们将会讲述如何达到这个设计目标。
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ net = MLPNet()
|
||||
|
||||
有了神经网络组件构建的模型我们还需要定义**损失函数**来计算训练过程中输出和真实值的误差。**均方误差**(Mean Squared Error,MSE)是线性回归中常用的,是计算估算值与真实值差值的平方和的平均数。
|
||||
**平均绝对误差**(Mean Absolute Error,MAE)是计算估算值与真实值差值的绝对值求和再求平均。
|
||||
**交叉熵**(Cross Entropy,CE)是分类问题中常用的,衡量已知数据分布情况下,计算输出分布和已知分布的差值,
|
||||
**交叉熵**(Cross Entropy,CE)是分类问题中常用的,衡量已知数据分布情况下,计算输出分布和已知分布的差值。
|
||||
|
||||
有了损失函数,我们就可以通过损失值利用**优化器**对参数进行训练更新。对于优化的目标函数$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等。
|
||||
|
||||
@@ -187,6 +187,7 @@ class CNN(Cell):
|
||||
z = self.dense2(z)
|
||||
z = self.dense3(z)
|
||||
return z
|
||||
net = CNN()
|
||||
```
|
||||
|
||||
上述卷积模型进行实例化,其执行将从\_\_init\_\_开始,第一个是Conv2D,Conv2D也是Cell的子类,会进入到Conv2D的\_\_init\_\_,此时会将第一个Conv2D的卷积参数收集到self.\_params,之后回到Conv2D,将第一个Conv2D收集到self.\_cells;第二个的组件是MaxPool2D,因为其没有训练参数,因此将MaxPool2D收集到self.\_cells;依次类推,分别收集第二个卷积参数和卷积层,三个全连接层的参数和全连接层。实例化之后可以调用.parameters_and_names来返回训练参数;调用用conv.cells_and_names查看神经网络层列表。
|
||||
上述卷积模型进行实例化,其执行将从\_\_init\_\_开始,第一个是Conv2D,Conv2D也是Cell的子类,会进入到Conv2D的\_\_init\_\_,此时会将第一个Conv2D的卷积参数收集到self.\_params,之后回到Conv2D,将第一个Conv2D收集到self.\_cells;第二个的组件是MaxPool2D,因为其没有训练参数,因此将MaxPool2D收集到self.\_cells;依次类推,分别收集第二个卷积参数和卷积层,三个全连接层的参数和全连接层。实例化之后可以调用net.parameters_and_names来返回训练参数;调用net.cells_and_names查看神经网络层列表。
|
||||
|
||||
Reference in New Issue
Block a user