【CS231n】斯坦福大学李飞飞视觉识别课程笔记
由官方授权的CS231n课程笔记翻译知乎专栏——智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结。
【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十五):神经网络笔记2(下)
损失函数
我们已经讨论过损失函数的正则化损失部分,它可以看做是对模型复杂程度的某种惩罚。损失函数的第二个部分是数据损失,它是一个有监督学习问题,用于衡量分类算法的预测结果(即分类评分)和真实标签结果之间的一致性。数据损失是对所有样本的数据损失求平均。也就是说,中,是训练集数据的样本数。让我们把神经网络中输出层的激活函数简写为,在实际中你可能需要解决以下几类问题:
分类问题是我们一直讨论的。在该问题中,假设有一个装满样本的数据集,每个样本都有一个唯一的正确标签(是固定分类标签之一)。在这类问题中,一个最常见的损失函数就是(是 公式):
之前简要提起过,有些学者的论文中指出平方折叶损失(即使用)算法的结果会更好。第二个常用的损失函数是分类器,它使用交叉熵损失:
问题:类别数目巨大。当标签集非常庞大(例如字典中的所有英语单词,或者中的22000种分类),就需要使用分层()了(参考文献)。分层将标签分解成一个树。每个标签都表示成这个树上的一个路径,这个树的每个节点处都训练一个分类器来在左和右分枝之间做决策。树的结构对于算法的最终结果影响很大,而且一般需要具体问题具体分析。
属性(Attribute)分类。上面两个损失公式的前提,都是假设每个样本只有一个正确的标签。但是如果是一个二值向量,每个样本可能有,也可能没有某个属性,而且属性之间并不相互排斥呢?比如在上的图片,就可以看成是被一个巨大的标签集合中的某个子集打上标签,一张图片上可能有多个标签。在这种情况下,一个明智的方法是为每个属性创建一个独立的二分类的分类器。例如,针对每个分类的二分类器会采用下面的公式:
上式中,求和是对所有分类,的值为1或者-1,具体根据第个样本是否被第个属性打标签而定,当该类别被正确预测并展示的时候,分值向量为正,其余情况为负。可以发现,当一个正样本的得分小于+1,或者一个负样本得分大于-1的时候,算法就会累计损失值。
另一种方法是对每种属性训练一个独立的逻辑回归分类器。二分类的逻辑回归分类器只有两个分类(0,1),其中对于分类1的概率计算为:
因为类别0和类别1的概率和为1,所以类别0的概率为:
。这样,如果,那么样本就要被分类成为正样本()。然后损失函数最大化这个对数似然函数,问题可以简化为:
上式中,假设标签非0即1,就是函数。上面的公式看起来吓人,但是的梯度实际上非常简单:(你可以自己求导来验证)。
回归问题是预测实数的值的问题,比如预测房价,预测图片中某个东西的长度等。对于这种问题,通常是计算预测值和真实值之间的损失。然后用平方范式或范式度量差异。对于某个样本,范式计算如下:
之所以在目标函数中要进行平方,是因为梯度算起来更加简单。因为平方是一个单调运算,所以不用改变最优参数。范式则是要将每个维度上的绝对值加起来:
在上式中,如果有多个数量被预测了,就要对预测的所有维度的预测求和,即。观察第个样本的第维,用表示预测值与真实值之间的差异。关于该维度的梯度(也就是)能够轻松地通过被求导为范式的或。这就是说,评分值的梯度要么与误差中的差值直接成比例,要么是固定的并从差值中继承。
注意:损失比起较为稳定的损失来,其最优化过程要困难很多。直观而言,它需要网络具备一个特别的性质,即对于每个输入(和增量)都要输出一个确切的正确值。而在中就不是这样,每个评分的准确值并不是那么重要:只有当它们量级适当的时候,才有意义。还有,损失鲁棒性不好,因为异常值可以导致很大的梯度。所以在面对一个回归问题时,先考虑将输出变成二值化是否真的不够用。例如,如果对一个产品的星级进行预测,使用5个独立的分类器来对1-5星进行打分的效果一般比使用一个回归损失要好很多。分类还有一个额外优点,就是能给出关于回归的输出的分布,而不是一个简单的毫无把握的输出值。如果确信分类不适用,那么使用损失吧,但是一定要谨慎:非常脆弱,在网络中使用随机失活(尤其是在损失层的上一层)不是好主意。
当面对一个回归任务,首先考虑是不是必须这样。一般而言,尽量把你的输出变成二分类,然后对它们进行分类,从而变成一个分类问题。
结构化预测(structured prediction)。结构化损失是指标签可以是任意的结构,例如图表、树或者其他复杂物体的情况。通常这种情况还会假设结构空间非常巨大,不容易进行遍历。结构化背后的基本思想就是在正确的结构和得分最高的非正确结构之间画出一个边界。解决这类问题,并不是像解决一个简单无限制的最优化问题那样使用梯度下降就可以了,而是需要设计一些特殊的解决方案,这样可以有效利用对于结构空间的特殊简化假设。我们简要地提一下这个问题,但是详细内容就超出本课程范围。
小结
小结如下:
-
推荐的预处理操作是对数据的每个特征都进行零中心化,然后将其数值范围都归一化到 [-1,1] 范围之内。
-
使用标准差为的高斯分布来初始化权重,其中是输入的神经元数。例如用可以写作:
w = np.random.randn(n) * sqrt(2.0/n)
。 -
使用正则化和随机失活的倒置版本。
-
使用批量归一化。
-
讨论了在实践中可能要面对的不同任务,以及每个任务对应的常用损失函数。
现在,我们预处理了数据,初始化了模型。在下一节中,我们将讨论算法的学习过程及其运作特性。