MSE与正则
Mean Squared Error 均方误差MSE
均方误差MSE是衡量预测值与真实值之间差异的一种指标,通过计算误差的平方并取平均来表示整体误差大小。
公式为:
MSE=1n∑i=1n(yi−y^i)2 \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
这里平方的作用有两个。
一个是如果只做误差求和,正负误差可能抵消导致误差看起来很小,而平方后所有误差都变为正值。
另一个意义是误差越大,平方后贡献越大。因此 MSE 对离群点特别敏感,这在训练过程中可以促使模型减少大误差点。
比如一组真实位置是y=[100, 102, 98, 101],世界模型预测的位置是y^=[98, 101, 97, 105],则
MSE=4+1+1+164MSE=224=5.5 \begin{align} \text{MSE} &= \frac{4 + 1 + 1 + 16}{4} \\ \text{MSE} &= \frac{22}{4} = 5.5 \end{align} MSEMSE=44+1+1+16=422=5.5
MSE使得较大的误差在损失中占更大权重,可以促使模型更加关注“严重错误”。适用于需要强力惩罚大偏差的任务。计算成本低且梯度结构简单,是多数回归模型默认的损失格式。但是同样离群点的误差平方会被极大放大,导致训练过程被少数 outlier 主导。
虽然“平均”确实会把总数摊平,但因为平方的存在,大的误差在被平均之前,已经被指数级放大了。比如:
| 指标 | 计算过程 (场景 A: 2, 2, 2) | 计算过程 (场景 B: 0, 0, 6) | 结论 |
|---|---|---|---|
| MAE (平均绝对误差) | (2+2+2)/3=2(2+2+2)/3 = \mathbf{2}(2+2+2)/3=2 | (0+0+6)/3=2(0+0+6)/3 = \mathbf{2}(0+0+6)/3=2 | MAE 认为这两个模型一样好。 |
| MSE (均方误差) | (22+22+22)/3=12/3=4(2^2 + 2^2 + 2^2)/3 = 12/3 = \mathbf{4}(22+22+22)/3=12/3=4 | (02+02+62)/3=36/3=12(0^2 + 0^2 + \mathbf{6^2})/3 = 36/3 = \mathbf{12}(02+02+62)/3=36/3=12 | MSE 认为场景 B 糟糕得多! |
即便最后除了 nnn(取平均),那个被平方放大的“异常值”依然能主导整个结果。
至于是如何对应到每一个单独参数的更新的,这是涉及到链式法则,计算机并不是“一眼”看出怎么改的,而是像拆炸弹引线一样,通过链式法则把总误差(MSE)一层一层地倒推回每一个具体的参数上。
比如,有十个权重,要算 w1w_1w1 的偏导,我们需要看 w1w_1w1 是怎么一步步影响最终的 Loss(MSE)的:w1w_1w1 影响预测值 y^\hat{y}y^,预测值 y^\hat{y}y^ 影响误差 Loss,经过链式法则求导以后,损失函数对w1w_1w1的偏导就是:
∂Loss∂w1=2(y^−y) x1 \begin{align} \frac{\partial \text{Loss}}{\partial w_1} &= 2(\hat{y} - y)\, x_1 \end{align} ∂w1∂Loss=2(y^−y)x1
这里要注意到一件事情,我们计算的这个偏导是Loss对参数的偏导,也就是说我们求出来的正负方向引导的是Loss的变化,但我们的目标就是想让Loss变小,所以如果这个结果是负的,那就说明这个x越大(x轴往右),Loss也就越小,这就是符合我们的目标的,所以这时候就需要让这个参数增大。
严格来说梯度(Gradient)就是把所有参数的“偏导数”打包在一起,形成的一个“向量”(或者说张量)。但是在代码里,访问某个具体参数 w_1 的偏导数时,我们用的属性名就是 .grad,所以在深度学习圈子里,大家也可以说是某个参数的梯度。
虽然大家共用同一个“误差项” 2(y^−y)2(\hat{y} - y)2(y^−y),但是每个参数对应的**输入数据(xxx)**不同,所以每个参数可以被不同对待。所以就算需要更新每一个单独的参数,也需要先算总得误差,因为偏导里用到了这一项作为大方向的指导,这是一个全局信号。
但是这样在原始数据直接输入模型时,数值大的特征(如房屋面积)会在梯度更新中占据主导地位,而掩盖了数值小的特征(如房间数量)的重要性,哪怕后者其实对预测结果非常关键。如果不做处理,这是“不公平”的,所以需要做数据缩放来统一量纲。
至于为什么要引入L1正则:
L1正则的理念就是:
**“如无必要,勿增实体。”**要在一个数据爆炸的时代,找到那个“最简单”的真理,引入稀疏性原则。
就是这样,正好解决了一部分过拟合问题,因为过拟合(Overfitting)的本质是模型想得太多,太复杂了,太聪明了,它发现不如直接背答案。它把训练数据中的“噪声”和“巧合”当成了必须遵守的“真理”。
过拟合往往是因为模型在原本不重要的特征上找到了某种“虚假的规律”。假设你要预测房价。你的数据里除了面积、地段,还混入了一个无关特征:“卖房那天房东穿的袜子颜色”。在你的训练集里,刚好有 3 套豪宅的房东都穿了红袜子。它会敏锐地捕捉到这个规律,给“红袜子”分配一个巨大的权重,那么模型就会去拟合这个噪声,在训练集上表现优异。
L1正则的加入:
L1加入的途径其实是修改了“中央指挥部的命令”(也就是 Loss),进而改变了传达给参数的梯度。
在没有正则化时,总目标(总损失)是让预测准,即MSE最小:
J=MSE \begin{align} J &= \text{MSE} \end{align} J=MSE
加上 L1 正则后,目标变成了“预测准” 加上 “参数绝对值要小”,L1正则要向参数收税:
Jtotal=MSE⏟原本的任务+λ∑∣wi∣⏟L1 正则项 (过路费) \begin{align} J_{\text{total}} &= \underbrace{\text{MSE}}_{\text{原本的任务}} + \underbrace{\lambda \sum |w_i|}_{\text{L1 正则项 (过路费)}} \end{align} Jtotal=原本的任务
MSE+L1 正则项 (过路费)
λ∑∣wi∣
其中λ\lambdaλ (Lambda):是控制的“纳税力度”。
梯度的本质是导数,现在对新的总损失进行求导,也就是说原来w1w_1w1的偏导加了一项:
λ⋅sign(w)⏟L1 强加的固定推力 \underbrace{\lambda \cdot \text{sign}(w)}_{\text{L1 强加的固定推力}} L1 强加的固定推力
λ⋅sign(w)
纳税力度是一样的,也就是说无论现在的权重是正数还是负数,正则都想做到稀疏化,正则都想把这个参数压到0,正则不想要这个权重参与拟合。
这里也能看出来L1正则的清零能力,因为λ\lambdaλ (Lambda)是固定推力: 哪怕 www 已经很小了(比如 0.05),只要 λ\lambdaλ 设得够大(比如 0.1),梯度更新就会直接把 www 推过 0。
所以正则能把那些不重要的特征的权重,硬生生地推到 0,让模型彻底“遗忘”这个特征,因为权重如果重要,MSE就不会同意,MSE就会把总损失拉回去。
所以在更新时其实是这两项的一个博弈过程,看谁权限更大,看谁不同意,从而达到一个均衡的平衡。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)