线性回归是常用的机器学习模型,本文以线性回归的解法为例,对比了矩阵解法,最小二乘法、梯度下降法以及牛顿法等优化算法的差异,有助于更好的理解各种优化算法。
矩阵解法
numpy求解线性方程组
对于线性方程组:
(1)
求解矢量 。
其中A为系数矩阵
b为:
通过numpy求解的具体过程如下,首先构造矩阵
import numpy as np
A = np.array([[2, 1, -2], [3, 0, 1], [1, 1, -1]])
b = np.array([[-3], [5], [-2]])
利用numpy的线性代数模块进行求解
x = np.linalg.solve(A, b)
numpy用于多元线性回归
线性回归主要目的在于找出输入与输出之间的映射函数,往往数据量远大于自变量个数。每个输入数据可以用特征向量进行表示 (x_1 , x_2 , …, x_m) ,m代表自变量的维度大小,当m为1时,即为单元线性回归。
对于多元线性回归的求解,通常是利用最小二乘法进行求解。这里先利用矩阵方法求解,后续详解最小二乘法。
输入的全部数据可以利用矩阵X表征,
输出数据可以利用向量表征如下
(3)
其中n代表样本个数,即输入数据的数据量。
线性回归的出发点在于找到映射函数 ,使得
(4)
其中 的维度为
,
维度为
。
对比(4)和(1)式,二者形式相似,似乎可以利用相同的算法求解。但是仔细对比会发现,式(1)中的系数 为方阵,方程个数与
的维度相同,可以直接利用
进行求解。但是(4)式中, 系数
不为方阵,其中数据样本个数n,往往多于变量维度m+1。不能直接系利用np.linalg.solve进行求解,需要做适当变换。
利用矩阵乘法,可以得出
(5)
(6)
利用numpy的线性代数模块,可以求出 ,如下:
X_t = np.transpose(X)
X_tX = np.dot(X_t, X)
X_ty = np.dot(X_t, y)
beta = np.linalg.solve(X_tX, X_ty)
函数np.linalg.solve
np.linalg.solve(a, b)用于线性矩阵方程(线性标量方程组)的解析解求解。
其中a必须为方阵和满秩矩阵(矩阵的所有行(列)都线性独立),如果不满足上述的任何一个条件,则必须使用最小二乘法求解。
上述对于多元线性回归,通过矩阵变换将表达式(4)变换为形式(5),从而可以利用np.linalg.solve进行求解。
线性回归的最小二乘解法
最小二乘法,又称最小平方法,通过误差的平方和最小寻找数据的最佳函数匹配。
对应于线性回归中,寻找映射函数 ,
(7)
使得误差的平方和最小:
(8)
其中 的表达式如式(2)和式(3)所示,
维度为(m+1, 1).
要使得(8)式的平方和最小,即要找出合适的 ,使如下式子和最小
(9)
既要使得和最小,即要找到极值点,即 对
\boldsymbol\beta 的导数
为0。
利用矩阵求导方法,首先将(9)的向量模平方改写为向量与自身的內积,即
(10)
求微分:
其中利用到 与
均为向量,向量的內积满足
。
利用微分与导数的联系:
可以得出
令上式为0,可得
(11)
比较(10)式和(5)式可得,利用最小二乘法得出了与矩阵变换相同的形式。至此,可以利用numpy的线性算法模块np.linalg.solve,即可求得映射函数 。
最大似然概率
最小二乘法,是从使残差(误差)平方和为最小为出发点,得出参数 的值。用深度学习的语言来讲,残差平方和为最小,相当于目标函数。即最小二乘法是以残差平方和最小为目标函数,得出参数
的值。
残差平方和最小值:
与深度学习中的MSE(均方误差),形式相同,只是相差一个系数(1/n):
MSE可以根据高斯分布和最大似然概率推出。
同样的,对于线性回归问题,也可以从概率角度,利用最大似然概率方法和高斯分布假设得出参数 。具体过程如下:
样本组合表示为
对于多元线性回归,满足以下几个基本假设:
(1)线性性质以及自变量之间相互独立:
(2)误差项的方差为常数: ,称为同方差性。
(3)误差满足正态分布:
(4)误差相互独立:即 之间相互独立。
样本 可以用矩阵
即式子(2)表示。
多元线性回归可以表示为如下:
对于每个样本,可以表示为
(12)
其中误差 满足独立同分布
,因此
满足
(13)
由于 之间满足条件独立分布,上式可以写为矩阵形式为:
具体表达式为:
对上式的概率分布求对数可得,
(14)
上式中去除常数与 相关的表达式为:
与式(10)相比,只相差一个常数 ,因此对式(14)进行求导
的过程与对(10)式求导过程相同,因此会得出与式(11)相同的结果。即在线性回归情形下,利用最大似然概率和高斯分布假设,求得
的结果与最小二乘法的结果相同。
通过上述的推导过程可以看出,在线性回归中,最大似然概率和最小二乘法等价,基于不同的角度得出了相同的结果。最大似然概率,是从概率角度出发,最小二乘法是从误差平方和最小作为出发点。
最小二乘法
最小二乘法的目标为:
其中 ,
(x_i, y_i) 对应第
i 个样本,
为需要拟合的函数。
要使上式最小,需要满足 ,即
即为:
(15)
通过求解上述方程组,得到参数 的值。
根据模型函数 的形式,可以将最小二乘法分为线性最小二乘法和非线性最小二乘法。
线性最小二乘法
在线性回归模型中,如式子(7)所示,
对于分量 而言:
即在线性回归模型中,是参数 的线性组合表达式。
参数的线性组合表达式,写成更一般的形式为:
更一般的讲,只要 值为常数或者非
的相关变量,即为参数
的线性函数。
对于线性最小二乘法,求解的过程类似上述线性回归模型的求解,往往有解析解(closed-form solution)。
非线性最小二乘法
非线性最小二乘法,往往对应 不能表示为
的线性表达式,对于这种情况往往没有解析解(closed-form solution)。通过迭代的方式,求解
的最优解。
其中 的更新通过下述方法求得。
一般的做法是对 做一阶泰勒展开,
可以得出
代入(15)式,可得
记 ,
,则上式可以写为:
其中 j = (1, 2, ..., m+1) ,即上述对应m+1个方程,写为矩阵形式为:
上述方程组称为 Gauss–Newton algorithm 的定义方程,通过上述方程即可求出 ,即可以利用迭代法求出参数
。
其中 矩阵。
线性最小二乘法 vs 非线性最小二乘法
对比上述线性和非线性最小二乘法的求解过程,可知对于非线性最小二乘法,需要给出初始值然后利用迭代法进行求解。
无论是线性还是非线性,都需要计算Jacobian矩阵,如果Jacobian矩阵没有解析解,需要进行数值求解。
对于线性最小二乘法,属于凹函数,不存在不收敛问题,而且值为全局最小且唯一。
对于非线性最小二乘法,会存在不收敛问题,而且会存在多个极小值。
梯度下降算法
如上所述,最小二乘法是以残差平方和最小为目标,通过使得函数对参数的一阶导数为0来满足目标,进而求得参数的一种方法。对于线性最小二乘法,可以通过矩阵解法求得参数,对于非线性最小二乘法,可以利用迭代法求解。
梯度下降算法是机器学习和深度学习中,用的最广的求解参数的方法,是一种迭代算法。最小二乘法,用机器学习的语言来讲,目标函数(或者说损失函数)为残差平方和最小。相比最小二乘法,梯度下降算法没有以残差平方和最小为目标的假设,可以适用于任何目标函数。相同之处在于二者都需要计算目标函数的一阶导数(Jocabi矩阵)。
梯度下降算法的求解过程如下:
第 k+1 步的解为:
其中 ,
为损失函数,
为超参数学习率,控制更新步长大小。
对于线性回归问题,既可以利用最小二乘法求解,也可以利用梯度下降法求解。利用最小二乘法,需要求解矩阵的逆矩阵,计算相当耗时(尤其是参数较多时),比较而言,利用梯度下降算法计算量并不是很大,反而是一种更常用更好的选择。
牛顿法
如上所述,梯度下降算法是利用一阶导数求解参数值的方法。参数更新方式可以写为:
i = 1, 2, ..., m+1
写为向量形式为:
(16)
其中k代表第k步。
牛顿法同时利用了一阶导数和二阶导数信息,参数更新方式如下:
(17)
其中 ,称为Hessian矩阵
比较式(17)和式(16),牛顿法是二阶收敛,梯度算法是一阶收敛,牛顿法相比梯度算法收敛速度更快,但是计算也会更加复杂。 梯度算法只需要函数一阶可导,牛顿法需要函数二阶可导。尽管牛顿法的收敛速度更快,但是计算复杂,且需要函数二阶可导的限制,使得牛顿法不如梯度下降法运用的更加广泛。
牛顿算法的推导过程
对函数 做二阶泰勒展开,
对上式做微分可得:
上述推导中,利用了 (
为向量)以及
的性质。
根据向量导数公式,可得
令上式为0,可得:
记,增加超参数学习率
,可得
ref: