赞
踩
目录
我们到目前为止看到的线性模型和神经网络的最大区别,在于神经网络的非线性导致大多数我们感兴趣的代价函数都变得非凸。凸优化从任何一种初始参数出发都会收敛(理论上如此),而用于非凸损失函数的随机梯度下降没有这种收敛性保证,并且对参数的初始值很敏感,这意味着神经网络的训练通常使用迭代的、基于梯度的优化,仅仅使得代价函数达到一个非常小的值。对于前馈神经网络,将所有的权重值初始化为小随机数是很重要的,偏置可以初始化为零或者小的正值。
在进行神经网络的学习时,不能将识别精度作为指标。因为如果以识别精度为指标,则参数的导数在绝大多数地方都会变为 0。因为识别精度是不连续的、离散的值,对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续地、突然地变化。
作为激活函数的阶跃函数也有同样的情况。出于相同的原因,如果使用阶跃函数作为激活函数,神经网络的学习将无法进行。阶跃函数的导数在绝大多数地方(除了 0 以外的地方)均为 0。也就是说,如果使用了阶跃函数,那么即便将损失函数作为指标,参数的微小变化也会被阶跃函数抹杀,导致损失函数的值不会产生任何变化。
对于损失函数,我们通常选择的是减小模型的概率分布与真实的概率分布之间的差异,即交叉熵(cross-entropy)。一般而言,如果我们定义了一个条件分布p(y|x;θ),最大似然原则建议我们使用-log p(y|x;θ ) 作为代价函数。
对于每一个样本(q指标签的类别数量):
y是one-hot 表示
监督数据是标签形式
1.减轻了为每个模型设计代价函数的负担:明确一个模型p(y|x)则自动地确定了一个代价函数log p(y|x)。
2.交叉熵中的log函数可以解决输出函数或激活函数的饱和问题。很多输出单元都会包含一个指数函数(如sigmoid函数),在它的变量取绝对值非常大的负值时会造成饱和,即梯度变得非常小,梯度下降算法很难更新。负对数似然代价函数中的对数函数消除了某些输出单元中的指数效果,使得模型可以较快更新纠正错误预测。相比之下,均方误差和平均绝对误差在使用基于梯度的优化方法时,一些饱和的输出单元会产生非常小的梯度。这就是交叉熵代价函数比均方误差或者平均绝对误差更受欢迎的原因之一了
损失函数的具体形式依赖于模型的概率分布 pmodel(y|x) ,对于不同的输出分布,会有不同的输出函数及损失函数。交叉熵展开形式通常会有一些项不依赖于模型的参数,我们可以舍去。
例如在前面章节提到,假如模型概率分布是高斯分布 pmodel(y|x) = N(y;f(x;θ);I) , 则损失函数就是均方误差的形式,其中舍弃的常数是基于高斯分布的方差,在这种情况下,我们选择不把它参数化。
下面,假设前馈网络提供了一组定义为h =f (x;θ)的隐藏特征,输出层的作用是随后对这些特征进行一些额外的变换
输出是高斯分布,输出层常常是线性的变换 y^=WTh+b ,而线性输出层用来得到高斯分布的均值 p(y|x)=N(y;y^,I) ,最小化交叉熵就转化为最小化均方差的形式。由于线性输出不存在饱和区间,所以能较好的应用梯度下降算法。
许多任务需要预测二值型变量y的值,比如具有两个类的分类问题,通常选择sigmoid函数σ(z),令z=wTh+b,我们的输出层函数即为 P(y=1)=σ(z), 令P(y=0)=σ(−z),可知P(y=1)+P(y=0)=1,得到一个有效的概率分布。书上给出了更详细的推导过程:假定非归一化的对数概率logP(y)对y和z是线性的,即logP(y)=yz,对它取指数和归一化,从而引入sigmoid变换。
P(y) = σ((2y−1)z) ,其对应的损失函数为 J(θ) = −logσ((2y−1)z) = ς((1−2y)z) ,其中 ς(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并不饱和,梯度较大,所以网络能够很快地改正错误的z
上面的分析解释了,代价函数中的log抵消了sigmoid中的exp。当我们使用其他的损失函数,例如均方误差之类的,损失函数就会在σ(z)饱和时饱和。sigmoid激活函数在z取非常小的负值时会饱和到0,当z取非常大的正值时会饱和到1。这种情况一旦发生,梯度会变得非常小以至于不能用来学习,无论此时模型给出的是正确还是错误的答案。因此,最大似然几乎总是训练sigmoid输出单元的优选方法。
如果我们需要描述目标是多个class的概率分布,常用Softmax函数作分类器的输出,来表示n个不同类上的概率分布。
神经网络中进行的处理有推理(inference)和学习两个阶段。当神经网络的推理只需要给出一个答案的情况下,因为此时只对得分最大值感兴趣,所以不需要 Softmax 层。不过,神经网络的学习阶段则需要 Softmax 层
对于目标是n个class的情况,我们需要矢量来表述 y^ ,其中 y^i=P(y=i|x) ,每一个 y^i 都需要满足在[0,1]区间内,且所有 y^i 的和为1,使得它表示一个有效的概率分布,所以我们需要用softmax函数,令logP(y)=z,通过指数化和归一化可以推导出softmax函数的形式:
和logistic sigmoid一样,当使用最大化对数似然训练softmax来输出目标值y时,使用指数函数工作地非常好。
为了最小化损失函数,对于y=i, 我们则希望最大化
其中第一项 zi 是当前直接贡献项,鼓励zi被推高。第二项则鼓励所有的z被压低,对任何明显小于max z的zk ,exp(zk)都是不重要的,所以log∑exp(zj)≈max z ,于是第二项可以理解为对最不正确的预测做出的惩罚,当然softmax输入中贡献最大的也可能是正确项,则两项可近似抵消, lossP(y)≈0,说明这个数据样本对整体的损失贡献较小,我们可以集中精力处理其他没有正确分类的数据。
像sigmoid一样,softmax激活函数可能会饱和(当其中一个输入是最大(zi =max z)并且zi 远大于其他的输入时,相应的输出softmax(z)i 会饱和到1。当zi 不是最大值并且最大值非常大时,相应的输出softmax(z)i 也会饱和到0),不使用对数来抵消softmax中的指数的目标函数,当指数函数的变量取非常小的负值时会造成梯度消失,从而无法学习,特别是平方误差,对于softmax单元来说,它是一个很差的损失函数,即使模型做出高度可信的不正确预测,也不能训练模型改变其输出
导数:
换句话说,导数是softmax模型分配的概率与实际发⽣的情况(由独热标签向量表⽰)之间的差异。从这个意义上讲,这与我们在回归中看到的⾮常相似,其中梯度是观测值y和估计值y^之间的差异。这不是巧合,在任何指数族分布模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。