嵌入:分类输入数据

分类数据是指表示一组有限选项中的一个或多个离散项的输入特征。例如,它可以是用户观看过的一组影片、文档中的一组字词或者某人的职业。

分类数据的最高效表示方式是稀疏张量(一种含有极少非零元素的张量)。例如,如果我们要构建影片推荐模型,可以为每部可能的影片分配一个唯一 ID,然后通过用户观看的影片的稀疏张量来表示每位用户,如图 3 所示。

影片推荐问题的示例输入。

图 3.影片推荐问题的数据。

图 3 中的矩阵的每一行都表示用户观看影片的历史记录,并以稀疏张量的形式表示,因为每个用户只会观看所有可能的影片中的一小部分。最后一行使用稀疏张量 [1, 3, 999999],它使用电影图标上方显示的词汇表索引。

同样,也可以将字词、句子和文档表示为稀疏向量,词汇表中的各个字词所扮演的角色与推荐示例中的电影相似。

为了在机器学习系统中使用此类表示法,我们需要将每个稀疏向量表示为数字向量,使语义上相似的项(影片或字词)在向量空间中具有相似的距离。但是,如何将字词表示为数字矢量?

最简单的方法是定义一个巨型输入层,为词汇表中的每个字词定义一个节点,或者为数据中出现的每个字词定义一个节点。如果您的数据中出现了 50 万个唯一字词,您可以使用长度为 50 万的向量表示一个字词,并将每个字词分配给向量中一个槽位。

如果您将“马”分配给索引 1247,那么将“马”馈入到您的网络中,就可以将 1 复制到第 1247 个输入节点中,将 0 复制到其余节点中。这种表示法称为独热编码,因为只有一个索引具有非零值。

更常见的是,矢量可能包含较大文本块中的单词数。这就是我们所说的“词袋”。在词袋向量中,50 万个节点中的几个节点具有非零值。

不过,无论您如何确定非零值,每个字词一个节点会为您提供非常稀疏的输入向量(非常大的向量,非零值相对较少)。稀疏表示法存在一些问题,这些问题可能导致模型难以有效学习。

网络规模

巨大的输入向量意味着神经网络拥有大量的权重。如果您的词汇表中有 M 个字词,而网络第一层的输入中有 N 个节点,您便需要为该层训练 MxN 个权重。大量的权重会导致更多问题:

  • 数据量:模型中的权重越多,您需要有效训练的数据就越多。

  • 计算量:权重越多,训练和使用模型所需的计算就越多。很容易超出硬件的功能。

矢量之间缺乏有意义的关系

如果您将 RGB 通道的像素值馈送到图像分类器中,就应该谈论“关闭”值。无论是在语义上,还是在矢量之间的几何距离,红蓝色都接近纯蓝色。但是,对于“马术”,索引“1247”处为 1 的矢量与“无线电”索引为 1 且值为 1 的矢量相比,更接近一个索引为 50430 的矢量。

解决方案:嵌入

这些问题的解决方法是使用嵌入,它会将大型稀疏向量转换为保留语义关系的低维空间。我们将在本单元的下一部分中直观地从概念、概念和编程角度探索嵌入。