分类问题是机器学习中研究和使用都相当多的问题之一;它一般是个有监督的学习(surprised learning)过程;大致来说,有监督的学习是目前工业界有成效应用最多的了,虽然它(surprised learning)距离真正意义上人工智能还有一定差距的感觉;但是多多掌握分类问题模型仍然还是非常有必要的,其现有的应用场景已经非常之多了,这里不一一列举;在很多应用环节都能完成迅速识别、形成初步认知、甚至逐步替代人力。
从经典的数字识别(MNIST)到最近的kaggle题目Recursion Cellular Image Classification,分类数从10个直接上升到了1000+个。关于类似的多分类数据集还有ImageNet。
这次要思考和解决的主要问题是关于输出的编码方式和损失函数的选择,在简单地把之前建模少量类别的分类问题直接应用到超多类别问题时,遇到了一些问题。
1.首先,区别两个概念:多分类(multi-class)问题,以及多标签(multi-label)问题。
这个很好理解
2.编码问题
假定类别数为N;当N=1000时
首先说明为什么不直接用1,2,3....1000当标签(当然是可以归一化),因为距离问题
那么按照拓扑学的想法,我们能不能在M维空间中打上1000个点,使得任意两个点间的距离(可以是欧氏距离也可以是其他)是相等的,那么可以解决这个问题;
类比一下,容易想到,
当是3分类时,平面M=2就够了,构成一个等边三角形则每个顶点的距离都是相等的;
当4分类时可能需要的就是个正4面体了,它是在3维空间中的;
......
拓展学习,3维空间仅有的五种正多面体,即是正四面体、正六面体、正八面体、正十二面体和正二十面体。但实际上只有正四面体满足上述“所有点间的距离相等”
那么,如果我想解决N=5时的类别编码问题,我需要几维空间呢,也即我需要让5个顶点两两间的距离都相等,需要几维空间呢,当然,onehot一定能解决,即让M=N;
当然其实机器学习问题并不需要任意两种类间的编码距离都强制相等,很多时候也能解决问题,但可能是相等比较容易训练
NLP中词向量,也是对词进行了编码,但目的不同,它不仅仅是为了区分不同,更多的是两个词(向量)间的距离度量着词的某种相似度,比如词意或者语境的相似性。
不纠结,最后还是选择了onehot编码。
接下来是损失函数的问题,,,
上来就用的是均方误差,即好理解又好训练,但是这个顺势函数用在1000+类的onehot编码下,就相当的鸡肋了,为什么鸡肋呢,,,,
那么问题变成,我能不能换种距离公式,使得这两条向量的距离是十分明显的:
交叉熵 ,,,
余弦公式,,,
分别采用这两种损失函数实测训练时间看看,,,,
以上是思考过程,最终的结论很简单,就是,,,,而且在有经验的分类问题大师那里,这可能也就是一条信手拈来的经验吧。