线性回归
回归是能为一个或者多个自变量与因变量之间关系建模的一类方法,在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
在机器学习领域中的大多数任务通常都与预测有关。当我们想预测一个数值时,就会涉及到回归问题。常见的例子包括:预测价格(房屋、股票等)、预测住院时间(针对住院病人等)、预测需求(零售销量等)。但不是所有的预测都是回归问题。其中分类问题的目标是预测数据属于一组类别中的哪一个。
线性回归(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所示。
由于平方差函数中的二次方项,估计值$\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)} $$
改变均值影响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)}) $$
线性回归的从零开始实现
权重衰退
使用均方范数作为硬性限制
柔性限制:
参数更新法则
计算梯度:
时间t更新参数:
实际中权重衰退的值一般设置为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版本的,但是内存会炸掉。