线性回归

简介: 【6月更文挑战第7天】线性回归是建立自变量与因变量之间线性关系的模型,常用于预测数值。它假设观测噪声符合正态分布。模型表示为$y=w^Tx+b$,其中$w$是权重,$b$是偏置。损失函数常用平方误差,通过梯度下降法优化。小批量随机梯度下降是常用的更新参数方法。正则化,如L2正则化(权重衰减),用于防止过拟合。丢弃法用于多层感知机,减少模型复杂度。训练时注意数值稳定性,如梯度爆炸和消失,可通过权重初始化、归一化等方法改善。

线性回归

回归是能为一个或者多个自变量与因变量之间关系建模的一类方法,在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。

在机器学习领域中的大多数任务通常都与预测有关。当我们想预测一个数值时,就会涉及到回归问题。常见的例子包括:预测价格(房屋、股票等)、预测住院时间(针对住院病人等)、预测需求(零售销量等)。但不是所有的预测都是回归问题。其中分类问题的目标是预测数据属于一组类别中的哪一个。

线性回归(linear regression)可以追溯到19世纪初, 它在回归的各种标准工具中最简单而且最流行。 线性回归基于几个简单的假设: 首先,假设自变量x和因变量y之间的关系是线性的, 即y可以表示为x中元素的加权和,这里通常允许包含观测值的一些噪声; 其次,我们假设任何噪声都比较正常,如噪声遵循正态分布。

举一个线性回归的实例: 我们希望根据房屋的面积(平方英尺)和房龄(年)来估算房屋价格(美元)。 为了开发一个能预测房价的模型,我们需要收集一个真实的数据集。 这个数据集包括了房屋的销售价格、面积和房龄。 在机器学习的术语中,该数据集称为训练数据集(training data set) 或训练集(training set)。 每行数据(比如一次房屋交易相对应的数据)称为样本(sample), 也可以称为数据点(data point)或数据样本(data instance)。 我们把试图预测的目标(比如预测房屋价格)称为标签(label)或目标(target)。 预测所依据的自变量(面积和房龄)称为特征(feature)或协变量(covariate)。

通常使用$n$表示数据集中的样本数,对索引为$i$的样本,其输入表示为$X^{(i)}=[x_1^{(i)},x_2^{(i)}]^T$,其对应的标签是$y^{(i)}$。

线性模型

线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:
$$ price=w_{area}*area+w_{age}*age+b\tag{3.1} $$

注:公式标号\tag{},$\hat{y}$s是\hat{}

公式$(3.1)$中的$w{area}$和$w{age}$成为权重,权重决定了每个特征对我们预测值的影响。 $b$称为偏置(bias)、偏移量(offset)或截距(intercept)。 偏置是指当所有特征都取值为0时,预测值应该为多少。 即使现实中不会有任何房子的面积是0或房龄正好是0年,我们仍然需要偏置项。 如果没有偏置项,我们模型的表达能力将受到限制。 严格来说, (3.1)是输入特征的一个 仿射变换(affine transformation)。 仿射变换的特点是通过加权和对特征进行线性变换(linear transformation), 并通过偏置项来进行平移(translation)。

而在机器学习领域,我们通常使用的是高维数据集,建模时采用线性代数表示法会比较方便。 当我们的输入包含$d$个特征时,我们将预测结果$\hat{y}$(通常使用“尖角”符号表示$y$的估计值)表示为:
$$ \hat{y}=w_1x_1+···+w_dx_d+b\tag{3.2} $$
将所有特征放到向量$x \in \R^d$中,将所有权重放入向量$w \in \R^d$中,我们可以用点积形式来简洁表达模型。
$$ \hat{y}=w^Tx+b\tag{3.3} $$
在(3.3),中向量x对应于当个数据样本的特征。用符号表示的矩阵$X \in \R^{n*b}$可以很方面的引用我们整个数据集的n个样本。其中,$X$的每一行是一个样本,每一列是一种特征。

对于特征集合$X$,预测值$\hat{y} \in \R^n$ 可以通过矩阵-向量乘法表示为:
$$ \hat{y}=Xw+B \tag{3.4} $$
虽然我们相信给定$x$预测$y$的最佳模型会是线性的, 但我们很难找到一个有$n$个样本的真实数据集,其中对于所有的$1≤i≤n$,$y^{(i)}$完全等于$w^Tx^{(i)}+b$。 无论我们使用什么手段来观察特征$X$和标签$y$, 都可能会出现少量的观测误差。 因此,即使确信特征与标签的潜在关系是线性的, 我们也会加入一个噪声项来考虑观测误差带来的影响。

在开始寻找最好的模型参数(model parameters)$w$和$b$之前, 我们还需要两个东西: (1)一种模型质量的度量方式; (2)一种能够更新模型以提高模型预测质量的方法

损失函数

在我们开始考虑如何用模型拟合(fit)数据之前,我们需要确定一个拟合程度的度量。 损失函数(loss function)能够量化目标的实际值与预测值之间的差距。 通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。 回归问题中最常用的损失函数是平方误差函数。 当样本$i$的预测值为$\hat{y}^{(i)}$,其相应的真实标签为$y^{(i)}$时, 平方误差可以定义为以下公式:
$$ l^{(i)}(w,b)=\frac{1}{2}{(\hat{y}^{(i)}-y^{(i)})}^2 \tag{3.5} $$
常数1/2不会带来本质的差别,但这样在形式上稍微简单一些 (因为当我们对损失函数求导后常数系数为1)。 由于训练数据集并不受我们控制,所以经验误差只是关于模型参数的函数。 为了进一步说明,来看下面的例子。 我们为一维情况下的回归问题绘制图像,如 图3.1.1所示。

../_images/fit-linreg.svg

由于平方差函数中的二次方项,估计值$\hat{y}^{(i)}$和观测值$y^{(i)}$之间较大的差异导致更大的损失,为了度量模型在整个数据集上的质量,我们需要计算在训练集$n$个样本的损失均值,(求和然后求平均值)。
$$ L(w,b)=\frac{1}{n}\sum_{i=1}^nl^{(i)}(w,b)=\frac{1}{n} \sum_{i=1}^nl^{(i)}\frac{1}{2}{(w^Tx^{i}+b-y^{(i)})}^2 \tag{3.6} $$
在训练模型时,我们希望寻找一组参数$(w^,b^)$, 这组参数能最小化在所有训练样本上的总损失。如下式:
$$ w^*,b^*={argmin}_{w,b}L(w,b)\tag{3.7} $$

随机梯度下降

挑选一个初始值$w_0$

重复迭代参数t=1,2,3
$$ w_t=w_{t-1} $$
沿着梯度方向将增加损失函数值

学习率:步长的超参数

我们需要进行优化模型,在优化算法中,最简单最普遍的算法就是随机梯度下降算法。梯度下降最简单的用法是计算损失函数(数据集 中所有样本的损失均值) 关于模型参数的导数(在这里也可以称为梯度)。 但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。 因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。

在每次迭代中,我们首先随机抽样一个小批量$\beta$, 它是由固定数量的训练样本组成的。 然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。 最后,我们将梯度乘以一个预先确定的正数$\eta$,并从当前参数的值中减掉。

批量大小不能太大,不适合并行来最大利用计算资源。也不能太小,内存消耗增加,浪费计算。

我们用下面的数学公式来表示这一更新过程($\partial $表示偏导数):
$$ (w,b)\gets (w,b)-\frac{\eta}{\beta}\sum_{i \in \beta}\partial _{(w,b)}l^{(i)}(w,b) \tag{3.8} $$
总结一下,算法的步骤如下: (1)初始化模型参数的值,如随机初始化; (2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。 对于平方损失和仿射变换,我们可以明确地写成如下形式:
$$ $$

矢量化加速

为什么用矢量?

矢量加速在我们训练模型时,希望能同时处理整个小批量的样本,矢量化代码通常会带来数量级的加速。

正态分布与平方损失

通过对噪声分布的假设来解决平方损失目标函数。正态分布和线性回归之间的关系很密切。 正态分布(normal distribution),也称为高斯分布(Gaussian distribution), 最早由德国数学家高斯(Gauss)应用于天文学研究。 简单的说,若随机变量$x$具有均值$\eta$和方差$\sigma^2$(标准差$\sigma$),其正态分布概率密度函数如下:
$$ p(x)=\frac{1}{\sqrt{2\pi\sigma^2}\exp (-\frac{1}{2\sigma ^2}(x-\eta)^2)} $$
../_images/output_linear-regression_216540_70_0.svg

改变均值影响x轴的偏移,增加方差影响分散分布,降低峰值。

均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是: 我们假设了观测中包含噪声,其中噪声服从正态分布。 噪声正态分布如下式:
$$ y=w^Tx+b+ \epsilon \tag{3.11} $$
其中,$\epsilon ~ N(0,\sigma ^2)$。

因此,我们现在可以写出通过给定的$x$观测到特定$y$的似然(likelihood):
$$ P(y|x)= \frac{1}{\sqrt{2\pi\sigma ^2}}\exp (-\frac{1}{2\sigma ^2}(y-w^Tx-b)^2) $$
现在,根据极大似然估计法,参数$w$和$b$的最优值是使整个数据集的似然最大的值:
$$ P(y|X)=\prod_{i=1}^{n} p(y^{(i)}|x^{(i)}) $$

线性回归的从零开始实现

权重衰退

使用均方范数作为硬性限制

image-20231008091207841

柔性限制:

image-20231008091351561

参数更新法则

计算梯度:image-20231008091732049

时间t更新参数:image-20231008091817313

实际中权重衰退的值一般设置为0.001, 0.0001。

丢弃法---多层感知机所用到的。 dropout全连接层用

只在训练中使用,推理中的丢弃法直接返回输入,这样保证确定性的输入。如果丢弃会出现数据遗失,训练时可以使用是因为训练的的轮次多。

dropout的作用是降低模型复杂度。

期望是不变的。E=p 0+(1-p) x/(1-p)

丢弃法将一些输出项随机置0来控制模型复杂度,

常作用在多层感知机的隐藏层输出上,

丢弃概率是控制模型复杂度的超参数0.1 0.5 0.9

数值稳定性

神经网络的梯度

梯度爆炸 出现的问题:1.值超出值域。2. 对学习率敏感,(即学习率太大---大参数--更大的梯度,学习率太小--训练无进展,我们可能需要在训练过程中调整学习率。

梯度消失:出现的问题:1. 梯度值为0,2. 训练无进展,3. 对底部层尤为严重。

  • 当数值过大或者过小会导致数值问题,
  • 常发生在深度模型中,因为其会对n个数累乘,

所以如何让训练更加稳定

目标:让梯度值在合理的范围内,[1e-6,1e3]

将乘法变加法:ResNet,LSTM

归一化:梯度归一化,梯度裁剪(设置区间)

合理的权重初始和激活函数。

将每层的输出和梯度都看作随机变量,

让他们的均值和方差保持一致

权重初始化

  • 在合理值区间里随机初始参数
  • 训练开始的时候更容易有数值不稳定
    • 远离最优解的地方损失函数表面可能很复杂
    • 最优解附近表面会比较平
  • 使用均值为0方差为0.01,
  • 使用xavier初始 $r_t=2/(n_t-1+nt)$主要是尽量满足$n{t-1}r_t=1$和$n_tr_t=1$

VGG块使用3乘3的卷积层。使用可重复时殷弘的卷积块来构建

全连接层的问题就是参数太多,全连接层的参数数量等于输入的通道数×高×宽×输出通道数

NIN就是不要全连接层了。NiN块:一个卷积层后跟两个1 1卷积层来当全连接层(11).步幅1无填充,输出形状跟卷积层输出一样。起到全连接层的作用。

NiN架构是无全连接层

残差快:

串联一个层改变函数类,我们希望能扩大函数类,残差块加入快速通道来得到f(x)=x+g(x)的结构

使得很深的网络更加容易训练,残差网络对随后的深层神经网络

raise AssertionError("Torch not compiled with CUDA enabled")
AssertionError: Torch not compiled with CUDA enabled

进程已结束,退出代码1

解决方案卸载gpu版本的torch,安装cpu版本的torch

numpy 2.4版本以上都不能使用 np.long,所以选用2.3版本的。

sparsesvd 要安装0.1.9版本才能安装成功。

torch和torchvision,cpu版本在解析其中会显示+cpu才是cpu版本,不加cpu是gpu版本。也能用就是是用不了cuda。

现在是能跑起来CPU版本的,但是内存会炸掉。

目录
相关文章
|
3月前
|
机器学习/深度学习 数据挖掘 C#
用C#实现简单的线性回归
用C#实现简单的线性回归
42 1
|
4月前
什么是线性回归
【7月更文挑战第21天】什么是线性回归。
68 2
|
4月前
|
数据可视化 Python
数学方法解决线性回归问题
【7月更文挑战第21天】数学方法解决线性回归问题
46 2
|
4月前
|
机器学习/深度学习
逻辑回归
【7月更文挑战第22天】逻辑回归
41 5
|
4月前
|
机器学习/深度学习 算法 数据挖掘
线性回归
【7月更文挑战第21天】线性回归。
58 1
|
5月前
|
机器学习/深度学习 存储 自然语言处理
逻辑回归的介绍和应用
**逻辑回归简介** 逻辑回归是一种分类模型,尽管名字含“回归”,实际上是用于二分类问题的。它简单易懂,计算高效,适用于许多领域,如医学、社会科学、市场营销等。优点是模型简单,易于实现,具有强解释性。然而,它易受多重共线性影响,可能欠拟合,分类精度有限,尤其对非线性问题和数据不平衡问题处理不佳。在实践中,逻辑回归常作为其他复杂算法的基线,如用于信用卡欺诈检测和点击率预测。通过调整和与其他技术结合,如GBDT,可以提升其性能。
|
6月前
R方和线性回归拟合优度
R方和线性回归拟合优度
|
6月前
使用R语言进行多项式回归、非线性回归模型曲线拟合
使用R语言进行多项式回归、非线性回归模型曲线拟合
|
机器学习/深度学习 API 算法框架/工具
二、逻辑回归
二、逻辑回归

相关实验场景

更多