均方差损失函数+Sigmoid**函数

Sigmoid**函数σ(z)=11+ez\sigma(z) = \frac{1}{1+e^{-z}}DNN的损失函数和**函数

  • 对于Sigmoid,当????的取值越来越大后,函数曲线变得越来越平缓,意味着此时的导数????′(????)也越来越小。同样的,当????的取值越来越小时,也有这个问题。仅仅在????取值为0附近时,导数????′(????)的取值较大。
  • 均方差+Sigmoid的BP反向传播算法中,每一层向前递推都要乘以????′(????),得到梯度变化值。Sigmoid曲线意味着在大多数时候,梯度变化值都很小,导致????, ????更新到极值的速度较慢。(算法收敛速度较慢)

交叉熵损失函数+Sigmoid**函数

CrossEntropy损失函数J(W,b,a,y)=[ylna+(1y)ln(1a)]J(W,b,a,y) = - [y lna + (1-y) ln(1 -a)]δL=J(W,b,aL,y)zL=y1aL(aL)(1aL)+(1y)11aL(aL)(1aL)=aLy\delta^L = \frac{\partial J(W,b,a^L,y)}{\partial z^L} = -y\frac{1}{a^L}(a^L)(1-a^L) + (1-y) \frac{1}{1-a^L}(a^L)(1-a^L)= a^L-y

  • 使用交叉熵,得到的的δl\delta^l梯度表达式没有了????′(????),梯度为预测值和真实值的差距,这样求得的Wl,blW^l,b^l的梯度也不包含????′(????),因此避免了反向传播收敛速度慢的问题。

对数似然损失函数和softmax**函数

Softmax**函数ai=ezij=1nezja_i = \frac{e^{z_i}}{\sum\limits_{j=1}^{n}e^{z_j}}
对数似然损失函数J(W,b,aL,y)=kyklnakLJ(W,b,a^L,y) = - \sum\limits_ky_klna_k^L如果某一训练样本的输出为第i类,则yiy_i= 1,其余的????≠????都有yjy_j= 0。J(W,b,aL,y)=lnaiLJ(W,b,a^L,y) = - lna_i^LJ(W,b,aL,y)wijL=J(W,b,aL,y)aiLaiLziLziLwijL=(aiL1)ajL1\frac{\partial J(W,b,a^L,y)}{\partial w_{ij}^L}= \frac{\partial J(W,b,a^L,y)}{\partial a_i^L}\frac{\partial a_i^L}{\partial z_i^L}\frac{\partial z_i^L}{\partial w_{ij}^L}=(a_i^L -1) a_j^{L-1}J(W,b,aL,y)biL=aiL1\frac{\partial J(W,b,a^L,y)}{\partial b_i^L} = a_i^L -1


梯度爆炸梯度消失与ReLU**函数

在反向传播算法过程中,由于使用了矩阵求导的链式法则,如果连乘的数字在每层都小于1,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都大于1,则梯度越往前乘越大,导致梯度爆炸。
δl=J(W,b,x,y)zl=(zLzL1zL1zL2...zl+1zl)TJ(W,b,x,y)zL\delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l} = (\frac{\partial z^L}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}})^T\frac{\partial J(W,b,x,y)}{\partial z^L}

  • 如果样本导致每一层zl+1zl\frac{\partial z^{l+1}}{\partial z^{l}}都小于1,则随着反向传播的进行,δl\delta^l会随着层数越来越小,甚至接近于0,导致梯度几乎消失,进而导致前面隐藏层的????, ????参数随着迭代的进行,几乎没有大的改变,不能收敛。这个问题目前没有完美的解决办法。
    • 一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)**函数σ(z)=max(0,z)\sigma(z) = max(0,z)
  • 对于梯度爆炸,则一般可以通过调整DNN模型中的初始化参数得以解决。

解决方案

  1. 换用Relu、LeakyRelu、Elu等**函数
  2. BatchNormalization
  3. ResNet残差结构
  4. LSTM结构
  5. 预训练加fine_tunning
    每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。
  6. 梯度剪切、正则
    如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。

DNN其他**函数

  1. tanh:sigmoid的变种tanh(z)=ezezez+eztanh(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}}DNN的损失函数和**函数
    tanh和sigmoid对比主要的特点是:输出落在了[-1,1],这样输出可以进行标准化。同时tanh的曲线在较大时平坦的幅度没有sigmoid那么大,这样求梯度变化值有一些优势。

小结

  1. 如果使用sigmoid**函数,则交叉熵损失函数一般肯定比均方差损失函数好。
  2. 如果是DNN用于分类,则一般在输出层使用softmax**函数和对数似然损失函数。
  3. ReLU**函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。

相关文章: