1.损失函数和激活函数简介
通过前面深度神经网络之前向传播算法和深度神经网络之反向传播算法的学习,我们能够了解到损失函数是用来评估模型的预测值与真实值之间的差异程度。另外损失函数也是神经网络中优化的目标函数,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数越小,说明模型的预测值就越接近真实值,模型的准确性也就越好。前面我们已经学习过平方损失函数,对数损失函数、交叉熵损失函数等不同形式的损失函数,这里也就不做太多介绍。
那么在深度神经网络之中,激活函数的作用又是什么呢?首先我们来看单层感知机模型,如下图所示,感知机可以利用分割线将平面分割开来。
现在我们利用多个感知机进行组合,获得更强的分类能力,模型分类效果如下图所示。
但无论怎样组合,模型输出的时候都只是线性模型,如何解决非线性分类呢?好吧,上面是我们没有增加激活函数的情况。那么现在我们在每一层迭代完之后,增加一个激活函数,如下图的y=σ(a)所示,这样模型的输出便能解决非线性情况。将多个有激活函数的神经元组合起来,我们就可以得到一个相当复杂的函数。
引入非线性激活函数之中,模型的表达能力增强,能够有效解决非线性情况。通过不同形式的激活函数,模型也就能够学习到不同形式的分类方式,比如平滑分类平面,方面我们解决各种问题。
通过上面的介绍,我们能够了解到神经网络之中损失函数和激活函数的作用,但实际上DNN可以使用的损失函数和激活函数有不少,这时我们应该如何去做选择呢?下面我们介绍一些DNN之中常见的损失函数和激活函数。
2.交叉熵损失函数和Sigmoid激活函数
在深度神经网络之反向传播算法之中,我们用的是均方差损失函数和Sigmoid激活函数,首先我们看看均方差损失函数和Sigmoid激活函数有什么问题。如下所示,是我们已经非常熟悉的Sigmoid激活函数表达式
σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1
其中σ(z)的图像如下图所示,从图中可以看出,当z越来越大时,函数曲线也就变得越平缓,意味着此时导数σ′(z)也越小。同样,当z越来越小时,也会出现σ′(z)也越小。仅仅当z取值为0的附近时,导数σ′(z)取值较大。
在深度神经网络之反向传播算法之中,我们了解到每次反向迭代递推时,都要乘以σ′(z)得到梯度变化值。而Sigmoid的曲线意味着在大多数时候,DNN的梯度变化值较小,则会导致W,b更新到极值的速度很慢。那么有什么办法可以改变这种情况呢?
常见的方法是选用交叉熵损失函数来代替均方差损失函数,首先来看看交叉熵损失函数的形式。其中 ∙ 为向量内积,我们在机器学习之Logistic回归中便用到类似的交叉熵损失函数形式。
J ( W , b , a , y ) = − y ⋅ l n a − ( 1 − y ) ⋅ l n ( 1 − a ) J(W,b,a,y)=-y \cdot lna-(1-y)\cdot ln(1-a) J(W,b,a,y)=−y⋅lna−(1−y)⋅ln(1−a)
然后应用交叉熵损失函数之后,输出层 δ L \delta ^L δL的梯度变化情况如下所示。
δ L = J ( W , b , a L , y ) ∂ z L = − y 1 a L ( 1 − a L ) + ( 1 − y ) 1 1 − a L a L ( 1 − a L ) \delta^L=\frac{J(W,b,a^L,y)}{\partial z^L}=-y\frac{1}{a^L}(1-a^L)+(1-y)\frac{1}{1-a^L}a^L(1-a^L) δL=∂zLJ(W,b,aL,y)=−yaL1(1−aL)+(1−y)1−aL1aL(1−aL)
= − y ( 1 − a L ) + ( 1 − y ) a L = a L − y =-y(1-a^L)+(1-y)a^L=a^L-y =−y(1−aL)+(1−y)aL=aL−y
使用交叉熵损失函数与深度神经网络之反向传播算法中使用均方差损失函数的 δ L \delta^L δL有什么区别呢?我们发现使用均方差损失函数时 δ L = ( a L − y ) ⊙ σ ′ ( z ) \delta^L=(a^L-y)\odot {\sigma}'(z) δL=(aL−y)⊙σ′(z),对比发现使用交叉熵损失函数没有 σ ′ ( z ) {\sigma}'(z) σ′(z)。这样求得的 w l , b