PyTorch入门笔记-简单回归案例

2021-03-25 19:14:29 浏览数 (1)

梯度下降算法

本节先介绍梯度下降算法,这是因为梯度下降算法是深度学习(DeepLearning )的核心精髓,这也是为什么有一些专家称深度学习为 Gradient Programing 的原因所在。「学到后面就会发现其实整个深度学习是依靠梯度下降算法支撑起来的,深度学习之所以有这么强大的能力,甚至在某一些领域接近人类,究其本质是因为深度学习可以求解一个非常庞大复杂的函数,而求解这个函数的工具就是梯度下降算法。」

求解下面这个简单函数的极小值:

f(x) = x^2 times sin(x)

函数连续可导可以使用高中学习过的计算函数导数的方式来寻找函数的极小值点,这种方法和梯度下降算法非常类似,不同的是梯度下降算法是一个迭代过程,梯度下降算法的公式如下:

x_{new} = x_{old} - learning rate times nabla

在多元函数中梯度指向的方向是函数增长最快的方向,如果我们想要求解极小值只需要往梯度的反方向(函数下降最快的方向),这也是为什么上面式子中会有 -nabla 的原因,既然是迭代算法一步步接近极小值,肯定需要有一个能够控制迭代算法步幅的超参数学习率(learning rate),「超参数学习率的选择能够直接影响梯度下降算法的效果。」 当使用梯度下降算法求解 f(x) = x^2 times sin(x) 的极小值时:

  • 当选用比较小的学习率,比如 learning rate=0.005(迭代50次)

从图中可以看出,由于学习率设置的比较小,虽然最终能够到达极小值点,但是每次迭代下降过程只行进一小步,耗费了大量的训练时间。

  • 当选用比较大的学习率,比如 learning rate=0.05(迭代50次)

从图中可以看出,当学习率设置的比较大的时,每次迭代下降过程的步幅非常大,这可能导致梯度下降算法在寻找极小值点的过程中来回振荡,梯度下降算法失效,当然实际的函数要比这复杂的多。

选择合适的学习率对模型训练结果的好坏尤为重要,当然针对处理的问题和数据集的不同合适的学习率是不一样的,可以通过网格搜索等方式选择合适的学习率。后来基于梯度下降算法又提出了很多优化算法。

求解线性方程

假设现在有一个简单的线性方程:

y = wtimes x b

对于二元一次线性方程只需要已知两个点联立方程组消元就可以精确的求解出方程的解 w^*, b^*,这种能够通过严格的公式推导出精确解称为数值解(Closed-from Solution)。「不过在实际上可以直接推导出精确解的情况并不多,因为通常情况下是存在误差的,比如采集样本点时候的误差或者人主观意识的误差等等。」现在为上面的简单线性方程添加一个小的高斯噪声 epsilon

y = w times x b epsilon, epsilon in N(0.01, 1)

虽然 epsilon 误差比较小,但是即使很小的误差也可能会导致求解结果的巨大偏差,这种情况下仅仅依靠两个样本点(两个方程联立消元的方式求解)很可能不存在解析解,通常我们会采样多个样本点,借助数值方法区优化出一个近似的数值解(Numerical Solution)。既然使用优化方法,我们需要一个目标函数,让这个目标函数最小,最小化的目标函数称为损失函数(Loss Function),此处我们可以使用均方差损失函数:

loss = frac{1}{m}sum_{i}(wx_i b - y_i)^2

其中 m 为样本点总数,(x_i, y_i) 为第 i 个样本点。

接下来看一个具体的例子:

y = 1.477 times x 0.089 epsilon, epsilon in N(0.01, 1)

首先从中采样样本点 (x, y),其中 x in[0, 15],采样的样本点如下图所示:

需要最小化的损失函数 loss 为:

loss = sum_{i}(wtimes x_i b - y_i)^2

我们需要不断的调整 w, b 的值,取当 loss 函数取值最小时候的 w^*, b^*,最后预测的线性模型为 y = w^*times x b^*。如果来了个新的样本点 x_{new},只需要将 x_{new} 代入预测方程即可,即 y_{new} = w^*times x_{new} b^{*}

函数 loss = sum_{i}(wtimes x_i b - y_i)^2 图像如下所示:

这个像碗一样的函数被称为凸函数,针对凸函数的优化有一个专门的学科凸优化(Convex Optimization),凸函数最大的特点是不管初始值选择哪里,使用梯度下降算法终究能够达到全局极小值。不过通常深度学习中要解决的问题相当复杂,对应的目标函数更是繁琐,通常很难找到全局极小值点,不过实验证明即使是局部极小值也能够求解得到不错的结果。

References: 1. 龙良曲深度学习与PyTorch入门实战:https://study.163.com/course/introduction/1208894818.htm

原文地址:https://mp.weixin.qq.com/s/JS8kyGLQX4846EwfnmL7JQ

0 人点赞