机器学习多分类:为啥使用“one-hot”编码而不是数字
Posted
技术标签:
【中文标题】机器学习多分类:为啥使用“one-hot”编码而不是数字【英文标题】:Machine learning multi-classification: Why use 'one-hot' encoding instead of a number机器学习多分类:为什么使用“one-hot”编码而不是数字 【发布时间】:2017-11-29 07:32:14 【问题描述】:我目前正在研究 tensorflow 的分类问题,我是机器学习领域的新手,但我什么都不懂。
我已成功尝试训练输出y
张量的模型,如下所示:
y = [0,0,1,0]
但是看不懂背后的原理……
为什么不只训练相同的模型来输出诸如y = 3
或y = 4
之类的类
这似乎更灵活,因为我可以想象有 200 万个可能的类的多分类问题,输出 0-2,000,000 之间的数字比为每个输出 2,000,000 个项目的张量更有效结果。
我错过了什么?
【问题讨论】:
你只需要设置一个位来分类,如果你考虑你的输出层只有一个功能应该激活,其他的都是0。onehot经常用于fpga的状态编码更快速、更安全地标记内容 【参考方案1】:答案在于如何计算最终张量或单个值。在 NN 中,您的 y=3
将通过对前一层的值进行加权求和来构建。
尝试针对单个值进行训练将暗示类别 ID 之间存在线性关系,其中不存在类别 ID:对于真实值 y=4
,即使类别是随机的,输出 y=3
也会被认为优于 y=1
, 并且可能是1: dogs, 3: cars, 4: cats
【讨论】:
【参考方案2】:理想情况下,您可以训练模型对输入实例进行分类并生成单个输出。类似的东西
y=1
表示input=dog
,y=2
表示input=airplane
。然而,这样的方法会带来很多问题:
-
如何解释输出
y=1.5
?
为什么我尝试回归一个数字,就像我在处理连续数据一样,而实际上我在处理离散数据?
实际上,您正在做的是将多类分类问题视为回归问题。 这是局部错误的(除非您进行二元分类,在这种情况下,正负输出就是您所需要的一切)。
为避免这些(和其他)问题,我们使用最后一层神经元,并将高激活与正确的类相关联。
one-hot 编码表示您希望在存在特定输入时强制网络具有单个高激活输出。
这样,每个input=dog
都会有1, 0, 0
作为输出等等。
通过这种方式,您可以正确处理离散分类问题,产生离散输出并且可以很好地解释(事实上,您将始终使用tf.argmax
提取具有最高激活的输出神经元,即使您的网络没有' t 学会了生成完美的 one-hot 编码,您将能够毫无疑问地提取最有可能正确的输出)
【讨论】:
【参考方案3】:神经网络使用梯度下降来优化损失函数。反过来,这个损失函数需要是可微的。
离散输出将(确实是)分类网络的完全有效且有价值的输出。问题是,我们不知道如何有效地优化这个网络。
相反,我们依赖于连续损失函数。这种损失函数通常基于与每个标签的概率或多或少相关的东西——为此,您需要一个每个标签都有一个值的网络输出。
通常情况下,您描述的输出是通过这些伪概率的 argmax 从这个软的、连续的输出推导出来的。
【讨论】:
以上是关于机器学习多分类:为啥使用“one-hot”编码而不是数字的主要内容,如果未能解决你的问题,请参考以下文章
Numpy与PandasSklearn中one-hot快速编码方法