打包理解损失函数—硬核公式推导

396 阅读8分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

损失函数

在教科书上我们可以看到损失函数的简单定义:已知的标准与自动拟合的标准相差的程度的定量表达,用于比较两个模型差距有多少

损失函数在机器学习中的每一种算法中都很重要,因为训练模型的过程就是优化损失函数的过程,在学习相关算法的过程中,对损失函数的理解也在不断加深

(从结论上讲,损失函数与代价函数是同一种东西,目标函数是一个与它们相关但是更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数)

一般来讲,损失函数具有以下性质

  • 损失函数是算法参数θ的函数
  • 最好是对参数θ可微分的函数

一般来说,损失函数越小,就代表模型对样本拟合的越好,但是,并不是损失函数越小越好

这个时候还有一个概念叫风险函数(risk function)。设为f(x),风险函数是损失函数的期望。

f(x)关于训练集的平均损失就称为经验风险,降低经验风险是我们的目标之一。但是经验风险过低的话就会造成模型过拟合。过拟合的数学描述即是模型函数过于复杂了,于是,我们的另一个目标就是降低模型复杂程度,我们定义一个函数J(x)来描述它,称这个函数为结构风险。

两种风险函数组合,就成为了我们最终要优化的目标函数

根据优化函数不同,可将损失函数分为四种思路,分别是经验风险最小化、结构风险最小化、最大化似然估计、最大化后验概率

模型 [公式] 关于训练数据集的平均损失称为经验风险。经验风险最小化(Empirical Risk Minimization,ERM)认为经验风险最小的模型是最优的模型,公式如下:

minfb1Ni=1NL(yi,f(xi)) \min_{f \in b} \frac{1}{N} \sum_{i=1}^{N} L\left(y_{i}, f\left(x_{i}\right)\right)

结构风险在经验风险上加上表示模型复杂度的正则化项或罚项。结构风险最小化(Structural Risk Minimization,SRM)是为了防止过拟合而提出来的, [公式] 是模型的复杂度,公式如下:

minfb1Ni=1NL(yi,f(xi))+λJ(f)\min _{f \in b} \frac{1}{N} \sum_{i=1}^{N} L\left(y_{i}, f\left(x_{i}\right)\right)+\lambda J(f)

最大化似然估计(Maximum Likelihood Estimation,MLE)是一种参数估计方法,利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者说什么样的参数才能使我们观测到目前这组数据的概率最大

最大后验估计(Maximum A Posteriori estimation, MAP)也是一种参数估计方法,与MLE类似。最大区别是,MAP在其中融入了要估计量的先验分布,故最大后验估计可以看做规则化的最大似然估计

两种关系:

  • 当模型是条件概率分布、损失函数是对数损失函数时,经验风险最小化等价于最大似然估计
  • 当模型是条件概率分布、损失函数是对数损失函数、模型复杂度有模型的先验概率表示时,结构风险最小化等价于最大后验概率估计

基础损失函数

最小二乘法: 直觉上,只要能够表示两个模型的输出相差程度的大小就能够满足我们的要求,于是有

loss=0allyiyloss=\sum_{0}^{all}|y_{i}-y|

但是,绝对值并非任何情况下都可导,于是,可以用平方去替代它

loss=0all(yiy)2loss=\sum_{0}^{all}(y_{i}-y)^2

但是最小二乘法在反向求梯度的时候非常麻烦,因此一般不采用最小二乘法作为损失函数

极大似然估计:

似然值:真实的情况已经发生,我们假设对应现实的有多种概率模型,通过这些概率模型算出的结果就叫似然值,有几个模型就有几个似然值。从数学层面可以看做是以下公式

P(C1,C2,C3,...,Cnθ)=1nP(Ciθ)P(C_{1},C_{2},C_{3},...,C_{n}|\theta)=\prod_{1}^{n}P(C_{i}|\theta)

对应在神经网络中,每一个神经网络都有独特的权重与偏重,可以看做是一种理想模型,它对于某种输入有相应似然值结果。从数学层面可以看做是以下公式。

P(x1,x2,x3,...,xnW,b)=1nP(xiW,b)P(x_{1},x_{2},x_{3},...,x_{n}|W,b)=\prod_{1}^{n}P(x_{i}|W,b)

极大似然估计:就是对某个特定W,b的神经网络的似然值求最大,通过极大似然值大小来表示模型与标准相差的程度大小,因此,肯定不能只看一个神经网络的输出,因此有

1nP(xiW,b)=1nP(xiyi)\prod_{1}^{n}P(x_{i}|W,b)=\prod_{1}^{n}P(x_{i}|y_{i})

伯努利分布:是一种离散分布,又称为 “0-1 分布” 或 “两点分布”。例如抛硬币的正面或反面,物品有缺陷或没缺陷,病人康复或未康复,此类满足「只有两种可能,试验结果相互独立且对立」的随机变量通常称为伯努利随机变量

x,y就分别是一种伯努利随机变量,概率分布方程为

f(x)=px(1p)1xf(x)=p^x*(1-p)^{1-x}

由此,我们表示出了神经网络模型似然值的可迭代式

1nP(xiyi)=1nyixi(1yi)1xi\prod_{1}^{n}P(x_{i}|y_{i})=\prod_{1}^{n}y_{i}^{x_{i}}*(1-y_{i})^{1-x_{i}}

因为对比连乘,连加更加便于计算,而log运算具有单调不变性,因此我们对似然值做一次log运算

log(1nyixi(1yi)1xi)=1nlog(yixi(1yi)1xi)=1n(xilog(yi)+(1xi)log(1yi))极大似然值=max(1n(xilog(yi)+(1xi)log(1yi)))log(\prod_{1}^{n}y_{i}^{x_{i}}*(1-y_{i})^{1-x_{i}})=\sum_{1}^{n}log(y_{i}^{x_{i}}*(1-y_{i})^{1-x_{i}})=\sum_{1}^{n}(x_{i}*log(y_{i})+(1-x_{i})*log(1-y_{i}))\\极大似然值=max(\sum_{1}^{n}(x_{i}*log(y_{i})+(1-x_{i})*log(1-y_{i})))

至此,我们将似然值这个概率概念设计成可以用于表示模型相差程度的函数,即把它变成为损失函数了

交叉熵损失:

先将模型换成熵,再用

信息量:我们设定一个函数,可以用信息量这个抽象概念来定量,即

f(x):=信息量f(x):=信息量

接下来的衍生概念都要使得这个定义能够在体系中自洽

接下来通过现实例子来尝试能不能推出f(x)的自洽的数学表达式,抽象的讲,对于两件能够连续发生的事情,(信息量的概念只能衡量这种例子吗?)例如小明在桂电踢球,踢到决赛的概率是a,踢到冠军的概率是b,而直接踢到冠军的概率是a*b,因为两件事的信息量是一样的,那么需要有

f(ab)=f(a)+f(b)f(a*b)=f(a)+f(b)

这是一个非常明显的log运算,即

f(x):=lognxf(x):=log_{n}x

明显的,x这个概率越低,信息量越大。而n是一种量纲,事件的信息量数值大小随n的变化而变化,但是实际含义不变,故我们把n定义为2,方便思考,即实际上:

f(x)=log2xf(x)=log_{2}x

熵:衡量一个概率模型(系统)的不确定程度(直接看出结果的可能性),越大概率的事件对系统不确定程度的贡献越小,由此,可以把熵定义为

H(P):=E期望(Pf)=i=1mpif(pi)=i=1mpi(log2pi)=i=1mpilog2piH_{熵}(P):=E_{期望}(P_{f})=\sum_{i=1}^{m} p_{i} \cdot f\left(p_{i}\right)=\sum_{i=1}^{m} p_{i}\left(-\log _{2} p_{i}\right)=-\sum_{i=1}^{m} p_{i} \cdot \log _{2} p_{i}

至此,我们把熵这个概念量化了。而我们的目标是将概率模型和人脑内模型做比较,是否可以直接比较两个模型的熵呢。答案是不行的,因为人脑模型熵无法计算。因此,我们需要一种能够不直接求熵而能够定量比较两个模型的熵差距的方法

KL散度:Kullback-Leibler Divergence,即 K-L散度 ,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵 KL散度能帮助我们度量使用一个分布来近似另一个分布时所损失的信息量,具体定义是:

DKL(PQ):=i=1mpi(fQ(qi)fp(pi))=i=1mpi((log2qi)(log2pi))=i=1mpi(log2qi)i=1mpi(log2pi)\begin{array}{l} \boldsymbol{D}_{K L}(\boldsymbol{P} \| \boldsymbol{Q}) \\ :=\sum_{i=1}^{m} p_{i} \cdot\left(f_{Q}\left(\boldsymbol{q}_{i}\right)-f_{p}\left(p_{i}\right)\right) \\ =\sum_{i=1}^{m}{p}_{i} \cdot\left(\left(-\log _{2} \boldsymbol{q}_{i}\right)-\left(-\log _{2} p_{i}\right)\right) \\ =\sum_{i=1}^{m}{p}_{i} \cdot\left(-\log _{2} \boldsymbol{q}_{i}\right)-\sum_{i=1}^{m} p_{i} \cdot\left(-\log _{2} p_{i}\right) \end{array}

这一段定义的文字描述是,以P为基准,P的信息量是确定但未知的,求Q与P之间所有事件的熵的差值的在P系统内的期望,这里比较绕,但是KL散度就是这个概念,由此可以得到Q去拟合P的话会损失多少信息量。而通过吉布斯不等式我们可以得知,KL散度一直是大于0的

交叉熵:从上面我们可以看出,交叉熵就是KL散度左边的部分。而将这个数学中交叉熵的定义应用于概率模型中需要一些变换,首先,m是在P模型中所有事件的总数,Pi可以直接用输入的训练集标签,值为0、1。而Qi需要考虑一下,因为Qi的值是一个浮点数值,代表对输入的置信度的大小,它与训练集标签是不对应的,因此我们需要把Qi进行展开,分为训练集标签是1和训练集标签是0的情况,具体公式为:

H(P,Q)=i=1mpi(log2qi)=i=1nxi(log2qi)=i=1n(xilog2yi+(1xi)log2(1yi))\begin{array}{l} \boldsymbol{H}(\boldsymbol{P}, \boldsymbol{Q}) \\ =\sum_{i=1}^{m} p_{i} \cdot\left(-\log _{2} q_{i}\right) \\ =\sum_{i=1}^{n} x_{i} \cdot\left(-\log _{2} q_{i}\right) \\ =-\sum_{i=1}^{n}\left(x_{i} \cdot \log _{2} y_{i}+\left(1-x_{i}\right) \cdot \log _{2}\left(1-y_{i}\right)\right) \end{array}

至此,H成为了可以定量描述P,Q两个模型的差异的表达式

在这里,交叉熵的函数形式与极大似然估计的函数形式非常像,但是极大似然估计的函数形式是通过数学直觉进行推导的,本身没有定义支撑,而交叉熵损失函数是通过定义一步步推导得到,具有量纲,更加严谨