AI机动队
首发于AI机动队
神经网络损失函数、输出层、隐藏层详解——深度学习第六章(二)

神经网络损失函数、输出层、隐藏层详解——深度学习第六章(二)

神经网络的设计主要包含两方面:1)损失函数的选择 2)模型的具体架构。

对于损失函数,我们通常选择的是减小模型的概率分布与真实的概率分布之间的差异,即交叉熵(cross-entropy)

J(\theta)=-E_{x,y\sim \hat p_{data}}logp_{model}(y|x)

损失函数的具体形式依赖于模型的概率分布 p_{model}(y|x) ,例如在之前的总结中最大似然法与最大后验概率估计——深度学习花书第五章(三)我们知道,假如模型概率分布是高斯分布 p_{model}(y|x) = N(y;f(x;\theta); I) ,则损失函数就是均方误差的形式: J(\theta)=\frac{1}{2}E_{x,y\sim \hat p_{data}}||y-f(x;\theta)||^2+const

需要注意的是,由于神经网络的非线性的特征,我们通常需要用梯度下降的方法逐渐逼近其极值,而且不能保证损失一定会收敛。假如损失函数很容易饱和即在某些区间趋于不变的话,则其梯度很小,梯度下降算法很难更新,所以我们希望损失函数在我们所研究的区间内尽量不饱和。这也是为什么我们通常选取交叉熵的形式,因为很多概率分布函数都会出现指数形式(如sigmoid函数)而在某些区间饱和,交叉熵中的log函数正好可以抵消其饱和,使得模型可以较快更新纠正错误预测。

损失函数的具体形式依赖于神经网络输出层的选择,假设我们的神经网络已经得到了一系列隐藏特征 h=f(x;\theta) ,输出层就是从隐藏特征向我们的预测目标的映射。对于不同的输出分布,我们会有不同的输出函数及损失函数,常见的有如下几种:

Bernoulli Distribution

对于输出是Bernoulli Distribution的二元分布,在之前逻辑回归(逻辑回归——深度学习花书第五章(四))中总结过,我们通常选择sigmoid函数\sigma (z) = \frac{1}{1+e^{-z}}表示。令z=w^Th+b,我们的输出层函数即为 P(y=1)=\sigma (z), P(y=0)=1-\sigma(z)=\sigma(-z)

可以合并起来表示为 P(y)=\sigma ((2y-1)z) ,其对应的损失函数为 J(\theta)=-log\sigma((2y-1)z)=\varsigma ((1-2y)z) ,其中 \varsigma (x)=log(1+exp(x)) 为softplus function。

softplus function的函数如下图所示

可以看出只有当 (1-2y)z 的值极负时,才会出现饱和,而这种情况只出现在我们的模型已经能够做出准确预测的情况,即y=1且z极正,或者y=0而z极负,在这种情况下,梯度很小,但由于我们已经得到了足够准确的预测,我们并不需要更新我们的网络。对于对z作出错误预测的情况,即y=1且z为负,或y=0且z为正,则 (1-2y)z=|z| 为正值,在此区间softplus function并不饱和,梯度较大,所以对于错误预测,网络能够很好的通过梯度下降算法迅速纠正错误。

Multinoulli Distribution

如果我们需要描述目标是多个class的概率分布,我们需要将处理二元分类问题的sigmoid函数扩展,即对于多元分类问题常用的Softmax函数。

对于二元分布,我们只需要一个标量来表述class为1的概率 \hat y = P(y=1|x) ,对于目标是n个class的情况,我们需要矢量来表述 \hat y ,其中 \hat y_i = P(y=i|x) ,每一个 \hat y_i 都需要满足在[0,1]区间内,且所有 \hat y_i 的和为1,所以我们需要用softmax函数:

softmax(z)_i=\frac{exp(z_i)}{\sum_jexp(z_j)}

为了最小化损失函数,对于y=i, 我们则希望最大化logP(y=i;z)=logsoftmax(z)_i=z_i-log\sum_jexp(z_j)

其中第一项 z_i 是当前直接贡献项,我们希望将它变大,而将第二项变小,第二项可以做如下的直观理解:由于 log\sum_jexp(z_j)\approx max_jz_j ,第二项可以理解为我们队最不正确的预测做出的惩罚,如果正确项已经是softmax输入中贡献最大的,则两项可近似抵消,说明这个数据对整体的损失贡献较小,我们可以集中精力处理其他没有正确分类的数据。

可以看出,如果我们选取的损失函数不是交叉熵的形式,则对于softmax函数来说,当z为负值时,则其梯度接近于零,例如采取如mean square error形式的损失函数,则模型很难更新。而交叉熵保证了梯度不会消失。另一方面,对于z较大的情况,则softmax趋于1饱和,梯度也接近于零,只有采取交叉熵的形式才能很好的抵消饱和的影响。

Gaussian Distribution

对于输出是高斯分布的情况之前已经总结过,输出层常常是线性的变换 \hat y = W^Th+b ,而线性输出层用来得到高斯分布的均值 p(y|x)=N(y;\hat y,I) ,最小化交叉熵就转化为最小化均方差的形式。由于线性输出不存在饱和区间,所以能较好的应用梯度下降算法。

Mixture Gaussian Distribution

我们也可以将高斯分布推广到对于同一个x可能有几个y的峰值的混合高斯分布情况,它的输出层也被称为混合密度层(Mixture of Density)即

p(y|x)=\sum_{i=1}^n p(c=i|x)N(y;\mu^{(i)}(x);\Sigma^{(i)}(x)) 其中 p(c=i|x) 是对于n个组分的multinoulli分布。

我们同样的采取交叉熵作为其损失函数。

Ian用一张表很好的总结了以上的常见概率分布,输出层与损失函数的关系:


接下来Ian介绍了隐藏层的众多种类的函数,包括他本人提出的maxout units,但正如他本人在后来演讲中承认的,前馈网络大部分采取前面提到的ReLU函数(前馈神经网络初探——深度学习花书第六章(一))就可以比较有效的解决,其他更复杂的隐藏层函数模型效果和ReLU类似,并没有明显优势,而鉴于ReLU简单的形式和较好的结果,大部分前馈神经网络中仍选择ReLU作为隐藏层函数。

对于网络的架构,我们可以选取不同的宽度和深度,深度即有多少层,宽度即每层有多少节点。

universal approximation theorem万能近似定理证明:仅有一层隐藏层的前馈网络就足够表示任何函数的近似到任意的精度,那我们为什么还经常要构建更深层次的网络呢?原因是如果深度较浅,我们就需要每层有更多的节点即更大的宽度,为达到相同准确度所需要的总节点数更多。另外一方面,浅的网络也更易过拟合,泛化误差较大,例如Ian研究了对于图片地址数字识别的问题,测试准确度会随着层数的增大而提高:

所以通常我们会选取更深的网络来解决更复杂的问题。

总结一下,这部分主要讲了神经网络的损失函数通常用交叉熵,隐藏层通常用ReLU,而更深的模型能有效减少总节点数且减少泛化误差。

发布于 2018-08-04

文章被以下专栏收录