【损失函数】
损失函数是用来告诉我们当前分类器性能好坏的评价函数,是用于指导分类器权重调整的指导性函数,通过该函数可以知道该如何改进权重系数。
S是通过分类器预测出来的类的分数, Si表示的是第i类分类所得的预测分数,Yi是样本正确分类的标签(即是整数,在讲课中是cifar10,10类标签,即是0-9),i表示是训练集的第i个样本的真实分类的分数。这个式子是在计算真实分类的所得分数与其他分类间的安全距离,也就是margin,如果真实分类的所得分数—其他分类的分数>margin,这就是我们想要的分类效果,安全的分类距离。如果真实分类的所得分数不比其他分类分数高出这么多,就会得到损失,这是不希望看到的。 公式中的“1”,是一个自由参数,即是margin,在SVM的推导中,“1”是可以自由选择的,放大缩小均可以,因为所有的样本的权重会随margin的变化而同等的放大缩小。
【Hinge Loss】
这是第i类的损失,将所有的损失加起来就是总的损失,是一种Hinge Loss。图像的x轴是Syi,是训练样本真实分类的分数,y轴是Loss,随着真实分类的分数提升是线性下降的,经过一个阈值(margin),损失会变为0,即已成功分类。
Hinge Loss的取值范围为[0,+inf)
由此,对例子中的进行损失计算为:
第一列分类是cat,分类正确,其他分类的则利用损失函数Li进行计算,car、frog的分类也同样计算。
最后计算数据集的平均损失:
通过以上例子可以看出,Loss反映了真实分类所得分数与其他分类分数的差别,也就是说,如果真是分类所得分数比分类为其他类的分数要低(取分数最高的那一类作为分类输出,那么将分类错误),但是分数低多少,要想真实分类的分数最高,差距在哪,即是通过损失函数Li的值反映出来了。
同时,如果分类正确的分数比其他的分类分数高于1,即使正确分类的分数发生微小变化(相差仍然大于1),那么Hinge Loss仍然有效,损失函数值不会发生变化。
损失函数的也可以进行平方操作,其效果在于对分类错误的刻画程度上,也可以自定义损失函数,用于对实际的分类进行刻画。这是用于权衡各分类之间的效果
主要目的是使模型简单化,而不是仅仅拟合数据。
• L2正则化,是一种关于权值向量W的范数,是对权重向量的欧式范数进行惩罚,例如一个权重向量(四维)只有一个元素是1,其他为0,而另一个是全都为0.25,这时第二个范数更小,反映对所有的进行权衡,更具有鲁棒性,而不是仅仅依赖于某个分量
• L1范数具有一些较好的性质,类似于矩阵中的稀疏矩阵,与L2的情况有点相反,更适合使权重稀疏化
• Elastic net(L1+L2),即是L1与L2的组合
• 最大值(max)范数,对最大的权重进行惩罚
• 或者采用dropout,Fancier(批量归一化,随机深度)
因此,需要根据实际情况进行选择合适的范数。
【Softmax Classifier(Multinomial Logistic Regression)】通过上面的计算所得的分数,并没有一个合理的解释,通过利用softmax函数,将所得分数进行归一化,赋予其含义,即得到了相应概率分布(0-1之间,和为1),通过这样所得到的是,当一个样本是猫(比如真实分类),那么概率分布在猫处的概率为1(理想情况下),其他的是0,概率分布即存在一个尖峰。
想要最大化似然函数,即是最小化负对数似然函数那么损失函数为
Hinge Loss只是使正确分类的分数比其他分类的分数高出一个margin即可,即是再提高正确分类的分数,也不会对损失函数带来多大的影响,也就是说并没有增加分类正确的有用信息;而Softmax则不同,提高正确分类的分数会增加分类正确的概率,降低其他分类的概率,进一步带来了有用信息,使分类正确的概率越来越高,趋近于0.
但是在实际的运用中,两者使用的差别不是很大。
【小结】
# assume X_train is the data where each column is an example (e.g. 3073 x 50,000)
# assume Y_train are the labels (e.g. 1D array of 50,000)
# assume the function L evaluates the loss function
bestloss = float("inf") # Python assigns the highest possible float value
for num in xrange(1000):
W = np.random.randn(10, 3073) * 0.0001 # generate random parameters
loss = L(X_train, Y_train, W) # get the loss over the entire training set
if loss < bestloss: # keep track of the best solution
bestloss = loss
bestW = W
print 'in attempt %d the loss was %f, best %f' % (num, loss, bestloss)
# prints:
# in attempt 0 the loss was 9.401632, best 9.401632
# in attempt 1 the loss was 8.959668, best 8.959668
# in attempt 2 the loss was 9.044034, best 8.959668
# in attempt 3 the loss was 9.278948, best 8.959668
# in attempt 4 the loss was 8.857370, best 8.857370
# in attempt 5 the loss was 8.943151, best 8.857370
# in attempt 6 the loss was 8.605604, best 8.605604
# ... (trunctated: continues for 1000 lines)
# Assume X_test is [3073 x 10000], Y_test [10000 x 1]
scores = Wbest.dot(Xte_cols) # 10 x 10000, the class scores for all test examples
# find the index with max score in each column (the predicted class)
Yte_predict = np.argmax(scores, axis = 0)
# and calculate accuracy (fraction of predictions that are correct)
np.mean(Yte_predict == Yte)
# returns 0.1555
最差效果是15.5%,最好的效果是95%,差距较大。
• Follow the slope(梯度下降):
数值梯度:慢,近似,容易实现
分析梯度(Analytic gradient):准确,快速,容易出错
步长是一个超参数,需要进行调试(tips:首先找到合适的学习率和步长)
• 随机梯度下降(SGD):
利用特征变换,将非线性的特征分布转换为线性分布。
【方向梯度直方图 Histogram of Oriented Gradients (HoG)】
Hubel和Wiesel发现,在人类视觉当中,有向边缘非常重要,特征表示的直方图,尝试提取有向边缘,并测量图像中边缘的局部方向。
方法是,先将图片按八个像素区分为八份,在每个像素区的每一个部分,计算每个像素值的主要边缘方向,将边缘量化到几个组,然后在每一个区域内,计算不同的边缘方向从而得到一个直方图。 这是非常常见的用于目标识别的特征表示
【Bag of Words】
灵感来自于自然语言处理,特征提取是计算一段话中不同词的词频。但是用于图片分类并不简单,分为两阶段:首先是获得一堆图片,从这些图片中进行小的随机块的采样,然后采用K均值等方法将它们聚合成簇,得到不同的簇中心,这些簇中心可能代表了图像中的图片单词的不同类型。