在深度学习中,经常会听到 one-hot 编码,也称“独热编码”。本文就拆解一下,这种编码是做什么的以及为什么需要这种编码。
对初学者来说,one-hot 的概念确实有点绕,不过没关系,如果一遍看不懂,那就多读一遍多理解一下,相信你会搞清楚 one-hot 的。
1、什么是 one-hot 编码
one-hot 编码用于将离散的分类标签转换为二进制向量。
注意这里有两个关键词,第一个是离散的分类,第二个是二进制向量。
-
先说什么是离散的分类?
假设我们要做一个分类任务,总共有3个类别,分别是猫、狗、人。那这三个类别就是一种离散的分类:它们之间互相独立,不存在谁比谁大、谁比谁先、谁比谁后的关系。
像之前说的Mnist手写数字识别中,分类是 0-9 这十个数字。
虽然这 10 个数字是有大小区分的,但对于分类任务来说,数字 0 和数字 1 并不存在大小关系,就好比字母 A 和字母 B 不存在大小关系、苹果和橘子不存在大小关系一样。
它们仅仅是一种类别,只不过手写数字识别任务中,类别刚好是数字。这就是离散分类。
-
再说二进制向量。
向量我们都能理解,[1, 2, 3, 4] 这是一个一维数组,也可以称之为一维向量。那么二进制向量,就是里面的数字都是二进制的,像是[0, 1, 0, 0]。在搞清楚这两个概念之后,我们先回到这个任务本身,需要对猫、狗、人这三个类别进行分类。
在神经网络中,需要一种数学的表示方法,来表示猫、狗、人的分类。
最容易想到的,便是以 0 代表猫,以 1 代表狗,以 2 代表人这种简单粗暴的方式。
那这样行不行呢?肯定不行。
分类标签一个重要的作用,就是要计算预测标签与真实标签之间的相似性,从而计算 loss 值。loss值越小,说明预测标签与真实标签之间越接近。
相似性其实就是两个标签之间的距离。如果按照 0 代表猫, 1 代表狗, 2 代表人这种表示方法,那么猫和狗之间距离为 1, 狗和人之间距离为 1, 而猫和人之间距离为 2。
这在参与损失计算的时候是完全不能接受的:互相独立的标签之间,竟然出现了不对等的情况。
因此,需要有一种表示方法,将互相独立的标签表示为互相独立的数字,并且数字之间的距离也相等。
这就是one-hot,也叫独热编码。
它就用二进制向量来表征这种离散的分类标签。
2、独热编码怎么做?
上表我们竖着看,黄色的代表是猫的编码 [1, 0, 0],浅绿色代表的是狗的编码 [0, 1, 0]。
解释如下:如果一个标签是猫,那么猫对应的位置就是1,狗和人对应的位置就是0,得到一个编码[1, 0, 0]。
这样得到的编码都是独立的。
我们学过几何,在三维坐标系下,[1, 0, 0]、[0, 1, 0]和[0, 0, 1]这三个向量是互相垂直的,也就是互相正交独立。
他们之间距离相等,这就解决了上面说的独立的标签之间,表示方法不对等的情况。
3、独立编码怎么用?
在了解了独热编码是怎么做的之后,那么在神经网络中,它是怎么起作用的呢?
看过Softmax 的底层原理的同学可能还有印象,softmax 激活函数输出一系列概率值,来说明本轮推理属于某一分类的概率是多少。
假设某一轮推理得到的softmax得分如下,有70%的概率是猫,20%的概率是狗,10%的概率是人。
分类 | Softmax得分 |
---|---|
猫 | 0.7 |
狗 | 0.2 |
人 | 0.1 |
对于这一轮的预测结果,需要和真实标签进行对比以获取loss值,假设真实标签就是猫。
而猫的独热编码是[1, 0, 0]。
为了让最终loss值最小,会根据真实标签和预测得分值来调整权重,使得预测得分朝着理想的真实标签靠近。
上图中,猫的得分是0.7,而真实得分是1,因此这一类的得分还需要继续增大,计算完loss值后,反向传播调整权重,使这一类的得分继续增大。
狗和人的得分相反,得分需要继续减小,计算完loss值后,反向传播调整权重,使这一类的得分继续减少。
如果预测得分为[1, 0, 0],那么就和真实标签完全相同,此时的loss值就为0, 就说明本轮训练拟合的很好了。
当然one-hot编码有它的局限性,上面的例子是3分类的例子,那如果分类数量有1万个,我们是不是需要将1万个离散的分类,编码成1万维的向量来计算呢?
这就出现了维度灾难了,而且大量的数据为0,向量稀疏的厉害,此时就需要用其他的优化手段来处理了。
转载自:https://zhuanlan.zhihu.com/p/634296763