原文链接:https://www.yuque.com/yahei/hey-yahei/target_function
目标函数(target function)、损失函数(loss function)、代价函数(cost function)是一个东西~
目标函数是一个用来衡量模型预测结果与实际结果(通常称为Ground Truth)之间差距的一个函数,在深度学习中,训练模型通常就是指以最小化该差距为目标进行反向传播和更新参数。
参考:
分类任务
记某分类任务共 N N N 个训练样本,
网络最后的分类层第i个样本的输入特征为 x i x_i xi,
真实标记为 y i ∈ 1 , 2 , . . . , C y_i \in {1,2,...,C} yi∈1,2,...,C (C为类别总数),
网络最终输出预测结果(指示每种分类的可能性) h = ( h 1 , h 2 , . . . , h C ) T h = (h_1, h_2, ..., h_C)^T h=(h1,h2,...,hC)T
sigmoid和softmax
两者都是分类任务常用的归一化函数,用来归一化模型最后输出的特征向量,得到每个分类的预测概率。
sigmoid函数
也称为logistic函数。
sigmoid函数除了输出预测概率之外,也可以用来作为激活函数,在relu出现之前就是常见的激活函数,此外最近比较流行的swish激活函数也是基于sigmoid的;同时,由于sigmoid可以方便地得到二分类的预测概率,通常也用来进行某些“打分”,比如SE模块就用sigmoid函数来为特征图的各个通道打分,进而作为权重来实现注意力机制。
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1
- 输出范围为(0, 1),恰好可以作为概率输出
- σ ( 0 ) = 0.5 \sigma(0)=0.5 σ(0)=0.5,当z增大时 σ ( z ) \sigma(z) σ(z)迅速增大并收敛于1,相反,当z减小时 σ ( z ) \sigma(z) σ(z)迅速减小并收敛于0
- 不仅可导,而且导数很容易计算
$$\begin{aligned}
\sigma’(z)
&= \frac{e{-z}}{(1+e{-z})^2} \
&= \frac{1}{1+e{-z}}(1-\frac{1}{1+e{-z}}) \
&= \sigma(z) \cdot (1-\sigma(z))
\end{aligned}$$
- 但sigmoid是典型的饱和函数,当 ∣ z ∣ |z| ∣z∣比较大时, σ ( z ) → 0 \sigma(z) \rightarrow 0 σ(z)→0,这是不利于训练的,详细讨论可以参考《梯度消失与梯度爆炸 - ReLU | Hey~YaHei!》,此处就不再赘述
softmax函数
参考:
s o f t m a x ( h i ) = e h i ∑ j = 1 C e h j softmax(h_i) = \frac{e^{h_i}}{\sum_{j=1}^C e^{h_j}} softmax(hi)=∑j=1Cehjehi
- 显然 ∑ i = 1 C s o f t m a x ( h i ) = 1 \sum_{i=1}^{C} softmax(h_i) = 1 i=1∑Csoftmax(hi)=1,可以作为每个分类的预测概率
- softmax可以看作是sigmoid的多分类版本
当 C = 2 C=2 C=2时,跟sigmoid其实是等价的,只不过同时输出两个概率罢了 - 溢出问题**
- 什么是溢出?
计算机数值的表示范围是有限的,如果超出范围则称为“溢出”,大于最大值称为“上溢出”,小于最小值称为“下溢出”——对于有符号数,下溢出往往是被舍入为0; - softmax溢出
为简单起见,假设 h 0 = h 1 = . . . = h C = c h_0=h_1=...=h_C=c h0=h1=...=hC=c
按照softmax的数学定义,应该有 s o f t m a x ( h 0 ) = s o f t m a x ( h 1 ) = . . . = s o f t m a x ( h C ) = 1 C softmax(h_0)=softmax(h_1)=...=softmax(h_C)=\frac{1}{C} softmax(h0)=softmax(h1)=...=softmax(hC)=C1
但当 ∣ c ∣ |c| ∣c∣非常大时,存在一些极端情况:- 如果 c > 0 c>0 c>0, e c e^c ec将非常大,甚至超出浮点数值的表示范围
- 如果 c < 0 c<0 c<0, e c e^c ec将非常小,以至于因为下溢出出现 e c = 0 e^c=0 ec=0致使softmax分母为0
- 如何解决溢出
- 什么是溢出?
s o f t m a x ( h i ) = e h i − M ∑ j = 1 C e h j − M softmax(h_i) = \frac{e^{h_i - M}}{\sum^C_{j=1} e^{h_j - M}} softmax(hi)=∑j=1Cehj−Mehi−M
其中 M = m a x ( h 0 , h 1 , . . . , h C ) M=max(h_0,h_1, ..., h_C) M=max(h0,h1,...,hC)
1. 显然$$h_j-M \leq 0$$,不可能出现上溢出
1. 下溢出不可避免,但分母中至少有一项$$e^{h_j - M} = e^0 = 1$$,避免了分母为0的情况
- 为什么要以e为底?
事实上用其他底数也可以;
但以e为底的指数导数比较简洁, ( e z ) ′ = e z (e^z)'=e^z (ez)′=ez,所以sigmoid和softmax就选用了e作为底数
交叉熵(cross entropy)
目前分类任务最常用的损失函数;
L c e = − 1 N ∑ i y i l o g ( h i ) L_{ce} = - \frac{1}{N} \sum_i y_i log (h_i) Lce=−N1i∑yilog(h