机器学习入门17 - 嵌套 (Embedding)

原文链接:https://developers.google.com/machine-learning/crash-course/embeddings/

嵌套是一种相对低维的空间,可以将高维矢量映射到这种低维空间里。
通过使用嵌套,可以让在大型输入(比如代表字词的稀疏矢量)上进行机器学习变得更加容易。
在理想情况下,嵌套可以将语义上相似的不同输入映射到嵌套空间里的邻近处,以此来捕获输入的语义。
一个模型学习到的嵌套,也可以被其他模型重用。

1- 协同过滤的目的

协同过滤是一项可以预测用户兴趣(根据很多其他用户的兴趣)的任务。

以影片推荐的任务为例,首先要确定哪些影片是相似的。
可以通过将影片嵌套到低维空间(使得相似的影片彼此邻近)来实现这个目标。
也就是说,将这些影片映射到一个嵌套空间,其中的每个字词都由一组二维坐标来表示。
通常情况下,在学习 d 维嵌套时,每部影片都由 d个实值数字表示,其中每个数字都分别表示在一个维度中的坐标。

可以为每个维度指定了名称。
在学习嵌套时,每个维度的学习跟它们的名字无关。
通常,每个此类维度都称为一个潜在维度,因为它代表的特征没有明确显示在数据中,而是要根据数据推断得出。
最终,真正有意义的是嵌套空间中各个影片之间的距离,而不是单个影片在任意指定维度上的坐标。

2- 分类输入数据

继续以影片推荐的任务为例,分类数据可以是某用户观看过的一组影片,某文档中使用的一系列单词,或某人从事的职业。
如果要构建一个影片推荐模型,可以为每部可能的影片分别分配一个唯一的 ID,然后通过用户已观看影片的稀疏张量来表示每位用户。
由此可知,分类数据是指用于表示一组有限选项中的一个或多个离散项的输入特征,通常使用稀疏张量(一种含有极少非零元素的张量)来表示。
为了能够在机器学习系统中使用这类表示法,需要将每个稀疏矢量表示为数字矢量,从而使语义上相似的项(影片或字词)在矢量空间中具有相似的距离。

如何将字词表示为数字矢量呢?

  • - 独热编码(one-hot encoding,只有一个索引具有非零值)
  • - 词袋”(bag of words) 表示法:使用一个包含各个单词在大块文本中出现次数的向量

不过,无论如何确定非零值,若将节点与字词一一对应,得到的输入矢量就会比较稀疏 - 即:矢量很大,但非零值相对较少。

稀疏表示法存在多项问题可能会致使模型很难高效地学习。

网络的对应权重数目过大
巨型输入矢量意味着神经网络的对应权重数目会极其庞大,会进一步引发以下问题:

  • 数据量:模型中的权重越多,高效训练所需的数据就越多。
  • 计算量:权重越多,训练和使用模型所需的计算就越多。这很容易就会超出硬件的能力范围。

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

3- 转换到低维度空间

通过使用嵌套(将高维度数据映射到低维度空间)可以解决上述稀疏输入数据的核心问题,
也就是将大型稀疏矢量映射到一个保留语义关系的低维空间。
即便是小型多维空间,也能自由地将语义上相似的项归到一起,并将相异项分开。   
借助这种多维空间(嵌套),机器学习系统能够检测出对学习任务可能有帮助的模式:

  • 收缩网络:以更小的嵌套空间来更快速地训练系统。实用嵌套的量级大致有数百个维度。
  • 嵌套充当查询表
  • 嵌套查询充当矩阵乘法

4- 获取嵌套

可以通过多种方式来获取嵌套:
标准降维技术

目前有很多在低维空间捕获高维空间重要结构的数学技术。
理论上,这些技术都可以用来创建用于机器学习系统的嵌套。
例如,主成分分析 (PCA) 已用于创建字词嵌套。
在给定一组实例的情况下,例如字词矢量包,PCA 会尝试查找高度相关且可以合并的维度。

Word2vec

Word2vec 是 Google 为了训练字词嵌套而研发的一种算法。
Word2vec 基于分布假设,将语义上相似的字词映射到在几何图形上邻近的嵌套矢量。
分布假设指出经常具有相同相邻字词的字词往往在语义上相似。
Word2Vec 通过训练神经网络来区分实际共同出现的多组字词与随机出现在一起的字词,从而充分利用此类上下文信息。
字词的向量表示法-word2vec模型:https://www.tensorflow.org/tutorials/word2vec/index.html

将嵌套训练为大型模型的一部分

也可以将嵌套作为目标任务的神经网络的一部分进行学习。
通过这个方法,可以为自己的特定系统量身定制嵌套,不过耗费的时间可能要比单独训练嵌套的时间长。

5- 练习

xxx

6- 关键词

输入层 (input layer)
神经网络中的第一层(接收输入数据的层)。

独热编码 (one-hot encoding)
一种稀疏向量,其中:
一个元素设为 1。
所有其他元素均设为 0。
独热编码常用于表示拥有有限个可能值的字符串或标识符。
例如,假设某个指定的植物学数据集记录了 15000 个不同的物种,其中每个物种都用独一无二的字符串标识符来表示。
在特征工程过程中,您可能需要将这些字符串标识符编码为独热向量,向量的大小为 15000。

稀疏特征 (sparse feature)
一种特征向量,其中的大多数值都为 0 或为空。
例如,某个向量包含一个为 1 的值和一百万个为 0 的值,则该向量就属于稀疏向量。
再举一个例子,搜索查询中的单词也可能属于稀疏特征 - 在某种指定语言中有很多可能的单词,但在某个指定的查询中仅包含其中几个。
与密集特征相对。

嵌套 (embeddings)
一种分类特征,以连续值特征表示。
通常,嵌套是指将高维度向量映射到低维度的空间。
例如,您可以采用以下两种方式之一来表示英文句子中的单词:

1- 表示成包含百万个元素(高维度)的稀疏向量,其中所有元素都是整数。
向量中的每个单元格都表示一个单独的英文单词,单元格中的值表示相应单词在句子中出现的次数。
由于单个英文句子包含的单词不太可能超过 50 个,因此向量中几乎每个单元格都包含 0。
少数非 0 的单元格中将包含一个非常小的整数(通常为 1),该整数表示相应单词在句子中出现的次数。

2- 表示成包含数百个元素(低维度)的密集向量,其中每个元素都存储一个介于 0 到 1 之间的浮点值。这就是一种嵌套。

在 TensorFlow 中,会按反向传播损失训练嵌套,和训练神经网络中的任何其他参数一样。

 

posted @ 2019-02-02 23:16  Anliven  阅读(3480)  评论(0编辑  收藏  举报