同时搞定TensorFlow、PyTorch (一) :梯度下降

同时搞定TensorFlow、PyTorch (一):梯度下降。同时搞定TensorFlow、PyTorch (二):模型定义。同时搞定TensorFlow、PyTorch (三) :资料前置处理。同时搞定TensorFlow、PyTorch (四):模型训练。

前言

TensorFlow、PyTorch 是目前佔有率最高的深度学习框架,初学者常会问『应该选择PyTorch或 TensorFlow套件』,依个人看法,PyTorch、TensorFlow好比倚天剑与屠龙刀,各有擅场,两个套件的发展重点有所不同,例如在侦错方面,PyTorch比较容易,但TensorFlow/Keras建模、训练、预测都只要一行程式,另外,物件侦测主流演算法YOLO,第四版以TensorFlow开发,第五版则以PyTorch开发,若我们只懂TensorFlow,那就无法使用最新版了。

其实PyTorch与TensorFlow基本设计概念是相通的,只要採用相同的approach,就可以同时学会两个套件,在后续的介绍及範例程式我们会印证这个想法。

差异比较

PyTorch 认为两个主要对手,『TensorFlow 1.x版把简单的事情複杂化』,『Keras把複杂的事情太过简化』,因而促使TensorFlow 2.x版依据Keras规格重新开发并纳入TensorFlow中,现在Keras已变成TensorFlow最重要的模组。

而PyTorch特色如下:

Python First:PyTorch开发团队认为Python及相关套件功能已经相当强大,不须另外发明轮子(Reinvent the wheel),直接与Python生态环境紧密结合。除错容易:TensorFlow/Keras 提供 fit 一行指令即可进行模型训练,虽然简单,但不易侦错(Debug),PyTorch须自行撰写优化求解的程序,虽然繁琐,但在过程中可插入任意的程式码侦错或查看预测结果、损失函数变化,不必等到模型训练完成。GPU 记忆体管理较佳,笔者使用GTX1050Ti,记忆体只有4GB 时,同时执行2个以TensorFlow 开发的Notebook 档案时,常会发生记忆体不足的状况,但使用PyTorch,即使3、4 个Notebook 档案也没有问题。程式可自行决定变数及模型要在 CPU 或 GPU 运算:虽然比较麻烦,但可优化记忆体的使用,TensorFlow则是自行侦测GPU,如果有。则预设会使用GPU运算,反之,会使用CPU。C/C++整合:PyTorch 提供C/C++ extension API,有效整合,不需桥接的包装程式(wrapper)。

另外,文件说明还是以TensorFlow/Keras较为详尽,且较有系统性,PyTorch方面,笔者常须依靠谷大哥搜寻,这也是笔者撰写PyTorch入门书籍的原因。

一致的学习路径

虽然存在以上差异,PyTorch与TensorFlow基本设计概念是相通的,採用相同的approach,可以同时学会两个套件,以下我们以一些简单範例印证这个想法。

梯度下降法是神经网路主要求解的方法,计算过程会使用张量(Tensor)运算,另外,在反向传导的过程中,则要进行偏微分,计算梯度,如下图:
http://img2.58codes.com/2024/20001976VLqeuIOeDD.png
图一. 神经网路求解过程

基于上述求解过程的需求,大多数的深度学习套件至少会具备下列功能:

张量运算:包括各种向量、矩阵运算。自动微分(Auto Differentiation):透过偏微分计算梯度。各种神经层(Layers) 及神经网路(Neural Network) 模型构建。

因此,学习的路径可以从简单的张量运算开始,再逐渐熟悉高阶的神经层函数,以奠定扎实的基础。
http://img2.58codes.com/2024/20001976rUg0l5LDFX.png
图二. 神经网路学习路径

优化求解

神经网路通常会有很多神经层,每一层又有很多神经元,如果加上 Activation Function,要以纯数学求解相当困难,因此通常会使用梯度下降法,逐步逼近最佳解的方式,求得近似解。相关说明可详阅『Day N+1:进一步理解『梯度下降』(Gradient Descent)』、『Day 02:梯度下降与自动微分』,这里只说明TensorFlow/PyTorch的实作。

https://chart.googleapis.com/chart?cht=tx&chl=%24%5Cdisplaystyle%20y%20%3D%20x%5E%7B2%7D%20%24 为例,求解最小值。

先以手工计算梯度:https://chart.googleapis.com/chart?cht=tx&chl=%24%5Cdisplaystyle%20%20x%5E%7B2%7D%20%24的一阶导数为2X,参见 dfunc 函数。
# 载入套件import numpy as npimport matplotlib.pyplot as plt# 损失函数def func(x): return x ** 2# 损失函数的一阶导数:dy/dx=2*xdef dfunc(x): return 2 * x
定义超参数:之后可任意改变参数值,依然可以求得最小值。
# 超参数(Hyperparameters)x_start = 5     # 起始权重epochs = 15     # 执行週期数 lr = 0.3        # 学习率 
求解:参照图三,进行反向传导,更新权重。
# 梯度下降法 def GD(x_start, df, epochs, lr):        xs = np.zeros(epochs+1)        x = x_start        xs[0] = x        for i in range(epochs):                 dx = df(x)                # 更新 x_new = x — learning_rate * gradient                x += - dx * lr                 xs[i+1] = x        return xs# *** Function 可以直接当参数传递 ***w = GD(x_start, dfunc, epochs, lr=lr) print (np.around(w, 2))
求解过程视觉化:由初始点5开始,逐步逼近找到最佳解。
t = np.arange(-6.0, 6.0, 0.01)plt.plot(t, func(t), c='b')plt.plot(w, func(w), c='r', marker ='o', markersize=5)    # 设定中文字型plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 正黑体 plt.rcParams['axes.unicode_minus'] = False # 矫正负号plt.title('梯度下降法', fontsize=20)plt.xlabel('X', fontsize=20)plt.ylabel('损失函数', fontsize=20)plt.show()

执行结果如下:
http://img2.58codes.com/2024/2000197678Y9I8OXk4.png
图四. 求解过程视觉化

TensorFlow的作法

修改 dfunc 函数,改用 TensorFlow/PyTorch 提供的自动微分及梯度计算功能,取代 dfunc 函数的程式码如下:

def dfunc(x_value):     x = tf.Variable(x_value, dtype=tf.float32) # 宣告 TensorFlow 变数(Variable)    with tf.GradientTape() as g: # 自动微分        y = x ** 2                # y = x^2    dy_dx = g.gradient(y, x)     # 取得梯度    return dy_dx.numpy()         # 转成 NumPy array

PyTorch的作法

def dfunc(x):     x = torch.tensor(float(x), requires_grad=True)    y = x ** 2 # 目标函数(损失函数)    y.backward()    return x.grad

完整程式请自『这里』下载,程式名称为 src/03_02_自动微分.ipynb。

结论

TensorFlow/PyTorch 基本设计概念是一致的:

张量(Tensor)均与NumPy阵列相容,不论是资料结构或是运算,包括 Broadcasting 机制。自动微分、梯度下降也是如此,只是语法不同而已。

下一篇我们继续比较神经网路及神经层的差异。

以下为工商广告:)。
PyTorch:
开发者传授 PyTorch 秘笈
http://img2.58codes.com/2024/20001976MhL9K2rsgO.png

TensorFlow:
深度学习 -- 最佳入门迈向 AI 专题实战。
http://img2.58codes.com/2024/20001976ZOxC7BHyN3.jpg


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章