机器学习损失函数

参考https://www.csuldw.com/2016/03/26/2016-03-26-loss-function/, 《统计学习方法》

损失函数

损失函数(loss function)是用来估计你的模型预测值$f(x)$与真实值Y的不一致程度,它是一个非负值函数,通常用$L(Y, f(x))$来表示,损失函数越小,模型的预测能力就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要的组成部分。

由于模型的输入输出(X, Y)是随机变量,符合联合分布P(X, Y), 所以损失函数的期望是:

$$ R_{exp}(f) = E_{p}[L(Y, f(x))] = \int_{X*Y} L(Y, f(x)) P(X,Y)$$

这是理论模型f(x)上的关于联合分布P(X,Y)的平均意义下的损失,成为风险函数或者期望损失。学习的目标就是要选择期望风险最小的模型。由于P(X, Y)是不知道的,实际上如果P(X, Y)是已知的我们就不用学习了,这个损失没有办法直接计算。所以我们采用f(x)下关于训练数据集的平均损失作为经验风险

$$ R_{emp}(f) = \frac{1}{N}\sum_{i=1}^{N}L(y_i, f(x_{i}))$$

当样本容量无限扩大的时候,经验风险$$R_{emp}$$无限趋近于期望风险$$R_{exp}$$。

但是当样本容量很小的时候,经验风险最小化的学习效果就不会很好,很可能会产生过拟合(over-fitting)的状况。这时我们采用结构风险最小化来防止过拟合。结构风险最小化等价于正则化

$$ R_{srm}(f) = \frac{1}{N}\sum_{i=1}^{N}L(y_{i}, f(x_{i})) + \lambda J(f)$$

其中$J(f)$表示的是模型的复杂度,是定义在假设空间F上的泛函。复杂度表示了对复杂模型的惩罚。结构风险小需要经验风险与模型复杂度同时小。结构风险小的模型往往对训练数据以及未知的测试数据都有较好的预测。

1.log对数损失函数(logistic regression)

首先,logistic regression的损失函数不是平方损失。
在logistic regression中,它假设样本服从(0-1分布),然后求得满足该分布的似然函数,接着去对数求极值。logistic regression只是把极大化当做一种思想,从损失函数的视角来看,他就成了log损失函数。

  1. 将特征线性求和,通过逻辑函数$g(z)$映射到0-1区间,作为假设函数来进行预测。
    $$g(z) = \frac{1}{1+e^{-z}}$$
    $$h_{\theta}(x) = g(\theta^{T}x) = \frac{1}{1+e^{-\theta^{T}x}}$$
  2. 假设样本服从0-1分布。
    $$P(y=1|x,\theta) = h_\theta(x)$$
    $$P(y=1|x,\theta) = 1-h_\theta(x)$$
    也可以写成如下形式:
    $$P(y|x,\theta) = (h_\theta(x))^y(1-h_\theta(x))^{1-y}$$
  3. 对于训练数据集,假设是m个独立样本。那么损失函数定义为:
    $$L(\theta) = P(Y|X,\theta) = \prod_{i=1}^{m}P(y_i|x_i,\theta) = \prod_{i=1}^{m} (h_\theta(x))^y(1-h_\theta(x))^{1-y} $$

这才是原始的logistic regression的损失函数。要对这个损失函数求一阶导数很困难(连乘)。所以我们对该损失函数取log,并没有改变函数的单调性,但是转化成了加法,容易求导。于是:

$$l(\theta) = log L(\theta) = \sum_{i=1}^{m}y^{(i)}log(h_\theta(x^{(i)})) + (1-y^{(i)})log(1-h_\theta(x^{(i)}))$$

log损失函数的标准形式:
$$L(Y, P(Y|X)) = -logP(Y|X)$$
该损失函数表示,利用已知的样本分布,找到最有可能导致这种分布的参数值,或者说什么样的参数才能使我们观测到目前这组数据的概率最大。本质上是最大似然估计。

我们可以看出当P(Y|X)趋近于0的时候,损失函数趋近于无穷大,当P(Y|X)趋近于1的时候,损失函数趋近于0。

2. 平方损失函数(最小二乘法,Ordinary Least Squares)

最小二乘法是线性回归的一种,最小二乘把线性回归转换成了一个凸优化问题。在线性回归中,他假设样本和噪声都服从高斯分布,最后通过极大似然估计可以推出最小二乘式。最小二乘的基本原则是:最优化拟合直线应该是是各点到回归直线的距离和最小的直线,即平方和最小。最小二乘法是基于距离的,一般我们用的最多的是欧几里得距离。使用欧式距离作为误差度量的原因如下:

  • 简单,计算方便
  • 欧式距离是一种很好的相似性度量标准
  • 在不同的表示域变换后特征性质不变

标准形式为:
$$L(Y, f(x)) = \sum_{i=1}^{m}(y^{(i)}-f(x^{(i)}))^2 $$

3. 指数损失函数(Adaboost)

Adaboost是一种叠加模型,基本思想是:获得一个弱分类器比较容易,而每个弱分类器能够较好的分类一部分数据集,那么在每一轮改变训练数据的权值和概率分布,将生成的若干个弱分类器合并成一个强分类器。它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。
在Adaboost中,经过m次迭代后,可以得到:
$$f_m(x) = f_{m-1}(x) + \alpha_mG_m(x)$$
Adaboost每次迭代的目的是为了找到最小化函数距离的参数$\alpha$和分类器$G_m$

$$\mathop{\arg\min}{\alpha,G_m} = \sum{i=1}^{N}exp[-y^{(i)}(f_{m-1}(x^{(i)}) + \alpha G(x^{(i)}))]$$

为什么要采用exp指数形式?回到损失函数定义,它是一个非负值函数。

所以指数损失函数(exp-loss)标准形式为:
$$L(y, f(x)) = exp[-yf(x)]$$

4. Hinge损失函数(SVM)

在机器学习算法中,hinge损失函数和SVM息息相关。在SVM中,我们要找到支持向量,支持向量为到分类直线最近的点的距离向量。
在分类空间中,直线的法向量为$\omega$,截距为b,那么点到直线的距离为$(\omega\cdot x^{(i)} + b)$。我们要找到一条直线距离两个分类空间距离最大。

函数间隔 $\widehat{\gamma}_i = y_i(\omega \cdot x_i + b)$
归一化法向量$||\omega|| = 1$,得到几何间隔 $\gamma_i = \frac{\omega}{||\omega||}\cdot x_i + \frac{b}{||\omega||}$

所以优化问题变为了:(硬间隔)
$$
\begin{split}
&\mathop{\max}_{\omega, b} \gamma\
&s.t. y_i (\frac{\omega}{||\omega||}\cdot x_i + \frac{b}{||\omega||}) \geqslant \gamma
\end{split}
$$

转换成函数间隔就变为了:
$$
\begin{split}
&\mathop{\max}_{\omega, b} \frac{\widehat{\gamma}}{||\omega||}\
&s.t. y_i (\omega \cdot x_i +b) \geqslant \widehat{\gamma}
\end{split}
$$

这里函数间隔并不影响最终优化问题的解,它既不对优化问题产生影响,也不对约束产生影响。我们可以把这个函数间隔取为1.也就是将最近的分类点到直线的距离取为1.

则SVM硬间隔问题就转化为了:
$$
\begin{split}
&\mathop{\min}_{\omega, b} \frac{1}{2}||\omega||^2\
&s.t. y_i (\omega \cdot x_i +b) - 1 \geqslant 0
\end{split}
$$

硬间隔对于现行不可分训练数据是不使用的,因为无法使不等式约束始终成立。所以我们修改了函数间隔的约束条件,增加一个松弛变量。软间隔问题表示为:
$$
\begin{split}
\mathop{\min}{\omega, b}\ & \frac{1}{2}||\omega||^2 + C\sum{i=1}^{N}\xi_i \
s.t.\ & y_i (\omega \cdot x_i +b) \geqslant 1-\xi_i, i = 1,2,…N \
& \xi_i \geqslant 0
\end{split}
$$

上述软间隔优化问题从损失函数的角度来看就是最小化hinge-loss:
$$\mathop{\min}{\omega, b}\sum{i=1}^{N}[1-y_i(\omega\cdot x_i+b)]_+ + \lambda||\omega||^2$$

hinge-loss的基本形式就是:
$$L(y(\omega\cdot x+b))=[1-y(\omega\cdot x + b)]+$$
其中,
$$[z]
+ = \begin{cases}
z,& z>0\
0,& z\leqslant 0 \
\end{cases}$$

我的理解就是,当函数间隔大于1的时候,这是线性可分区域,这部分数据的惩罚为0.当函数间隔小于1的时候,这部分是软间隔,要加入惩罚。
值得注意的是$[-y(\omega\cdot x + b)]_+$是感知机的损失函数,也就是当函数距离为正,惩罚为0,当函数距离为负的时候,加入惩罚。在SVM中,加入支持向量的的归一化长度1,是表示不仅要分类正确,还要在可信度足够高的时候惩罚才为0。

核函数补充:SVM对偶问题
我们可以从原始间隔优化问题(包含约束条件的问题)加入拉格朗日函数呈现优化问题的对偶问题。
原始软间隔问题为:
$$
\begin{split}
\mathop{\min}{\omega, b}\ & \frac{1}{2}||\omega||^2 + C\sum{i=1}^{N}\xi_i \
s.t.\ & y_i (\omega \cdot x_i +b) \geqslant 1-\xi_i, i = 1,2,…N \
& \xi_i \geqslant 0
\end{split}
$$

转换为拉格朗日函数为:
$$
L(\omega,b,\xi,\alpha,\mu) = \frac{1}{2}||\omega||^2 + C\sum_{i=1}^{N}\xi_i - \sum_{i=1}^{N}\alpha_i(y_i(\omega\cdot x_i+b)-1+\xi_i) - \sum_{i=1}^{N}\mu_i\xi_i
$$
其中,$\alpha_i \geqslant 0, \mu_i \geqslant 0$

对偶问题就是拉格朗日函数的极大极小问题。对拉格朗日函数求一阶导数,得到
$$
\mathop{\min}{\omega, b, \xi}\ L(\omega, b, \xi, \alpha, \mu) = -\frac{1}{2} \sum{i=1}^{N}\sum_{j=1}^{N}\alpha_i \alpha_j y_i y_j (x_i \cdot x_j) + \sum_{i=1}^{N}\alpha_i
$$

再对$\alpha$求极大,得到对偶问题。
$$
\begin{align}
\mathop{\max}{\alpha}\ & -\frac{1}{2} \sum{i=1}^{N}\sum_{j=1}^{N}\alpha_i \alpha_j y_i y_j (x_i \cdot x_j) + \sum_{i=1}^{N}\alpha_i \
s.t.\ & \sum_{i=1}^{N} \alpha_i y_i = 0 \
& 0 \leqslant \alpha_i \leqslant C, i = 1,2,…,N\
\end{align}
$$

什么是核函数?
设$\mathcal{X}$是输入空间,$\mathcal{H}$为特征空间(希尔伯特空间,完备的内积空间)。如果存在一个从$\mathcal{X}$到H的映射:
$$\phi(x): \mathcal{X} \rightarrow \mathcal{H}$$
是的对于所有的$x, z \in \mathcal{X}$, 函数$K(x, z)$满足条件(内积运算)
$$K(x, z) = \phi(x) \cdot \phi(z)$$
则称$K(x, z)$为核函数,$\phi(x)$为映射函数。

核技巧的想法是,在学习和预测中只定义核函数,而不现实地定义映射函数。通常直接计算核函数比较容易。这样上述对偶问题的优化函数就变成了特征空间中的最小化问题:
$$
\mathop{\min}{\alpha} W(\alpha) = \frac{1}{2} \sum{i=1}^{N}\sum_{j=1}^{N}\alpha_i \alpha_j y_i y_j K(x_i, x_j) - \sum_{i=1}^{N}\alpha_i
$$

什么是希尔伯特空间?
$欧式空间 \rightarrow 线性空间 + 定义内积 \Rightarrow 内积空间$

  • 欧式空间是一个特别的度量空间。
  • 度量空间是一个定义了距离函数的集合,该距离函数定义集合内所有元素之间的距离。该距离函数被称为集合的度量。欧式空间则是以欧几里得距离定义的度量空间。
  • 线性空间(或向量空间),一个对加法和数乘封闭的集合。

$内积空间 + 完备性 \Rightarrow 希尔伯特空间$

  • 在欧几里得空间(本身就是线性空间)上定义内积。
    $$
    \langle x, y \rangle = \sum_{k=1}^{n}\overline{x_k} y_k
    $$
  • 序列空间,假设B是任意一个任意维数的集合,可以定义其上序列空间
    $$\ell^2(B) = \left{x: B \to \mathbb{C}\ \mid \sum_{b \in B}|x(b)|^2 < \infty \right}$$
    在此空间下定义如下内积:
    $$
    \langle x,y \rangle = \sum_{b \in B} \overline{x(b)} y(b)
    $$
    则构成一个希尔伯特空间。完备性是什么意思,就是该空间内所有的柯西序列等价于收敛序列。在完备空间中,所有的柯西数列都有极限,且极限在这个空间里。完备性保证了微积分中的大部分概念都在该空间中成立。

经典的损失函数对比

![损失函数](/images/2019-10-10-机器学习损失函数/loss function.png)
不同的损失函数其实都在近似0-1损失函数,也就是图中的黑线。当函数距离为负的时候就增大panelty,为正的时候减小panelty。这就是损失函数在做的事情。

5. 交叉熵损失函数 (经常用在神经网络中)

熵 entropy: 假设随机变量X的概率分布是P(X),则其熵为:
$$
H(P) = -\sum_{x}P(x)logP(x) = \sum_{x}P(x)log\frac{1}{P(x)}
$$
熵满足下列不等式
$$
0 \leqslant H(P) \leqslant log|X|
$$
其中,|X|是X的取值个数,当且仅当X的分布式均匀分布时右边的等号成立,这就是说,当X服从均匀分布的时候,熵最大。信息量定义为
$$
I(x_0) = -log(p(x_0))
$$
直觉上来讲,越不可能发生的事情发生了,信息量越大,越可能的事情发生了,我们获得的信息量越小。熵就是所有信息量的期望。

相对熵:(KL散度) 设p(x), q(x)是X中取值的两个概率分布,则p对q的相对熵(离散事件)如下:
$$
D(p||q) = \sum_{x}p(x)log\frac{p(x)}{q(x)} = \sum_{x}p(x)log{p(x)} - \sum_{x}p(x)log{q(x)} = H_{p}(q) - H(p)
$$
KL散度是两个概率分布P和Q差别的非对称性度量。KL散度是用来度量使用基于Q的分布来编码服从P的分布的样本所需的额外的平均比特数。一定程度上,相对熵可以度量两个随机变量的距离。并且有$D(p||q)\neq D(q||p)$。需要注意的是 $D(p||q)$一定是大于等于0的。
从上述公式中我们可以看出:

  • 如果p(x) = q(x),则两个事件分布完全相同,那么KL散度为0
  • 观察导出式发现,KL散度由p(x)自己的熵与q(x)信息量在p(x)上的期望共同决定。

互信息:两个随机变量X,Y的互信息定义为X,Y的联合分布和各自独立分布乘积的相对熵,用I(X,Y)表示:
$$
I(X,Y) = \sum_{x, y}p(x, y)log\frac{p(x,y)}{p(x)p(y)} = D(p(x,y) || p(x)p(y))
$$

接下来计算
$$
\begin{align}
& H(Y) - I(X,Y) \
& = -\sum_{y}p(y)log{p(y)} - \sum_{x,y}p(x,y)log{\frac{p(x,y)}{p(x)p(y)}} \
& = -\sum_{y}(\sum_{x}p(x,y))log{p(y)} - \sum_{x,y}p(x,y)log{\frac{p(x,y)}{p(x)p(y)}} \
& = -\sum_{x,y} p(x,y)log{\frac{p(x,y)}{p(x)}} \
& = -\sum_{x,y} p(x,y)log{p(y|x)} \
& = H(Y|X)
\end{align}
$$

交叉熵: 交叉熵与KL散度的公式非常接近。假设有两个分布p,q, 则它们在给定样本集上的交叉熵定义如下:
$$
CEH(p,q) = E_p[-log{q}] = -\sum_{x \in \mathcal{X}} p(x)log{q(x)} = H(p) + D_{KL}(p||q)
$$
可以看出交叉熵与相对熵仅相差了p本身的熵H(p)。当p已知的时候,可以把H(p)看做一个常数,此时交叉熵与KL散度在行为上是等价的,都反应了分布p,q的相似程度。交叉熵越小,说明两个概率分布越相近。

特别的,在logistic regression中
p:真实样本分布,服从参数为p的0-1分布,即$X \sim B(1, p)$
q:待估计的模型,服从参数为q的0-1分布,即$X \sim B(1, q)$
单个样本两者的交叉熵为:
$$
\begin{align}
CEH(p,q) & = -\sum_{x \in \mathcal{X}} p(x) log{q(x)} \
& = -[P_p(x=1)log{P_q(x=1)} + P_p(x=0)log{P_q(x=0)}] \
& = -[plogq + (1-p)log(1-q)] \
& = -[ylogh_\theta(x) + (1-y)log(1-h_\theta(x))]
\end{align}
$$
对所有的训练样本取均值就可以得出与最大似然估计取log方法求出的结果一致。

在神经网络中处理多分类问题:

  • 神经网络的原始输出(也就是结点的直接输出结果)不是一个概率值,实质上只是输入的数值做了复杂的加权和非线性处理之后的值,那么如何将这个输出变为概率分布,一般会采用softmax和sigmoid做激活处理。
  • 对于多分类问题,采用softmax函数,原始输出为y1, y2, …yn. 经过softmax处理之后输出为:

$$
softmax(y_i) = \frac{e^{y_i}}{\sum_{i=1}^{n}e^{y_i}}
$$

经过softmax的交叉熵也被成为softmax损失函数,它的表达式为:
$$
H(P,T) = -\sum_{1}^{C}p log(T)
$$
其中P为样本期望输出,它是一个one-hot编码形式,T为样本的实际输出,其中T为$[softmax(y1), softmax(y2)…]$

  • 对于单节点二分类问题,采用sigmoid函数