本文总结分类和回归任务的常用损失函数,比如重点解析了交叉熵损失函数的由来,并给出详细计算公式和、案例分析、代码,同时也描述了
MAE
和MSE
损失函数,给出了详细的计算公式、曲线图及优缺点。
一,损失函数概述
大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 $x$ 以最小化或最大化某个函数 $f(x)$ 的任务,我们通常以最小化 $f(x)$ 指代大多数最优化问题。
在机器学习中,损失函数是代价函数的一部分,而代价函数是目标函数的一种类型。
- 损失函数(
loss function
): 用于定义单个训练样本预测值与真实值之间的误差 - 代价函数(
cost function
): 用于定义单个批次/整个训练集样本预测值与真实值之间的累计误差。 - 目标函数(
objective function
): 泛指任意可以被优化的函数。
损失函数定义:损失函数是深度学习模型训练过程中关键的一个组成部分,其通过前言的内容,我们知道深度学习算法优化的第一步首先是确定目标函数形式。
损失函数大致可分为两种:回归损失(针对连续型变量)和分类损失(针对离散型变量)。
常用的减少损失函数的优化算法是“梯度下降法”(Gradient Descent)。
二,交叉熵函数-分类损失
交叉熵损失(Cross-Entropy Loss
) 又称为对数似然损失(Log-likelihood Loss)、对数损失,二分类时还可称之为逻辑斯谛回归损失(Logistic Loss)。
2.1,交叉熵(Cross-Entropy)的由来
交叉熵损失的由来参考文档 AI-EDU: 交叉熵损失函数。
1,信息量
信息论中,信息量的表示方式:
《深度学习》(花书)中称为自信息(self-information) 。 在本文中,我们总是用 $\text{log}$ 来表示自然对数,其底数为 $e$。
$$ I(x_j) = -\log (p(x_j)) $$
- $x_j$:表示一个事件
- $p(x_j)$:表示事件 $x_j$ 发生的概率
- $I(x_j)$:信息量,$x_j$ 越不可能发生时,它一旦发生后的信息量就越大
2,熵
信息量只处理单个的输出。我们可以用熵(也称香农熵 Shannon entropy
)来对整个概率分布中的不确定性总量进行量化:
$$ H(p) = - \sum_j^n p(x_j) \log (p(x_j)) $$
则上面的问题的熵是:
$$ \begin{aligned} H(p)&=-[p(x_1) \ln p(x_1) + p(x_2) \ln p(x_2) + p(x_3) \ln p(x_3)] \\ &=0.7 \times 0.36 + 0.2 \times 1.61 + 0.1 \times 2.30 \\ &=0.804 \end{aligned} $$
3,相对熵(KL散度)
相对熵又称 KL
散度,如果对于同一个随机变量 $x$ 有两个单独的概率分布 $P(x)$ 和 $Q(x)$,则可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异,这个相当于信息论范畴的均方差。
KL散度的计算公式:
$$ D_{KL}(p||q)=\sum_{j=1}^m p(x_j) \log {p(x_j) \over q(x_j)} $$
$m$ 为事件的所有可能性(分类任务中对应类别数目)。$D$ 的值越小,表示 $q$ 分布和 $p$ 分布越接近。
4,交叉熵
把上述交叉熵公式变形:
$$ \begin{aligned} D_{KL}(p||q)&=\sum_{j=1}^m p(x_j) \log {p(x_j)} - \sum_{j=1}^m p(x_j) \log q(x_j) \\ &=- H(p(x)) + H(p,q) \end{aligned} $$
等式的前一部分恰巧就是 $p$ 的熵,等式的后一部分,就是交叉熵(机器学习中 $p$ 表示真实分布(目标分布),$q$ 表示预测分布):
$$ H(p,q) =- \sum_{j=1}^m p(x_j) \log q(x_j) $$
在机器学习中,我们需要评估标签值 $y$ 和预测值 $a$ 之间的差距熵(即两个概率分布之间的相似性),使用 KL 散度 $D_{KL}(y||a)$ 即可,但因为样本标签值的分布通常是固定的,即 $H(a)$ 不变。因此,为了计算方便,在优化过程中,只需要关注交叉熵就可以了。所以,在机器学习中一般直接用交叉熵做损失函数来评估模型。
$$ loss = \sum_{j = 1}^{m}y_{j}\text{log}(a_{j}) $$
上式是单个样本的情况,$m$ 并不是样本个数,而是分类个数。所以,对于批量样本的交叉熵损失计算公式(很重要!)是:
$$ J = -\frac{1}{n}\sum_{i=1}^n \sum_{j=1}^{m} y_{ij} \log a_{ij} $$
其中,$n$ 是样本数,$m$ 是分类数。
公式参考文章-AI-EDU: 交叉熵损失函数,但是将样本数改为 $n$,类别数改为 $m$。
有一类特殊问题,就是事件只有两种情况发生的可能,比如“是狗”和“不是狗”,称为 $0/1$ 分类或二分类。对于这类问题,由于 $m=2,y_1=1-y_2,a_1=1-a_2$,所以二分类问题的单个样本的交叉熵可以简化为:
$$ loss =-[y \log a + (1-y) \log (1-a)] $$
二分类对于批量样本的交叉熵计算公式是:
$$ J= -\frac{1}{n} \sum_{i=1}^n [y_i \log a_i + (1-y_i) \log (1-a_i)] $$
为什么交叉熵的代价函数是求均值而不是求和? Cross entropy loss is defined as the “expectation” of the probability distribution of a random variable
标签:loss,函数,交叉,sum,部件,损失,神经网络,详解,log From: https://blog.51cto.com/armcvai/6010524