对于激活函数跟损失函数做一下记录,后面再看时也方便,可能有些图片搬运的各位大佬的,还请见谅。
激活函数有很多,主要记录常用的和比较经典的一些,例如sigmoid、tanh、RELU及其变种。 首先说一下激活函数的作用,一般激活函数作用于神经网络中卷积层的后面,用来引入非线性因素,通过激活函数这种非线性函数来加强神经网络的拟合能力(不再单纯是线性函数了)。
Sigmoid函数 sigmoid函数是早期神经网络非常常见的一种激活函数,其数学表达式如下: Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过 Euler integralf ( z ) = 1 1 + e − z f(z)=\dfrac{1}{1+e^{-z}} f(z)=1+e−z1 函数图像如下: sigmoid函数的作用如上图所示,把数据变换成0~1之间的数,过于大的数为1,过于小的数位0 。这个函数在早期的深度学习中使用较多,现在很少使用。原因是sigmoid函数容易在反向传播时造成梯度消失或者爆炸,从他的导数图像就可以看到: 最大值位0.25,我们在回传时,每经过一层梯度变为以前的0.25倍,很容易造成梯度消失。而且Sigmoid 的 output 不是0均值(即zero-centered),这样会使得下一层的输入会是非零均值的,在反向传播时,梯度就会保持一个方向,参数更新就会缓慢。 2. tanh函数 tanh函数的数学表达式如下: t a n h ( x ) = e x − e − x e x + e − x tanh(x)= \dfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=ex+e−xex−e−x 函数图像以及导数图像如下: 从图像可以看到,tanh函数解决了sigmoid函数非零均值的缺点,但是梯度消失依旧存在。 3. Relu函数 Relu函数数学表达式: y = m a x ( 0 , x ) 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 ) a x , ( x < 0 ) y=\begin{cases}x,&(x>0)\\ax,&(x<0) \end{cases} y={x,ax,(x>0)(x<0) 其中a=0.01,函数图像图下所示: 这样在负半轴,函数值不为零,就不会出现上面讨论的问题了。虽然理论上Leaky Relu是要比Relu要好,但是我们实验发现,不能完全保证Leaky Relu函数绝对要好。 5. PRelu函数 PRelu函数的提出,是为了改进Leaky Relu函数,我们将其中的a的值不再固定为0.01,而是让其根据数据进行学习,这样的激活函数可以用在反向传播中与其他层进行优化。 6. RRelu函数 RRelu函数也是一种改进,在训练的时候a保持在给定范围内取样的随机变量,而在之后测试中就变成了固定值。PReLU在一定程度上能起到正则效果。数学表达式如下: f ( x ) = { x x > 0 a x x < 0 f(x)=\begin{cases} x &x>0\\ax &x<0 \end{cases} f(x)={xaxx>0x<0
对于损失函数来说有很多种,这里简单介绍几种在分类回归问题上常见的几种,方差损失,绝对值损失,smooth L1损失,二分类交叉熵函数,Logistic loss。
回归损失函数 方差损失,绝对值损失以及smooth L1损失用求解回归问题,数学表达式如下: L 2 ( x ) = ( y − f ( x ) ) 2 L_2(x)=(y-f(x))^2 L2(x)=(y−f(x))2 L 1 ( x ) = ∣ y − f ( x ) ∣ L_1(x)=|y-f(x)| L1(x)=∣y−f(x)∣s m o o t h L 1 ( x ) = { 0.5 x 2 ∣ x ∣ < 1 ∣ x ∣ − 0.5 o t h e r s smoothL1(x)=\begin{cases} 0.5x^2 &|x|<1\\|x|-0.5 &others \end{cases} smoothL1(x)={0.5x2∣x∣−0.5∣x∣<1others 其中x为输入,f(x)为标签,y为输出,将其求导可以看到: d L 2 ( x ) d x = 2 x \dfrac{dL_2(x)}{dx}=2x dxdL2(x)=2x d L 1 ( x ) d x = { 1 x > 0 − 1 o t h e r s \dfrac{dL_1(x)}{dx}=\begin{cases} 1 &x>0\\-1 &others \end{cases} dxdL1(x)={1−1x>0others d s m o o t h L 1 d x = { x ∣ x ∣ < 1 ± 1 o t h e r s \dfrac{dsmooth_L1}{dx}=\begin{cases} x &|x|<1\\ \pm1 &others\end{cases} dxdsmoothL1={x±1∣x∣<1others 对于L2 loss来说,随着x的增大,L2损失对于x的导数不断增大。当预测框与真实框的差异过大时,损失函数对于预测值的梯度过大,使得训练不稳定,而且预测值与观测值的差异很大时,又容易发生梯度爆炸。 对于L1 loss ,其对于x的导数为常数,在训练时发现,当预测框与真实框差异过小时,导数不变,容易导致损失函数在某一范围波动,影响模型收敛。
L1 lossL2 loss鲁棒性差鲁棒性强稳定解不稳定解对于鲁棒性来说最小绝对值差的效果好是因为与平方差相比,他能处理数据中的异常值。因为L2 loss中的平方会把误差变大(如果误差大于1)。 对于稳定性来说,绝对值误差在数据集有些许变化时,会产生较大的反应,而方差中细小的误差变化带来的反应相对较小。 smooth L1 Loss总结了上面两种函数的优点,在x较小时,梯度为x本身,会不断变小,x较大时,梯度的绝对值上限为一,这样的结构有效避免了梯度爆炸问题。 2. 分类损失函数 分类问题中对与损失函数的选择一般有以下几种,负对数似然损失,交叉熵损失和指数损失。 1.负对数似然损失 我们主要是从最大似然的角度来看,似然函数如下: 其中 p k ( x ; θ ) = p ( y = k ∣ x ; θ ) p_{k}(x;\theta )=p(y=k|x;\theta ) pk(x;θ)=p(y=k∣x;θ)所以当y=1时 p k ( x ; θ ) = p ( x ; θ ) p_{k}(x;\theta )=p(x;\theta ) pk(x;θ)=p(x;θ),y=0时 p k = ( x ; θ ) = 1 − p ( x ; θ ) p_{k}=(x;\theta )=1-p(x;\theta ) pk=(x;θ)=1−p(x;θ)所以可以写成下面的形式 l o g p y ( x ; θ ) = y l o g p ( x ; θ ) + ( 1 − y ) l o g ( p ( x ; θ ) ) logp_{y}(x;\theta)=ylogp(x;\theta )+(1-y)log(p(x;\theta )) logpy(x;θ)=ylogp(x;θ)+(1−y)log(p(x;θ)) 上式的最大化相当于极小化下式: − y l o g p ( x ; θ ) − ( 1 − y ) l o g ( p ( x ; θ ) ) -ylogp(x;\theta )-(1-y)log(p(x;\theta )) −ylogp(x;θ)−(1−y)log(p(x;θ)) 所以上式成为负对数似然损失。 2.交叉熵损失 交叉熵损失函数的表示跟似然函数很类似,特别是在二分类问题中,其表示如下: − y l o g p ( x ; θ ) − ( 1 − y ) l o g ( p ( x ; θ ) ) -ylogp(x;\theta )-(1-y)log(p(x;\theta )) −ylogp(x;θ)−(1−y)log(p(x;θ)) 分别代表了分类为一和不为一。
