徐龙飞,郁进明
(东华大学 信息科学与技术学院,上海 201620)
机器学习算法在生活工作中的各个领域应用得越来越广泛。机器学习算法的使用可从大量的数据中发现一些规律或模式,从而进行预测和辅助决策。在公共医疗诊断、金融量化交易等行业,这些算法都起着关键的作用。线性回归算法[1](linear regression,LR)是其中常见的一种算法,具有易于理解,方便执行,应用广泛等特点。在使用LR时需要确定函数主体,主体之一便是优化器即梯度下降方法,不同的优化器对模型性能的影响不同。尽管LR模型使用广泛,但在日常使用时,难免受到一些干扰数据的影响,而且选择不同的优化器对模型性能也会产生较大影响。
为此,文中通过使用Python语言和TensorFlow[2]框架在加入高斯噪声的场景下,比较不同优化器的损失函数和计算时间,以选择合适的优化器来提高LR模型性能。
线性回归模型的基本原理是通过训练数据来学得一个线性模型以尽可能准确地预测输出值。在LR模型中,自变量输入和因变量输出可以分成连续型和离散型。在LR模型中,如果输入和输出是一对一的关系,数学上表现为一个一元函数,这样的模型称为一元LR模型。如果回归分析中包括两个或两个以上的自变量,这些变量符合多元多次函数,那么这样的回归分析则称为多元线性回归分析。如果从二维来看,一元线性模型对应于一条直线,多元线性回归对应于一条曲线。如果从三维空间来看,一元线性模型对应于一个平面,多元线性回归对应于一个超平面。使用LR模型,分为以下几步:
(1)根据场景选择自变量个数以及次数,针对不同的问题和任务可以产生不同的预测或分类效果。
(2)确定一个衡量标准,即选择损失函数[3](loss function),不同的模型在不同的损失函数下表现的性能可能不一样,所以需要依据情况来定。文中选择均方误差作为损失函数。
(3)通过改变优化器寻找该场景下性能最优的模型,文中比较了批量梯度下降、随机梯度下降和动量梯度下降。
(4)对最优的模型进行测试。
一元线性回归分析中,输入和输出呈一条直线关系。线性回归模型简单,可解释性高,形式简单,易于建模,在一定程度上可以防止过拟合,用途广泛,可作为各个系统的基线模型。一元线性回归是很多其他非线性模型发展的基础。在LR模型的基础上,通过增加层次结构,使用低维数据映射到高维的方法[4],可以生成许多预测和分类功能强大的非线性模型。一元LR线性模型的公式如下:
(1)
多元线性回归的输入和输出呈非线性关系,有多个输入,且输入可以为高次方。多元线性回归模型的非线性特点在很多实际场景下的性能表现要优于一元线性回归模型。公式如下:
(2)
在确定模型的情况下,对于线性回归模型,需要求解模型的参数。先从数据中获取n组实际值(x1,y1),(x2,y2),…,(xn,yn),对于平面或曲面中的这n个点,理论上可以使用多条曲线来拟合,但不同的模型拟合的效果不一样,所以选用模型时尽量使拟合的效果最佳。直观上看,当拟合的曲线位于样本数据的中心位置时拟合效果最好。可以定义一些标准来确定拟合效果的好坏。文中使用的LR模型的目标函数为输入与输出的残差平方和,如式(3)所示,可以防止残差和互相抵消的情况。该评价标准可以有效地计算出实际值和预测值之间的误差,也可以减少计算量[6]。
(3)
(5)
求得参数之后就可以在训练集上进行测试,但此时的模型可能会有过拟合的情况,解决的一般办法是在模型中加入正则项。
正则化是一种回归的形式,它将系数估计朝零的方向进行约束、调整或缩小。也就是说,正则化可以在学习过程中降低模型复杂度和不稳定程度,从而避免过拟合的危险。式(6)则是加入L1正则项后的模型。这一方法通过添加收缩量调整残差平方和。现在,系数要朝最小化上述函数的方向进行调整和估计。其中λ是调整因子,它决定了要如何对模型的复杂度进行惩罚。模型复杂度是由系数的增大来表现的。如果要最小化上述函数,这些系数就应该变小。这也就是L2正则避免系数过大的方法。
(6)
式(7)则是加入L2正则后的模型。其中需要最小化上述函数。很明显,这种变体只有在惩罚高系数时才有别于L1正则。它使用平方项来代替绝对值作为惩罚项。换个角度看,上述方法L1正则可以被认为是求解一个方程,其中系数的平方和小于等于s。L2正则可以看作系数的模数之和小于等于s的方程。其中s是一个随收缩因子λ变化的常数。
(7)
L1与L2正则都要在平方误差项与正则化项之间折中,它将把不重要的预测因子的系数缩小到趋近于0,但永不达到0。也就是说,最终的模型会包含所有的预测因子。在L1正则中,如果将调整因子λ调整得足够大,L1正则可以迫使一些系数估计值完全等于0。因此L1可以进行变量选择,产生稀疏模型。于是求解L1正则的结果时得到了仅采用一部分初始特征的模型,可以认为使用L1正则的模型时选择特征的步骤和模型训练的步骤合在了一起。L1正则的优点是可以使数据稀疏,计算量较小,具有较好的可解释性,但防止过拟合的效果不强,而L2正则可以防止过拟合,但计算量较大。
弹性网络结合了L1正则和L2正则的特点,如式(8)所示,在绝对值和平方项前加入和为1的系数,可以调节两个正则项的比例。弹性网络[8]的特点是系数之间不会交叉,随意计算的系数拟合程度较高,而且收敛速度较快。
(8)
弹性网络是一种结合了L1、L2正则作为先验正则项的LR模型。这种组合允许学习到一个只有少量参数是非零稀疏的模型[9],保留了L1和L2的特点,弹性网络是一不断迭代的方法。关键在于选择λ的大小,如果λ较大,那么意味着系数较小,数据的方差变小,此时可以防止过拟合,如果λ的值选择不合理,就会忽略掉数据的部分特征,导致拟合效果变差,所以λ值的选择会直接影响弹性网络的拟合效果。
高斯噪声[10]出现在生产和生活中的方方面面,是一种无法避免的干扰,比如磁场的变化,电流的流通与关闭,都会产生高斯噪声。文中使用高斯噪声可以很好地模拟日常使用模型出现的各种干扰。高斯噪声的特点是其概率密度服从标准正态分布[11],高斯噪声的特性可以用式(9)表示。
(9)
其中,μ表示x的平均值或期望值,∂表示x的标准差[12]。正态分布的一个特点是关于x=μ对称。正态分布曲线有两个拐点,分别分布在离均值一个标准差的位置,为x=μ-∂和x=μ+∂。由于对于离期望值好几个标准差范围之外的取值,它们的概率趋近于0。
梯度下降法[13]是一种最优化算法,可以求解到函数的局部极值。梯度下降法也称为最速下降法。要使用梯度下降法找到一个函数的局部极小值,需要在函数上找到当前点对于当前梯度的反方向,同时行进规定步长距离来进行迭代搜索[14]。所以梯度下降法有助于求解某个函数的极小值或者最小值。对于n维问题求最优解,梯度下降法是最常用的方法之一。
梯度下降的公式[15]如式(10)所示。起始时导数为正,α减小后并以新的α为基点重新求导,一直迭代就会找到最小的α,若导数为负,α就会不断增加,直到找到使损失函数最小的值。需要注意的是步长θa的大小,如果θ太小,则会迭代很多次才找到最优解,若θ太大,可能跳过最优,从而找不到最优解[16]。另外,在不断迭代的过程中,梯度值会不断变小,所以α的变化速度也会越来越慢,所以不需要使速率α的值越来越小,当梯度减小到某个值时,如果继续进行迭代计算,这时梯度的变化值会很小。可以采用设定阈值的方法,只要变化小于该阈值,就停止迭代,那么最后得到的梯度可以认为是最优值。
(10)
其中θ为学习率,所以在使用梯度下降算法的时候,需要进行一些调优策略[17]。如果学习率过大,那么每次迭代参数时变化比较大,α有可能不会收敛;如果学习率过小,则每次迭代更新的变化比较小,就会导致迭代所耗的时间太长,导致α很长时间内都无法收敛到某个值。
批量梯度下降[11]的公式如下:
(11)
批量梯度下降法[18]使用时每次学习都使用整个训练集,所以每次迭代后的梯度都是往最优解的方法行进,直到收敛于最优解所在的点,如果使用的是凸函数,那么最后求得的梯度就是全局最优的[19],如果使用的是非凸函数,那么梯度可能会是局部的最优值。BGD容易得到最优解,但是由于每次考虑所有样本,速度很慢,学习所需的计算时间太长,同时会占用大量内存。
随机梯度下降的公式如下:
(12)
随机梯度下降[20]的特点是每次随机计算一个样本,迭代速度快,但不一定每次都朝着收敛的方向。对于样本数量非常之多的情况,BGD算法会非常耗时[21],因为每次迭代都要遍历所有样本,可选用SGD算法,尽管SGD的迭代次数比BGD大很多,但一次学习时间非常快。SGD的缺点在于每次更新时不一定会按照正确的梯度进行,更新后的参数方差可能较大,从而导致损失函数值波动范围大。如果目标函数有谷底区域,SGD会使优化的方向从当前的局部极小值点调整到另一个更优的局部极小值点,如果使用的不是凸函数,那么最后α可能收敛到某个局部最优的极值点。
Adam优化算法[22]是在SGD的基础上发展而来,广泛使用于计算机视觉和自然语言处理及其他的实际场景中。Adam算法的特点是学习率会在计算过程中不断改变来适应权重的改变。Adam算法使用的是梯度的一阶矩估计以及二阶矩估计的大小值,从而在参数发生改变时,计算出适合改变后参数的学习率,可以为不同的参数算出各自的自适应性学习率,Adam算法计算高效,而且所需的计算内存较少。Adam算法的更新规则如下:
(13)
根据Adam算法的特性,在很多实际场景中Adam算法对模型有很好的优化能力。
文中使用的操作系统为Win10,编程语言为Python,深度学习框架为TensorFlow,硬件设备为8 GB内存,Intel i5处理器。
实验流程如图1所示。本次实验过程中使用的具体的多元线性回归模型是y=x3×0.7+0.6,然后对数据进行预处理和添加噪声,并选择不同的优化器进行迭代,优化器的学习率设为0.5,迭代次数为500次。
实验使用Python编程语言,使用的机器学习框架为TensorFlow,还使用了numpy和matplotlib程序库,用来进行数组和矩阵的计算以及对实验结果进行画图。
图1 实验流程
伪代码如下所示:
Import numpy,tensorflow,matplotlib
x1=random.normal
y1=x1**3 *0.7+0.6+random.normal(0,0.5)
End
W=random_uniform([1],-1.0,1.0))
loss=reduce_mean(square(y_p-y_a))
for i 1∶500
Optimizer1=train.Optimizer(0.5)
Optimizer2=train.GradientDescentOptimizer(0.5)
Optimizer3=train.AdamOptimizerOptimizer(0.5)
课后,为了让青少年能够充分利用课后时间开展文化活动,学校调整放学时间,留有充分时间保证课后家长可以带领孩子进入博物馆或图书馆,开展相应活动。此外,马克龙政府正在积极进行图书馆的开馆时间改革,确保孩子和家长能够在课后进入图书馆阅读和学习。
End
Print W,b,loss
Plot
实验中使用的高斯噪声的图像如图2所示,添加的高斯噪声的均值为0,标准差为0.2。
如图3所示,在多元线性回归模型y=x3×0.5+0.7中加入高斯噪声后的输出数据分布如图3所示。可以看出加入高斯噪声后的模型受到高斯噪声的影响,模型的输入和输出已经不再呈现线性特性。
图2 高斯噪声波形
图3 加入高斯噪声后的输出数据图像
本次实验中在使用不同优化器进行500次迭代后的损失函数与计算时间数据如表1~表3中所示。使用批量梯度下降得出的损失函数和计算时间如表1所示。
表1 BGD的损失函数与计算时间
从表1可以看出,批量梯度下降在迭代到215次时系数W和损失函数loss已经稳定,最终的损失函数为0.089 965 21,计算时间为2.243 9 s。
使用随机梯度下降得出的损失函数和计算时间如表2所示。
表2 SGD的损失函数与计算时间
从表2可以看出,随机梯度下降在迭代到157次时系数W和损失函数loss已经稳定,最终的损失函数为0.089 965 2,计算时间为1.938 8 s。
使用Adam优化器得出的损失函数和计算时间如表3所示。
表3 Adam的损失函数与计算时间
从表3可以看出,Adam优化器在迭代到109次迭代时系数W和损失函数loss已经稳定,最终的损失函数为0.089 965 21,计算时间为1.921 8 s。
从以上实验结果可以看出,在LR模型中加入高斯噪声后,由于Adam算法的一些特性,使得训练的迭代次数少于BGD和Adam优化器,且损失函数值最小。图4是使用Adam拟合后的图像,可见使用Adam算法后的LR模型可以比较好地拟合原始输出图像。
图4 Adam优化器拟合图像与原始输出图像
本次实验的结论是在加入高斯噪声后,使用Adam的LR模型性能优于使用BGD和SGD的LR模型。
LR模型在使用过程中会受到各种干扰的影响,可以使用高斯噪声来模拟干扰的影响。
研究了在加入高斯噪声的情况下如何选择优化器使得LR模型的性能最优。通过比较不同优化器的损失函数和计算时间,得出使用Adam优化器可以有效提高模型性能。同时,该方法仍然有需要完善的地方,比如可以使用混淆矩阵或海明距离等指标来评价优化器的性能,这些也是接下来需要深入研究的方向。