本文九成以上内容来自斯坦福大学关于神经网络的文章,对学习内容记录下来,以便日后回顾。
本文将通过一个例子来理解什么是损失函数:
本文中参数的具体含义等内容请参考神经网络学习与总结一文,这里不过多赘述。
从图中我们可以发现,这组特定的权值W效果并不好,给了猫一个非常低的得分。我们将用损失函数(有时也称为成本函数或目标函数)来衡量我们对结果的不满意程度。直观地说,如果我们在分类培训数据方面做得不好,损失就会很大;如果我们做得好,损失就会很小。
这里有几种方式来定义损失函数:
MSE(Mean Squared Error):
MSE在线性回归问题中比较好用。
Multiclass Support Vector Machine(SVM):
这个函数可以保证每个图像对于正确类的打分高于不正确类的打分 Δ 。对于不同的样本,第i个样本的损失函数定义为:
举一个例子来理解这个函数时怎样工作的。假定我们拥有三个类别并且得到了三个分数s = [13, -7, 11],并且第一个类别是正确的类别。与此同时,我们假定一个上述定义的变量Δ(一个超参) = 10。代入上述损失函数,我们得到两项:
不难算出第一项得到了一个0,而第二项得到了8。由于正确的类分数(13)至少比错误的类分数(-7)大10,所以这对组合的损失为零。实际上差值为20,远远大于10,但SVM只关心差值至少为10;任何超出边界的额外差异都将被最大操作限制在零处。第二项计算[11 - 13 + 10]得到8。也就是说,即使正确的班级的分数比错误的班级(13 > 11)高,也不会比期望的分数高10。差额只有2,这就是为什么损失是8(即差额要多高才能达到差额)。总之,SVM损失函数要正确的分数类易被比错误的类分数由至少Δ。如果不是这样,我们将积累损失。
对于神经网络来说,我们利用一个线性方程式获取分数:
所以说,我们可以重新定义损失函数格式:
其中,wj为矩阵W对的第j个行向量(第j个类别对应的向量)变形成为的列向量。最后通过一张图,更加直观理解上式:
将所有样本损失函数整合成一个整体的损失函数:
Softmax: 将会在下文中介绍。
下面是正则化常用的几种方式:
(1)L2正则化:
L2正则化是正则化中最普通的一种方式。它通过惩罚所有参数的平方项来实现,也就是在损失函数中添加一项1/2 λ w²,这里采用1/2是为了在应用梯度下降时,针对于每一个w是λw 而不是2λw。L2正则化有一个吸引人的特性,即鼓励网络中所有的输入都有一部分参加,而不是大量使用某些输入。最后请注意,在梯度下降法参数更新,使用L2正规化最终意味着每个权重是线性衰退:W + = - λ* W直到0。
(2)L1正则化
L1正则化增加的项是λ|w|,我们有时候可以将L1与L2同时使用。L1有一个非常优秀的性质,它能够在最优化过程会走光,令权重向量变得稀疏。换句话说,L1最终可以使最重要的一个稀疏子集输入,而无视噪声。相比之下,L2正则化的最终权向量通常是分散的、小的数字。在实践中,如果您不关心明确的特征选择,L2正则化的性能优于L1。
(3)Max norm constraints
对每个神经元的权向量的大小施加一个绝对上界,并使用梯度下降来施加约束。在实践中,我们正常更新参数w,不过强制参数w在啊某一个范围内,它的特性是,即使在学习率设置得太高时,网络也不会“爆炸”,因为更新总是有限的。
(4)Dropout
一种防止神经网络过拟合的简单方法(p,它补充了其他方法(L1、L2、maxnorm)。当训练时,通过保持一个神经元以一定的概率p(超参数)激活,或者将其设置为0。学习难度较高,具体实现可以参考Dropout: A Simple Way to Prevent Neural Networks
假定我们找到了一个对于所有类别损失函数都为0的权重矩阵,这时可能出现一种问题,权重矩阵并不是严格唯一的,可能会出现很多W都使得样本分类正确。
这里首先要明确一件事,如果一些参数W正确分类所有的例子,那么任何这些参数乘以λ(λ > 1)因为这个变换均匀延伸所有分数大小。例如,如果一个正确的类和一个最接近的不正确的类之间的分数差是15,那么将W的所有元素乘以2将得到新的差值30。
我们如何找到唯一一个确定的权重矩阵W,这里就需要给损失函数添加正则化损失函数R(W)
完整的损失函数表达式为:
整体扩展为:
其中N是训练样本的数量而λ为超参数。正则化惩罚有很多优秀的性质,最吸引人的特性是惩罚较大的权重有助于提高泛化能力,这意味着没有任何输入维度可以单独对分数产生非常大的影响。
假设我们有一个输入向量x=[1,1,1,1],两个权向量w1=[1,0,0,0], w2=[0.25,0.25,0.25,0.25]。然后wT1x=wT2x=1所以两个权向量得到相同的点积,但是w1的L2损失是1。而w2的L2损失是0.25。因此,根据L2惩罚,权向量w2是首选,因为它实现了更低的正则化损失。直观上,这是因为w2中的权重更小,更分散。由于L2惩罚倾向于更小和更分散的权重向量,因此鼓励最终分类器将所有的输入维都考虑到,而不是只重点考虑几个输入维。这对于提高分类器泛化性能,防止过拟合有着重要的作用。
Softmax:如果你曾经听说过二分逻辑回归分类器,那么Softmax分类器是它的一种推广,以一个多类分类器。与支持向量机将输出f(xi,W)作为每个类的得分(未校准且可能难以解释)不同,Softmax分类器提供了更直观的输出(归一化类概率)。首先来看一下损失函数的形式:
Softmax分类器目标是最小化待测类的概率与它真正属性之间的交叉熵。其中,交叉熵希望预测分布全部集中在正确答案上。先观察下方表达式:
可以将其解释为,在给定的图像xi和由w参数化的情况下,分配给正确标签yi的(标准化)概率。要了解这一点,请记住Softmax分类器将输出向量f中的得分解释为非标准化的 log 概率。因此,将这些量取幂就得到了(未标准化的)概率,然后进行除法,从而使概率之和为1。
从概率角度来解释,我们最小化正确类的负对数似然,这可以解释为执行最大似然估计(MLE),具体内容见第五模块——极大似然估计。这种方法有一个很好的特点就是我们能够
解释在完整损失函数中的正则化项R(W)来自一个高斯先验权重矩阵W,在这个权重矩阵中,我们正在执行最大后验(MAP)估计,这里选用log函数的原理是交叉熵,想要深究的读者可以参考(交叉熵在机器学习中的作用),本文在下一模块进行简要介绍。
如果你想要去实现Softmax函数,就要注意代码编写过程中,由于指数的存在,分子和分母都有可能是非常大的数字。大数运算是不稳定的,这里引入参数C来解决这一问题,将表达式作如下变换:
我们可以自由选择c的值,这不会改变任何结果,但是我们可以使用这个值来提高计算的数值稳定性。如果选择函数结果中的最大值为C(最常用),通过代码可以很好理解:
f = np.array([123, 456, 789])
p = np.exp(f) / np.sum(np.exp(f)) # 出现数值不稳定问题
# 将最大值转换为0
f -= np.max(f) # f ——> [-666, -333, 0]
p = np.exp(f) / np.sum(np.exp(f)) # 结果不变,且过程安全
下面通过一张图,更加直观理解两种分类器的区别:
SVM:
将这些分数解释为类分数,其损失函数鼓励正确的类(蓝色表示的是类2)获得比其他类分数高的分数。
Softmax分类器:
将每个类的得分解释为(非标准化的)log概率,然后鼓励正确类的(标准化的)log概率高(相当于其负数低)。
与支持向量机计算未经校准和不容易解释所有类的分数不同,Softmax分类器允许我们计算所有标签的“概率”。这里概率打引号是因为最终的概率大小还收到损失函数中正则化参数λ的影响。如果正则化强度λ是高,权重W的惩罚也会增加,这将导致权重变小,使概率分布也更加分散。
(摘自交叉熵在机器学习中的作用)
简单概括为:将神经网络分类问题概括为单分类问题和多分类问题:(举例)
单分类问题:继续沿用文章开头例子,假设目标类型为三个,分别为猫,狗和船。假设现在有一个猫的样本,则对应的预测值为[0(狗),1(猫), 0(船)],假设通过上述计算获取的P为[0.3, 0.6,0.1],已知交叉熵公式为:
则可以根据公式求得损失函数(交叉熵):
多分类问题:
继续沿用文章开头例子,假设目标类型为三个,分别为猫,狗和船。假设现在有一个猫的样本,则对应的预测值为[0(狗),1(猫), 0(船)],假设通过上述计算获取的P为[0.3, 0.6,0.1],和单分类问题的标签不同,多分类的标签是n-hot。 比如一张图中可以既有一只狗,又有一只猫,所以是一个多分类问题 。
这里的Pred不再是通过softmax计算的了,这里采用的是sigmoid。将每一个节点的输出归一化到[0,1]之间。所有Pred值的和也不再为1。换句话说,就是每一个Label都是独立分布的,相互之间没有影响。所以交叉熵在这里是单独对每一个节点进行计算,每一个节点只有两种可能值,所以是一个二项分布。前面说过对于二项分布这种特殊的分布,熵的计算可以进行简化。
同样的,交叉熵的计算也可以简化,即 :
单个样本的loss即为loss=loss猫+loss狗+loss船
(参考文章)
声明:这里直接复制了部分作者原文内容,目的是与本文做对比,给读者更清晰的理解。
在实际问题中,我们能获得的数据可能只有有限数目的样本数据,而先验概率和类条件概率(各类的总体分布)都是未知的。根据仅有的样本数据进行分类时,一种可行的办法是我们需要先对先验概率和类条件概率进行估计。
先验概率的估计较简单,因为对于神经网络来说每个样本所属的自然状态都是已知的(有监督学习)。类条件概率的估计(非常难),原因包括:概率密度函数包含了一个随机变量的全部信息,而样本数据可能不多;特征向量x的维度可能很大等等。
极大似然估计就是一种参数估计方法。当然了,概率密度函数的选取很重要,模型正确,在样本区域无穷时,我们会得到较准确的估计值。最大似然估计的目的就是:利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值。
在神经网络中 ,极大似然估计求得的目标参数值是权重矩阵W,类条件概率为(与交叉熵对应起来):
求解极大似然函数步骤:
2、实际中为了便于分析,定义了对数似然函数(Softmax的损失函数(交叉熵)):
由于Li都后半部分是个定值,所以我们只需要最优化Li = -fyi。
3、未知参数有多个(θ为向量)
则θ可表示为具有S个分量的未知向量:
记梯度算子:
若似然函数满足连续可导的条件,则最大似然估计量就是如下方程的解。
方程的解只是一个估计值,只有在样本数趋于无限多的时候,它才会接近于真实值。
对于神经网络来说,极大似然估计求梯度算子也就是损失函数的梯度下降最优化。具体内容本文不重点讨论,可以参考我的神经网络学习与总结。最后通过神经网络计算样本后验概率进行预测分类。
本文主要通过介绍两种最常见的分类器SVM与Softmax完成了对于神经网络中损失函数的讲解,从中我们发现损失函数的定义方式是,对训练数据进行良好的预测就等于损失很小。
支持向量机和Softmax的性能差异通常很小,不同的人对哪种分类器工作得更好会有不同的看法。Softmax分类器从不完全满意它生成的分数:正确的类总是有更高的概率,而错误的类总是有更低的概率,损失总是更好。然而,一旦边界得到满足,SVM就会很高兴,而且它不会对超出这个限制的准确分数进行微观管理。
除此之外还介绍了正则化常用的一些公式,以及最大似然估计的具体步骤。损失函数学习结束之后,便是最优化问题了,神经网络中最优化问题常采用梯度下降法来实现,具体内容见关于梯度下降法的理解与学习。