机器学习多分类:为啥使用“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 = 3y = 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=dogy=2 表示input=airplane。然而,这样的方法会带来很多问题:

    如何解释输出y=1.5? 为什么我尝试回归一个数字,就像我在处理连续数据一样,而实际上我在处理离散数据?

实际上,您正在做的是将多类分类问题视为回归问题。 这是局部错误的(除非您进行二元分类,在这种情况下,正负输出就是您所需要的一切)。

为避免这些(和其他)问题,我们使用最后一层神经元,并将高激活与正确的类相关联。

one-hot 编码表示您希望在存在特定输入时强制网络具有单个高激活输出。

这样,每个input=dog 都会有1, 0, 0 作为输出等等。

通过这种方式,您可以正确处理离散分类问题,产生离散输出并且可以很好地解释(事实上,您将始终使用tf.argmax 提取具有最高激活的输出神经元,即使您的网络没有' t 学会了生成完美的 one-hot 编码,您将能够毫无疑问地提取最有可能正确的输出)

【讨论】:

【参考方案3】:

神经网络使用梯度下降来优化损失函数。反过来,这个损失函数需要是可微的。

离散输出将(确实是)分类网络的完全有效且有价值的输出。问题是,我们不知道如何有效地优化这个网络。

相反,我们依赖于连续损失函数。这种损失函数通常基于与每个标签的概率或多或少相关的东西——为此,您需要一个每个标签都有一个值的网络输出。

通常情况下,您描述的输出是通过这些伪概率的 argmax 从这个软的、连续的输出推导出来的。

【讨论】:

以上是关于机器学习多分类:为啥使用“one-hot”编码而不是数字的主要内容,如果未能解决你的问题,请参考以下文章

机器学习One-Hot编码

机器学习:数据预处理之独热编码(One-Hot)

one-hot编码简介

Numpy与PandasSklearn中one-hot快速编码方法

Numpy与PandasSklearn中one-hot快速编码方法

数据处理——One-Hot Encoding