我目前正在使用TensorFlow处理一个分类问题,我对机器学习领域还比较陌生,但有些事情我还不太明白。
我已经成功尝试过训练模型,使其输出y
张量如下:
y = [0,0,1,0]
但我不理解背后的原理……
为什么不直接训练同一模型输出诸如y = 3
或y = 4
这样的类别呢?
这样似乎更加灵活,因为我可以想象一个有200万种可能类别的多分类问题,用0到2,000,000之间的数字输出会比每次结果输出一个包含2,000,000项的张量更加高效。
我错过了什么?
回答:
理想情况下,你可以训练模型对输入实例进行分类,并产生一个单一输出。比如
y=1
表示input=dog
,y=2
表示input=airplane
。然而,这种方法会带来很多问题:
- 如何解释
y=1.5
这样的输出? - 为什么我要像处理连续数据一样尝试回归一个数字,而实际上我在处理离散数据?
事实上,你正在将一个多类别分类问题
当作回归问题来处理。这在局部上是错误的(除非你在做二分类,在那种情况下,正输出和负输出是你所需的全部)。
为了避免这些(以及其他)问题,我们使用一个最终的神经元层,并将高激活与正确的类别相关联。
one-hot编码表示你希望强制你的网络在某个输入存在时产生单一的高激活输出。
这样,每个input=dog
的输出将是1, 0, 0
,依此类推。
通过这种方式,你正确地处理了一个离散分类问题,产生了离散且易于解释的输出(实际上,你总是会使用tf.argmax
提取激活最高的输出神经元,即使你的网络没有学会产生完美的one-hot编码,你也能无疑地提取出最可能正确的输出)