**函数和损失函数

深度学习中常用的**函数和损失函数

对于**函数跟损失函数做一下记录,后面再看时也方便,可能有些图片搬运的各位大佬的,还请见谅。

**函数

**函数有很多,主要记录常用的和比较经典的一些,例如sigmoid、tanh、RELU及其变种。
首先说一下**函数的作用,一般**函数作用于神经网络中卷积层的后面,用来引入非线性因素,通过**函数这种非线性函数来加强神经网络的拟合能力(不再单纯是线性函数了)。

  1. Sigmoid函数
    sigmoid函数是早期神经网络非常常见的一种**函数,其数学表达式如下:
    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过 Euler integral

f(z)=11+ez f(z)=\dfrac{1}{1+e^{-z}}
函数图像如下:
**函数和损失函数
sigmoid函数的作用如上图所示,把数据变换成0~1之间的数,过于大的数为1,过于小的数位0 。这个函数在早期的深度学习中使用较多,现在很少使用。原因是sigmoid函数容易在反向传播时造成梯度消失或者爆炸,从他的导数图像就可以看到:
**函数和损失函数
最大值位0.25,我们在回传时,每经过一层梯度变为以前的0.25倍,很容易造成梯度消失。而且Sigmoid 的 output 不是0均值(即zero-centered),这样会使得下一层的输入会是非零均值的,在反向传播时,梯度就会保持一个方向,参数更新就会缓慢。
2. tanh函数
tanh函数的数学表达式如下:
tanh(x)=exexex+ex tanh(x)= \dfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
函数图像以及导数图像如下:
**函数和损失函数
从图像可以看到,tanh函数解决了sigmoid函数非零均值的缺点,但是梯度消失依旧存在。
3. Relu函数
Relu函数数学表达式:
y=max(0,x) y=max(0,x)
从表达式可以看到,Relu函数十分简单相对于上面两个函数中包含指数操作,Relu函数首先在运算量上就由较大的优势。
Relu函数图像及导数函数图像:
**函数和损失函数
从图像可以看到,Relu函数在正半轴就是输入本身,负半轴直接为零,这极大的减小了运算量,提高了收敛的速度,并且在正区间内的导数值解决了反向传播时的梯度消失问题。Relu函数最近几年比较常用,我们如果一般使用可以选择。
但是Relu函数依然存在问题,输出非零均值的问题依然存在,并且负半轴直接为零,导致在反传时,负梯度的神经元不能工作,造成神经元不能**的问题,也叫做 Dead Relu problem.
4. Leaky Relu函数
Leaky Relu 函数主要是为了解决上面提到的Dead Relu problem,将Relu函数中负半轴为零进行修改,数学表示如下:
y={x,(x>0)ax,(x<0) y=\begin{cases}x,&(x>0)\\ax,&(x<0) \end{cases}
其中a=0.01,函数图像图下所示:
**函数和损失函数
这样在负半轴,函数值不为零,就不会出现上面讨论的问题了。虽然理论上Leaky Relu是要比Relu要好,但是我们实验发现,不能完全保证Leaky Relu函数绝对要好。
5. PRelu函数
PRelu函数的提出,是为了改进Leaky Relu函数,我们将其中的a的值不再固定为0.01,而是让其根据数据进行学习,这样的**函数可以用在反向传播中与其他层进行优化。
6. RRelu函数
RRelu函数也是一种改进,在训练的时候a保持在给定范围内取样的随机变量,而在之后测试中就变成了固定值。PReLU在一定程度上能起到正则效果。数学表达式如下:
f(x)={xx>0axx<0 f(x)=\begin{cases} x &x>0\\ax &x<0 \end{cases}

损失函数

对于损失函数来说有很多种,这里简单介绍几种在分类回归问题上常见的几种,方差损失,绝对值损失,smooth L1损失,二分类交叉熵函数,Logistic loss。

  1. 回归损失函数
    方差损失,绝对值损失以及smooth L1损失用求解回归问题,数学表达式如下:
    L2(x)=(yf(x))2 L_2(x)=(y-f(x))^2
    L1(x)=yf(x) L_1(x)=|y-f(x)|

smoothL1(x)={0.5x2x<1x0.5others smoothL1(x)=\begin{cases} 0.5x^2 &|x|<1\\|x|-0.5 &others \end{cases}
其中x为输入,f(x)为标签,y为输出,将其求导可以看到:
dL2(x)dx=2x \dfrac{dL_2(x)}{dx}=2x
dL1(x)dx={1x>01others \dfrac{dL_1(x)}{dx}=\begin{cases} 1 &x>0\\-1 &others \end{cases}
dsmoothL1dx={xx<1±1others \dfrac{dsmooth_L1}{dx}=\begin{cases} x &|x|<1\\ \pm1 &others\end{cases}
对于L2 loss来说,随着x的增大,L2损失对于x的导数不断增大。当预测框与真实框的差异过大时,损失函数对于预测值的梯度过大,使得训练不稳定,而且预测值与观测值的差异很大时,又容易发生梯度爆炸。
对于L1 loss ,其对于x的导数为常数,在训练时发现,当预测框与真实框差异过小时,导数不变,容易导致损失函数在某一范围波动,影响模型收敛。

L1 loss L2 loss
鲁棒性差 鲁棒性强
稳定解 不稳定解

对于鲁棒性来说最小绝对值差的效果好是因为与平方差相比,他能处理数据中的异常值。因为L2 loss中的平方会把误差变大(如果误差大于1)。
对于稳定性来说,绝对值误差在数据集有些许变化时,会产生较大的反应,而方差中细小的误差变化带来的反应相对较小。
smooth L1 Loss总结了上面两种函数的优点,在x较小时,梯度为x本身,会不断变小,x较大时,梯度的绝对值上限为一,这样的结构有效避免了梯度爆炸问题。
2. 分类损失函数
分类问题中对与损失函数的选择一般有以下几种,负对数似然损失,交叉熵损失和指数损失。
1.负对数似然损失
我们主要是从最大似然的角度来看,似然函数如下:
**函数和损失函数
其中pk(x;θ)=p(y=kx;θ)p_{k}(x;\theta )=p(y=k|x;\theta )所以当y=1时pk(x;θ)=p(x;θ)p_{k}(x;\theta )=p(x;\theta ),y=0时pk=(x;θ)=1p(x;θ)p_{k}=(x;\theta )=1-p(x;\theta )所以可以写成下面的形式logpy(x;θ)=ylogp(x;θ)+(1y)log(p(x;θ))logp_{y}(x;\theta)=ylogp(x;\theta )+(1-y)log(p(x;\theta ))
上式的最大化相当于极小化下式:ylogp(x;θ)(1y)log(p(x;θ))-ylogp(x;\theta )-(1-y)log(p(x;\theta ))
所以上式成为负对数似然损失。
2.交叉熵损失
交叉熵损失函数的表示跟似然函数很类似,特别是在二分类问题中,其表示如下:
ylogp(x;θ)(1y)log(p(x;θ))-ylogp(x;\theta )-(1-y)log(p(x;\theta ))
分别代表了分类为一和不为一。