线性模型与非线性扩展
引言
机器学习的基本流程如下:
上图中,定义函数就是为了构建模型,损失是越少越好的,优化是为了实现loss最小化从而得到的参数。
回归与分类是两大类问题
- 回归问题的输出是连续值,是一个连续的问题,连续变化的值
- 分类问题的输出是离散值,是一个离散的值,离散的输出
- 区别:模型最后一层的设计方式不同
机器学习 ≈ 寻找函数
函数类型
线性回归
定义:
-
给定由m个属性描述的样本 x = ( x 1 ; x 2 ; … ; x m ) \boldsymbol{x} = (x_1; x_2; \ldots; x_m) x=(x1;x2;…;xm),其中 x i x_i xi 是 x \boldsymbol{x} x 在第 i i i 个属性上的取值,线性回归(linear regression)试图学得一个通过属性值的线性组合来进行预测的函数:
f ( x ) = w 1 x 1 + w 2 x 2 + … + w m x m + b f(\boldsymbol{x}) = w_1 x_1 + w_2 x_2 + \ldots + w_m x_m + b f(x)=w1x1+w2x2+…+wmxm+b -
一般用向量的形式写成:
f ( x ) = w T x + b f(\boldsymbol{x}) = \boldsymbol{w}^\mathsf{T} \boldsymbol{x} + b f(x)=wTx+b 其中 w = ( w 1 ; w 2 ; … ; w m ) \boldsymbol{w} = (w_1; w_2; \ldots; w_m) w=(w1;w2;…;wm)。 -
给定训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x i , y i ) , … , ( x n , y n ) } D = \{(\boldsymbol{x}_1, y_1), (\boldsymbol{x}_2, y_2), \ldots, (\boldsymbol{x}_i, y_i), \ldots, (\boldsymbol{x}_n, y_n)\} D={(x1,y1),(x2,y2),…,(xi,yi),…,(xn,yn)}
其中 x i = ( x i 1 ; x i 2 ; … ; x i m ) \boldsymbol{x}_i = (x_{i1}; x_{i2}; \ldots; x_{im}) xi=(xi1;xi2;…;xim), y i ∈ R y_i \in \mathbb{R} yi∈R -
可用最小二乘法 (least square method) 对 w \boldsymbol{w} w 和 b b b 进行估计。
最小二乘法估计:
-
下面以一元线性回归为例,来详细讲解 w w w 和 b b b 的最小二乘法估计
f ( x i ) = w x i + b , 使得 f ( x i ) ≃ y i f(x_i) = wx_i + b, \text{ 使得 } f(x_i) \simeq y_i f(xi)=wxi+b, 使得 f(xi)≃yi
-
最小二乘法就是基于预测值和真实值的均方差最小化的方法来估计参数 w w w 和 b b b:
( w ∗ , b ∗ ) = arg min ( w , b ) ∑ i = 1 n ( f ( x i ) − y i ) 2 (w^*, b^*) = \arg \min_{(w, b)} \sum_{i=1}^{n} (f(x_i) - y_i)^2 (w∗,b∗)=arg(w,b)mini=1∑n(f(xi)−yi)2 = arg min ( w , b ) ∑ i = 1 n ( y i − w x i − b ) 2 = \arg \min_{(w, b)} \sum_{i=1}^{n} (y_i - wx_i - b)^2 =arg(w,b)mini=1∑n(yi−wxi−b)2
-
最小化均方误差 E ( w , b ) = ∑ i = 1 n ( y i − w x i − b ) 2 E_{(w,b)} = \sum_{i=1}^{n} (y_i - wx_i - b)^2 E(w,b)=i=1∑n(yi−wxi−b)2- 分别对 w w w 和 b b b 求偏导,可得 ∂ E ( w , b ) ∂ w = 2 ( w ∑ i = 1 n x i 2 − ∑ i = 1 n ( y i − b ) x i ) \frac{\partial E_{(w,b)}}{\partial w} = 2 \left( w \sum_{i=1}^{n} x_i^2 - \sum_{i=1}^{n} (y_i - b) x_i \right) ∂w∂E(w,b)=2(wi=1∑nxi2−i=1∑n(yi−b)xi) ∂ E ( w , b ) ∂ b = 2 ( n b − ∑ i = 1 n ( y i − w x i ) ) \frac{\partial E_{(w,b)}}{\partial b} = 2 \left( nb - \sum_{i=1}^{n} (y_i - wx_i) \right) ∂b∂E(w,b)=2(nb−i=1∑n(yi−wxi))
-
令上两式为零可得到 w w w 和 b b b 最优解的闭式(closed-form)解:
w = ∑ i = 1 n y i ( x i − x ˉ ) ∑ i = 1 n x i 2 − 1 n ( ∑ i = 1 n x i ) 2 w = \frac{\sum_{i=1}^{n} y_i (x_i - \bar{x})}{\sum_{i=1}^{n} x_i^2 - \frac{1}{n} \left( \sum_{i=1}^{n} x_i \right)^2} w=∑i=1nxi2−n1(∑i=1nxi)2∑i=1nyi(xi−xˉ) b = 1 n ∑ i = 1 n ( y i − w x i ) b = \frac{1}{n} \sum_{i=1}^{n} (y_i - wx_i) b=n1i=1∑n(yi−wxi) -
其中, x ˉ = 1 n ∑ i = 1 n x i \bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i xˉ=n1∑i=1nxi
通过上述的推导我们可以发现,上述并没有用到机器学习相关的方法,而是通过纯数学的方法进行求解的,那既然能够通过纯数学的方式得到上述的最优解,又为啥需要大费周章的使用机器学习的方法去拟合出来最优解呢?我认为有以下原因:
- 这是一个唯一有最优解的模型,后续较为复杂的模型都不能通过纯数学的方式得到最优解了,只能通过拟合得出近似的最优解。
- 纯数学的方法缺陷:对于大规模的数据,效率低下,甚至没法去求
因此,实际应用中一般不采用显式求解的方法,往往通过优化方法来进行迭代寻找最优参数。比如梯度下降法。
线性回归实例
上述老师在讨论视频观看次数的预测时,强调了其对于资源分配的重要性:如果某视频的预期观看次数很高,则需相应增加服务器部署,以保障用户体验,满足大量观众的同时访问需求。
此外,还介绍了银行如何运用预测机制来规划现金流。银行通过预测未来一段时间内客户的取款需求,提前做好资金准备,并保持一定的储备金水平。这样可以避免因客户取款而出现资金短缺的情况,防止由此导致的信任危机和潜在的法律问题。这种预防措施对于维持金融机构的稳定运营至关重要。
上图中0.5k表示的是500。
一般来说,我们定义的损失函数需要满足,损失函数值越小,能说明模型越好,这样定义的损失函数值就是比较合理的。
一般比较常见的损失函数值就是平均绝对值误差L1和均方误差L2。
MAE就是平均绝对值误差,MSE就是均方误差。右侧的图片表明椭圆线上的点误差值是相同的,同时左下角的Loss大,右上角的Loss小。类似于地理里面的等高线,这就是一个左下角类似山地,右上角就是海拔较低的地势。
优化的过程就是(我的理解):
在优化过程中,我们首先随机选择一个初始值 w 0 w_0 w0 作为起始点。无论这个初始点在哪里,接下来我们会计算损失函数在该点的梯度。根据数学上的定义,梯度指向的是函数值增长最快的方向。因此,为了使损失函数尽可能快地减小,我们将沿着负梯度方向更新权重。同时,为了避免因步长过大而跳过最优解,我们需要引入一个超参数 η \eta η(通常称为学习率)来控制每次更新的步长,从而调节梯度下降的速度。
具体来说,这一过程可以表述为:给定初始权重 w 0 w_0 w0,通过迭代方式更新权重,
w n + 1 = w n − η ⋅ ∇ L ( w n ) w_{n+1} = w_n - \eta \cdot \nabla L(w_n) wn+1=wn−η⋅∇L(wn)
其中,
L
L
L 表示损失函数,
∇
L
(
w
n
)
\nabla L(w_n)
∇L(wn) 表示在当前权重
w
n
w_n
wn 处损失函数的梯度,而
η
\eta
η 控制着每次沿负梯度方向移动的步长大小。适当选择
η
\eta
η 的值对于确保算法能够有效地收敛到最小值至关重要。
实际上,通过上述的迭代过程并设定合适的学习率
η
\eta
η,我们确实能够找到一个局部最优解。然而,这并不能保证找到全局最优解。
如上图所示,尽管从初始点 w 0 w_0 w0 经过 T T T 次迭代后达到了 w T w_T wT 这个局部最小值,但这个位置并非全局最小值。要到达全局最小值,需要越过一个相对较高的“山峰”,即所谓的Loss壁垒。根据梯度下降算法本身的特性,如果学习率设置不当,是无法跨越这种局部极小值区域进而达到全局最优解的。为了克服这个问题,可以尝试使用较大的学习率 η \eta η,使得更新步骤能够跳过这些障碍,从而在后续的迭代过程中有可能抵达全局最优解。
然而,这不禁使我们思考:是否一定要达到全局最优解才是最理想的呢?
实际上,追求绝对的最优解并不总是最佳选择。例如,在数据处理阶段,如果某个数据点因错误处理而形成了所谓的“针形”异常(即异常突出的数据点),那么模型在训练过程中可能会被这些异常值误导,从而学习到一些不具备泛化性的特征或模式。这种情况不仅会浪费计算资源,还可能导致过拟合问题,使得模型在训练集上表现优异,但在未见过的测试集或实际应用中性能大幅下降。
因此,在实际应用中,适度接受次优解可能更加明智。通过适当的正则化、引入早停机制(early stopping)、使用dropout等技术,可以有效防止模型陷入局部极小值或者对异常值过于敏感的问题。此外,合理设置超参数如学习率 η \eta η,以及采用更先进的优化算法(如Adam、RMSprop等),也可以帮助模型更好地泛化,并避免被训练数据中的噪声和异常值所干扰。最终目标是构建一个既能够准确捕捉数据本质特征,又具有较强泛化能力的模型,以确保其在各种应用场景下的稳定性和可靠性。
我们发现:经过多轮迭代后,上述模型的误差为
L
=
0.48
k
L = 0.48k
L=0.48k。尽管这一误差值表明模型在当前阶段的表现仍存在较大改进空间,但这种结果实际上受到多种因素的影响。以下是一些可能的原因:
-
模型复杂度不足(欠拟合)
如果模型过于简单,例如使用了线性模型来处理非线性问题,可能会导致其无法捕捉到数据中的复杂模式和特性,从而出现欠拟合现象。这通常表现为训练误差和测试误差都较高。在这种情况下,可以尝试增加模型的复杂度,例如引入更多特征、使用更高阶的多项式回归,或者采用深度学习等更强大的模型架构。 -
训练集样本数量不足
数据是机器学习模型的核心驱动力。如果训练集样本数量过少,模型可能无法充分学习到数据的分布规律,进而影响其泛化能力。解决这一问题的方法包括:收集更多真实数据、进行数据增强(data augmentation),或者使用迁移学习技术,利用预训练模型的知识来弥补数据量的不足。 -
超参数设定不合理
超参数的选择对模型性能有着重要影响。例如,学习率 η \eta η 设置过高可能导致模型无法收敛,而设置过低则会导致训练过程过慢甚至陷入局部最优解;正则化系数设置不当可能导致欠拟合或过拟合。因此,在实际应用中,建议通过网格搜索(grid search)、随机搜索(random search)或贝叶斯优化(Bayesian optimization)等方法对超参数进行调优,以找到最佳的配置。 -
特征工程不足
特征的质量直接影响模型的学习效果。如果特征选择不当或特征提取不充分,模型可能难以捕捉到数据中的关键信息。为此,可以通过特征选择算法(如递归特征消除 RFE)、主成分分析(PCA)降维,或者手工设计更有意义的特征来提升模型的表现。 -
噪声和异常值的影响
如果训练数据中存在较多噪声或异常值,模型可能会被误导,从而学习到错误的模式。为了缓解这一问题,可以在数据预处理阶段进行异常值检测和清理,或者采用鲁棒性更强的模型和损失函数(如Huber损失)。 -
评估指标的选择
最后需要注意的是,误差值 L = 0.48 k L = 0.48k L=0.48k 是否合理,还需要结合具体的应用场景和评估指标来判断。例如,在某些任务中,误差值 0.48 k 0.48k 0.48k 可能已经足够好,而在其他任务中可能仍然需要进一步优化。因此,选择合适的评估指标(如均方误差 MSE、平均绝对误差 MAE 或准确率 Accuracy)以及合理的误差容忍范围,对于模型的实际应用至关重要。
我们还发现:在训练集上的误差 L = 0.48 k L= 0.48 k L=0.48k 是小于在测试集上的误差 L = 0.58 k L= 0.58 k L=0.58k 的,这不禁使我们思考:是否测试集误差一定大于训练集误差?
通常情况下,我们会发现测试集上的误差大于训练集上的误差,这是因为模型在训练集上进行了直接的学习和参数调整,而在测试集上则需要对未见过的数据进行预测。然而,这一现象并非绝对。在某些特定情况下,可能会观察到训练集上的误差高于测试集误差,这可能由以下几个因素导致:
- 数据分布不均:如果训练集和测试集的样本分布存在显著差异,可能导致模型在训练集上表现不佳,但在测试集上表现较好。
- 过拟合问题:虽然过拟合通常会导致训练集误差低而测试集误差高,但在极端情况下,如果测试集中包含大量与模型假设高度吻合的数据点,即使模型过度适应了训练集,也可能在测试集上表现出较低的误差。
- 样本量差异:当训练集的样本量远小于测试集时,训练集可能无法充分代表整体数据分布,从而导致较高的误差;相反,较大的测试集更有可能覆盖数据的所有特征,使得模型在测试集上的表现优于训练集。
- 噪声数据的影响:如果训练集中含有较多的噪声或异常值,模型可能会学习到这些不相关的模式,从而影响其在训练集上的性能,但若测试集相对“干净”,模型的表现反而会更好。
从图中可以看出,估计值(蓝色曲线)相对于标签值(红色曲线)似乎存在一定的滞后。
还可以看出,在增加训练样本后,模型的误差 L ’ L^’ L’ 在2021年只能达到0.46k并且无法进一步提升,可能是因为模型过于简单,模型在训练集上过度拟合、数据分布变化、时间序列特性的复杂性以及超参数调优不足等原因。
线性模型的非线性拓展
上述可以发现:
- 左图强调了线性模型的局限性,即简单的线性关系无法捕捉复杂的数据模式。
- 右图展示了如何通过组合多个分段线性函数来逼近复杂的非线性关系,从而实现线性模型的非线性拓展
Q :非线性从哪里来?
A : 用一个线性函数加上一个阶梯状的函数,阶梯状的函数使用Sigmoid进行拟合
在上述定义的损失函数中,1/N
是一个用于表示平均损失的系数。由于梯度更新的核心在于损失函数对模型参数的偏导数,而 1/N
对最终的求导结果并无实质影响,因此可以选择将其省略。
它的作用主要是为损失值赋予不同的物理意义:
- 如果保留
1/N
,则损失表示的是单个样本的平均损失。 - 如果省略
1/N
,则损失表示的是整个样本集的总损失。
损失函数并不需要显式地包含模型中的所有参数,但必须通过模型的输出间接依赖于这些参数。 在优化过程中,梯度下降的目标是找到最优的模型参数。如果某个参数对损失函数没有任何影响(即损失函数与该参数无关),那么我们无法通过梯度下降来优化该参数。
因此,为了确保所有参数都能被优化,损失函数的设计需要满足以下条件:
- 它必须通过模型的前向传播过程间接依赖于所有的可训练参数。
- 这样才能为每个参数提供有效的梯度信息,从而实现参数的更新和优化。
分批:每一批样本可以得到新的参数
在深度学习中,选择合适的batch_size
对训练效率和模型性能非常重要。 - 一次性使用所有样本的问题
虽然可以将batch_size
设置为样本总数(如 10,000),但这种方式通常效率较低,尤其是在模型参数较多或硬件资源有限的情况下。此外,一次性学习所有样本容易导致模型过拟合,因为模型可能会过度关注训练数据的整体分布,而忽略局部特征。 batch_size
的灵活性
实际上,batch_size
可以设置为任意值,甚至可以为 1(即随机梯度下降,SGD)。但为了提高计算效率和程序实现的便利性,通常建议选择 2 的倍数(如 32、64、128 等)。这种选择有以下优点:- 更好地利用硬件资源(如 GPU 的并行计算能力)。
- 在训练过程中引入一定的随机性,有助于提升模型的泛化能力。
在实际应用中,Sigmoid 和 ReLU 激活函数在某些场景下的效果可能相差不大。然而,ReLU 因其以下优势而被广泛采用:
- 实现简单:ReLU 的计算仅涉及阈值操作,无需复杂的指数运算,计算效率更高。
- 缓解梯度消失问题:相比于 Sigmoid,ReLU 在正区间内的梯度恒为 1,能够有效缓解深层网络中的梯度消失问题。
因此,在深度学习中,ReLU 成为了更常用的激活函数,尤其是在深层神经网络的训练中表现尤为突出。
上述展示了一个使用多层神经网络进行浏览量预测的实验结果。左侧列出了不同时间段的损失值,右侧则通过图表直观地展示了模型预测值与真实值之间的对比,指出了模型在某些时间段可能存在预测误差的问题。
通用的多类分类器