我目前正在研究 tensorflow 的分类问题,而且我是机器学习领域的新手,但我没有得到任何东西。
我已经成功地尝试训练输出这样的y
张量的模型:
y = [0,0,1,0]
但我无法理解它背后的校长......
为什么不只训练相同的模型来输出类,例如y = 3
或y = 4
这似乎更加灵活,因为我可以想象有 200 万个可能的类的多分类问题,并且输出 0-2,000,000 之间的数字比为每个结果输出 2,000,000 个项目的张量要高效得多。
我错过了什么?
我目前正在研究 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 编码,您将能够毫无疑问地提取最有可能正确的输出)
答案在于如何计算最终张量或单个值。在 NN 中,您y=3
将通过对前一层的值进行加权求和来构建。
尝试针对单个值进行训练将意味着在不存在的类别 ID 之间存在线性关系:对于真实值,即使类别是随机y=4
的,输出y=3
也会被认为更好,并且可能是y=1
1: dogs, 3: cars, 4: cats
神经网络使用梯度下降来优化损失函数。反过来,这个损失函数需要是可微的。
离散输出将(确实是)分类网络的完全有效且有价值的输出。问题是,我们不知道如何有效地优化这个网络。
相反,我们依赖于连续损失函数。这个损失函数通常基于与每个标签的概率或多或少相关的东西——为此,您需要一个每个标签都有一个值的网络输出。
通常,您描述的输出是通过获取这些伪概率的 argmax 从这个软的、连续的输出推导出来的。