神经网络中的损失函数(上)——回归任务

前言

神经网络是深度学习的基础。在神经网络中,损失函数和优化函数是两个非常重要的概念,它们共同决定了模型的性能和训练效果。本文将介绍神经网络中比较常用的损失函数。

损失函数的含义

损失函数是用于量化预测值与真实值之间误差大小的一个非负函数。数值越小表示损失越小,完美预测时损失为0。不同的损失函数具有不同倾向性,在实际应用中要根据实际需要选取使用的损失函数。

我们的目标是通过优化函数来找到损失函数的最小值点,从而使得模型达到最好的效果。

神经网络完成的任务大致可分为两类,回归任务和分类任务。这两类任务中常用的损失函数不太一样。本文将介绍回归任务中常用的几个损失函数。由于篇幅原因,分类任务中的损失函数将单独拿出来讲。

回归任务中的损失函数

在回归任务中,假设有 n n n个数据,输入为 X = ( x 1 , x 2 , ⋯   , x n ) X=(x_1,x_2,\cdots,x_n) X=(x1,x2,,xn),真实值为 Y = ( y 1 , y 2 , ⋯   , y n ) Y=(y_1,y_2,\cdots,y_n) Y=(y1,y2,,yn),预测值为 Y ^ = ( y ^ 1 , y ^ 2 , ⋯   , y ^ n ) \widehat{Y}=(\widehat{y}_1,\widehat{y}_2,\cdots,\widehat{y}_n) Y =(y 1,y 2,,y n)。而损失函数的作用就是量化 Y Y Y Y ^ \widehat{Y} Y 之间的差距。

平均绝对误差(MAE)

平均绝对误差(Mean Absolute Error,MAE)的公式为 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \frac{1}{n}\sum_{i=1}^n |y_i-\widehat{y}_i| n1i=1nyiy i

这个公式可以从范数和距离两个角度来理解。

L1范数

从范数的意义上来理解平均绝对误差,忽略掉 1 n \frac{1}{n} n1,其实这个式子就是 ∣ ∣ Y − Y ^ ∣ ∣ 1 ||Y-\widehat{Y}||_1 ∣∣YY 1,即 Y − Y ^ Y-\widehat{Y} YY 的L1范数。由于这个原因,所以MAE又被称为L1 Loss。

在实际应用中,这个 1 n \frac{1}{n} n1并不重要,在有些地方有 1 n \frac{1}{n} n1,有些地方没有,但其实在效果上是几乎一样的,故不作严格区分。

曼哈顿距离

考虑两个向量之间的差距,可以用两个向量间的距离来表示。而平均绝对误差的形式则与曼哈顿距离非常像。 Y Y Y Y ^ \widehat{Y} Y 的曼哈顿距离定义为

d ( Y , Y ^ ) = ∑ i = 1 n ∣ y i − y ^ i ∣ d(Y,\widehat{Y})=\sum_{i=1}^n |y_i-\widehat{y}_i| d(Y,Y )=i=1nyiy i

优点

无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解。

缺点

MAE训练过程中梯度始终很大,且在0点连续但不可导,这意味着模型学习速度慢,同时会导致使用梯度下降训练模型是,在结束时可能会遗漏全局最小值。

均方误差(MSE)

均方误差(Mean Squared Error,MSE)的公式为 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \frac{1}{n}\sum_{i=1}^n (y_i-\widehat{y}_i)^2 n1i=1n(yiy i)2

均方误差家族

均方误差有几个兄弟姐妹,这里也简单提一提。

均方根误差(Root Mean Squared Error,RMSE)的公式为 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \sqrt{\frac{1}{n}\sum_{i=1}^n (y_i-\widehat{y}_i)^2} n1i=1n(yiy i)2

残差平方和(Square residual sum,RSS)的公式为 ∑ i = 1 n ( y i − y ^ i ) 2 \sum_{i=1}^n (y_i-\widehat{y}_i)^2 i=1n(yiy i)2

平方损失函数的公式为 1 2 ∑ i = 1 n ( y i − y ^ i ) 2 \frac{1}{2}\sum_{i=1}^n (y_i-\widehat{y}_i)^2 21i=1n(yiy i)2

这几个公式其实非常像,无非就是乘除一个常数,开个根号的区别而已。但其实我们知道,这些操作是不会改变最小值点的,所以这些公式的最小值点都是一样的,只是在面对不同的优化函数时各有各的优势。均方根误差在量纲上跟平均绝对误差保持一致,可以在数值上与平均绝对误差作为对比。平方损失函数的 1 2 \frac{1}{2} 21并不会带来本质的区别,但是对其求导,常数的系数为1,在形式上稍微简单一些。而且在最小二乘法中使用的损失函数就是平方损失函数。

最小二乘法在历史上相当出名。据说,大名鼎鼎的高斯当年就是运用最小二乘法成功预言了谷神星出现的位置,从此他的名声传遍了全世界。

均方误差是有着严格理论推导的科学方法。在高斯噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计(证明在下面)。也就是说,对于一个线性模型,如果噪声项是高斯噪声,那么均方误差作为损失函数就是最优的。

至于为什么均方误差在均方误差家族的众多函数中脱颖而出,可能也是大量实验的结果。这些函数在本文中并不做严格区分。

L2范数

从范数的意义上来理解,其实残差平方和就是 ∣ ∣ Y − Y ^ ∣ ∣ 2 ||Y-\widehat{Y}||_2 ∣∣YY 2,即 Y − Y ^ Y-\widehat{Y} YY 的L2范数。均方误差又被称为L2 Loss。

欧氏距离

从距离的角度来看,这跟欧几里得距离很像。 Y Y Y Y ^ \widehat{Y} Y 的欧几里得距离定义为

d ( Y , Y ^ ) = ∑ i = 1 n ( y i − y ^ i ) 2 d(Y,\widehat{Y})=\sqrt{\sum_{i=1}^n (y_i-\widehat{y}_i)^2} d(Y,Y )=i=1n(yiy i)2

极大似然估计

我们从极大似然的角度来推导一下均方误差的公式。我们来考虑线性回归,假设真实值满足 y = w x + b + ϵ y=wx+b+\epsilon y=wx+b+ϵ ϵ \epsilon ϵ为噪声项,假设其服从 N ( 0 , σ ) N(0,\sigma) N(0,σ),即均值为0,标准差为 σ \sigma σ的正态分布。我们希望拟合出的函数为 y = w x + b y=wx+b y=wx+b

我们现在可以写出通过给定的 x x x观测到特定 y y y的似然(likelihood):

P ( y ∣ x ) = 1 2 π σ 2 e x p { − 1 2 σ 2 ( y − w x − b ) 2 } P(y|x)=\frac{1}{\sqrt{2\pi \sigma^2}}exp\{-\frac{1}{2\sigma^2}(y-wx-b)^2\} P(yx)=2πσ2 1exp{ 2σ21(ywxb)2}

现在,根据极大似然估计法,参数 w w w b b b的最优值是使整个数据集的似然最大的值:

P ( Y ∣ X ) = ∏ i = 1 n P ( y i ∣ x i ) = ( 1 2 π σ 2 ) n e x p { ∑ i = 1 n − 1 2 σ 2 ( y i − w x i − b ) 2 } P(Y|X)=\prod_{i=1}^n P(y_i|x_i)=(\frac{1}{\sqrt{2\pi \sigma^2}})^n exp\{\sum_{i=1}^n -\frac{1}{2\sigma^2}(y_i-wx_i-b)^2\} P(YX)=i=1nP(yixi)=(2πσ2 1)nexp{ i=1n2σ21(yiwxib)2}

根据极大似然估计法选择的估计量称为极大似然估计量。 虽然使许多指数函数的乘积最大化看起来很困难, 但是我们可以在不改变目标的前提下,通过最大化似然对数来简化。 由于历史原因,优化通常是说最小化而不是最大化。 我们可以改为最小化负对数似然 − l n P ( Y ∣ X ) -ln P(Y|X) lnP(YX)。由此可以得到的数学公式是

− l n P ( Y ∣ X ) = n 2 l n ( 2 π σ ) + ∑ i = 1 n 1 2 σ 2 ( y i − w x i − b ) 2 -ln P(Y|X)=\frac{n}{2}ln(2\pi\sigma)+\sum_{i=1}^n \frac{1}{2\sigma^2}(y_i-wx_i-b)^2 lnP(YX)=2nln(2πσ)+i=1n2σ21(yiwxib)2

现在我们只需要假设 σ \sigma σ是某个固定常数就可以忽略第一项, 因为第一项不依赖于 w w w b b b 1 σ 2 \frac{1}{\sigma^2} σ21是常数,也可以忽略。于是公式变成了

∑ i = 1 n ( y i − w x i − b ) 2 \sum_{i=1}^n (y_i-wx_i-b)^2 i=1n(yiwxib)2

w w w b b b是我们需要预测的值,有 y ^ i = w x + b \widehat{y}_i=wx+b y i=wx+b。于是,公式就变成了

∑ i = 1 n ( y i − y ^ i ) 2 \sum_{i=1}^n (y_i-\widehat{y}_i)^2 i=1n(yiy i)2

再乘上常数 1 n \frac{1}{n} n1即为均方误差。

这里只是以一次函数作为例子,但其实换成任意函数都可以,只要满足 ϵ \epsilon ϵ~ N ( 0 , σ ) N(0,\sigma) N(0,σ),即噪声项为高斯噪声,上式都是成立的。

因此,在高斯噪声的假设下,最小化均方误差等价于对线性模型的极大似然估计。

优点

各点都连续光滑,方便求导,具有较为稳定的解。均方误差也是在实际应用中较为常用的一种损失函数。高斯噪声假设在实际情况中是一个比较合理的假设,所以均方误差这样一个有着严格理论推导的损失函数效果也比较好。

缺点

不是特别的稳健,因为当函数的输入值距离中心值较远的时候,使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸。

由于平方的关系,异常值对于函数的影响非常大,所以该函数往往会更倾向于异常值。对于一些要忽略明显异常值的情况则不适用。

smooth L1 Loss

smooth L1 Loss是基于L1 Loss和L2 Loss的一个损失函数。其公式为

l o s s ( y i , y ^ i ) = { 1 2 ( y i − y ^ i ) 2 ∣ y i − y ^ i ∣ < 1 ∣ y i − y ^ i ∣ − 1 2 ∣ y i − y ^ i ∣ ≥ 1 loss(y_i,\widehat{y}_i)=\begin{cases} \frac{1}{2}(y_i-\widehat{y}_i)^2&|y_i-\widehat{y}_i|<1\\ |y_i-\widehat{y}_i|-\frac{1}{2}&|y_i-\widehat{y}_i|\geq1 \end{cases} loss(yi,y i)={ 21(yiy i)2yiy i21yiy i<1yiy i1

这个损失函数将L1 Loss和L2 Loss结合起来,从而规避了两个损失函数的短板。该函数在0点处可导,规避了L1 Loss的缺点。离群点对于该函数的影响也没有那么大,从而规避了L2 Loss的缺点。

Huber

Huber函数的公式是

L δ ( y i , y ^ i ) = { 1 2 ( y i − y ^ i ) 2 ∣ y i − y ^ i ∣ < δ δ ∣ y i − y ^ i ∣ − 1 2 δ 2 ∣ y i − y ^ i ∣ ≥ δ L_{\delta}(y_i,\widehat{y}_i)=\begin{cases} \frac{1}{2}(y_i-\widehat{y}_i)^2&|y_i-\widehat{y}_i|<\delta\\ \delta|y_i-\widehat{y}_i|-\frac{1}{2}\delta^2&|y_i-\widehat{y}_i|\geq\delta \end{cases} Lδ(yi,y i)={ 21(yiy i)2δyiy i21δ2yiy i<δyiy iδ

smooth L1 Loss其实就是Huber函数在 δ = 1 \delta=1 δ=1时的特殊情况。他具有L1 Loss,L2 Loss的优点,但是由于涉及到超参数 δ \delta δ的选取,我们还需要通过不断迭代,来确定 δ \delta δ的具体取值。它对异常值的偏好介于L1 Loss和L2 Loss之间,当你想照顾到异常值,又不想让异常值对模型训练产生太大的影响时,它可以作为一种折中的选择。

总结

我写这篇博客其实非常艰难。一边试图从理论的角度来理解这些函数,一边又发现无法完全通过理论来理解。计算机这门学科还是带有实验性质的一门学科,可能有些函数确实在一些实际情况中表现较好,虽然有很多凑的成分,但也被后人拿来用了。我在搜集资料的过程中,还发现网上对于一些名词的解释有些不同。这也可以理解,有些细节由于各种原因可能会产生细微的不同,但是总体不会相差太远。我这里选取了一些能够自圆其说的说法。其实作为一门实验学科,很难做到如教科书般严谨的阐述。在文章中,也加入了很多自己的理解,可能有些内容比较主观,也请大家批评指正!

相关推荐

  1. 神经网络损失函数)——回归任务

    2024-01-11 01:52:03       46 阅读
  2. 神经网络损失函数(下)——分类任务

    2024-01-11 01:52:03       45 阅读
  3. pytorch-10 神经网络损失函数

    2024-01-11 01:52:03       44 阅读
  4. NLP任务常用损失函数

    2024-01-11 01:52:03       54 阅读
  5. 逻辑回归损失函数

    2024-01-11 01:52:03       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-11 01:52:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-11 01:52:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-11 01:52:03       82 阅读
  4. Python语言-面向对象

    2024-01-11 01:52:03       91 阅读

热门阅读

  1. vue element plus Form 表单

    2024-01-11 01:52:03       59 阅读
  2. Redis 为什么是单线程的?

    2024-01-11 01:52:03       62 阅读
  3. 65、python - 利用手写的网络,成功预测一张图片

    2024-01-11 01:52:03       60 阅读
  4. 【LintCode】920.会议室

    2024-01-11 01:52:03       58 阅读
  5. #Uniapp:uni-app中vue2生命周期--11个

    2024-01-11 01:52:03       57 阅读
  6. LeetCode每周五题_2024/01/08~01/12

    2024-01-11 01:52:03       83 阅读
  7. 2024.1.8力扣每日一题——回旋镖的数量

    2024-01-11 01:52:03       59 阅读
  8. HDMI2.1 Redriver 信号增强 支持8K60

    2024-01-11 01:52:03       63 阅读
  9. [Microsoft Edge] 如何彻底卸载 Edge

    2024-01-11 01:52:03       50 阅读
  10. 小程序开发之uniapp项目框架搭建

    2024-01-11 01:52:03       63 阅读
  11. VUE +element ui 表格实现数据轮播滚动效果

    2024-01-11 01:52:03       48 阅读
  12. SQL Server 加密 view文本

    2024-01-11 01:52:03       54 阅读
  13. BloomFilter和BitMap的介绍与使用

    2024-01-11 01:52:03       51 阅读