赞
踩
分类数据是指用于表示一组有限选项中的一个或多个离散项的输入特征。例如,它可以是某用户观看过的一组影片,某文档中使用的一系列单词,或某人从事的职业。
分类数据的最高效表示方式是使用稀疏张量(sparse tensors)(一种含有极少非零元素的张量)。例如,如果要构建一个影片推荐模型,可以为每部可能的影片分别分配一个唯一的 ID,然后通过用户已观看影片的稀疏张量来表示每位用户:
在图 3 的矩阵中,每一行都是一个显示用户的影片观看记录的样本,并以稀疏张量的形式表示,因为每个用户只会观看所有可能的影片中的一小部分。根据影片图标上方所示的索引,最后一行对应于稀疏张量 [1, 3, 999999]。
类似地,我们还可将字词、句子和文档表示为稀疏矢量 - 在这种情况下,词汇表内每个字词所扮演的角色类似于推荐示例中的影片。
为了能够在机器学习系统中使用这类表示法,我们需要将每个稀疏矢量表示为数字矢量,从而使语义上相似的项(影片或字词)在矢量空间中具有相似的距离。但如何将字词表示为数字矢量呢?
最简单的方法是:定义一个巨型输入层,并在其中为词汇表内的每个字词设定一个节点,或者至少为您数据中出现的每个字词设定一个节点。如果您的数据中出现了 50 万个独一无二的单词,您可以使用长度为 50 万的矢量来表示每个单词,并将每个字词分配到相应矢量中对应的索引位置。
如果为“马”分配的索引是 1247,那么为了将“马”馈入到您的网络中,可以将第 1247 个输入节点设成 1,其余节点设成 0。这种表示法称为独热编码 (one-hot encoding),因为只有一个索引具有非零值。
更常见的是,使用一个包含各个单词在大块文本中出现次数的向量。这被称为“词袋”(bag of words) 表示法。在一个词袋矢量中,50 万个节点中的若干个节点将会具有非零值。
不过,无论您如何确定非零值,若将节点与字词一一对应,您得到的输入矢量就会比较稀疏 - 即:矢量很大,但非零值相对较少。稀疏表示法存在多项问题(如下所述),这些问题可能会致使模型很难高效地学习。
巨型输入矢量意味着神经网络的对应权重数目会极其庞大。如果您的词汇表内有 M 个字词,而神经网络输入层上方的第一层内有 N 个节点,您便需要为该层训练 MxN 个权重。权重数目过大会进一步引发以下问题
如果您已将 RGB 通道的像素值馈入到图片分类器中,分析“邻近”值便行得通。不管是从语义上来看,还是从矢量之间的几何距离来看,红蓝色与纯蓝色都是邻近的。不过,对于在索引 1247 处设为 1 以表示“马”的矢量而言,如果说它与在索引 238 处设为 1 以表示“电视机”的矢量不够邻近,那么它与在索引 50430 处设为 1 以表示“羚羊”的矢量亦然。(其实就是太多了,马和羚羊本来应该距离很近但是变得不容易表示)
上述问题的解决方案就是使用嵌套,也就是将大型稀疏矢量映射到一个保留语义关系的低维空间。在此模块的随后几个部分中,我们将从直观角度、概念角度和编程角度来详细探讨嵌套。
要解决稀疏输入数据的核心问题,您可以将高维度数据映射到低维度空间。
即便是小型多维空间,也能自由地将语义上相似的项归到一起,并将相异项分开。矢量空间中的位置(距离和方向)可对良好的嵌套中的语义进行编码。例如,下面的真实嵌套可视化图所展示的几何关系图捕获了国家与其首都之间的语义关系。
借助这种有意义的空间,机器学习系统能够检测出对学习任务可能有帮助的模式。
嵌套是一个矩阵,每列表示您词汇中的一项所对应的矢量。要获得某个词汇项的密集矢量,您可以检索该项所对应的列。
但是,如何转换字词矢量的稀疏包呢?要获得表示多个词汇项(例如,一句或一段中的所有字词)的稀疏矢量的密集矢量,您可以检索各项的嵌套,然后将它们相加。
如果稀疏矢量包含词汇项的计数,则您可以将每项嵌套与其对应项的计数相乘,然后再求和。
这些运算可能看起来很眼熟吧。
我们刚刚阐述的查询、乘法和加法程序等效于矩阵乘法。假设有一个 1 X N 的稀疏表示 S 和一个 N X M 的嵌套表 E,矩阵乘法 S X E 可以得出密集矢量 1 X M。
但首要问题是,如何获取 E 呢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。