神经网络嵌入的解释,非常有用的东西,一看就明白!

作者:Will Koehrsen
编译:ronghuaiyang
来源: AI公园(AI_Paradise)

深度学习的一个显著成功应用是嵌入,这是一种将离散变量表示为连续向量的方法。这项技术已经有了实际的应用,其中有在机器翻译中使用词嵌入和类别变量中使用实体嵌入。

近年来,神经网络在图像分割、自然语言处理、时间序列预测等方面的应用有了很大的发展。深度学习的一个显著成功应用是嵌入,这是一种将离散变量表示为连续向量的方法。这项技术已经有了实际的应用,其中有在机器翻译中使用词嵌入和类别变量中使用实体嵌。

在本文中,我将解释什么是神经网络嵌入,为什么要使用它们,以及如何学习它们。我们会在真正的问题的上下文中讨论这些概念:将Wikipedia上的所有图书表示为向量,并创建图书推荐系统。


Wikipedia上所有书的神经网络嵌入

嵌入

嵌入是一个从离散变量到连续数字向量的映射。在神经网络的上下文中,embeddings是低维的, 离散变量用学习到的连续向量表示。神经网络嵌入是有用的,因为它们可以减少类别变量的维数,并有意义地在转换空间中表示类别。

神经网络嵌入有3个主要目的:

① 在嵌入空间中查找最近的邻居。这些邻居可以用于根据用户兴趣或聚类类别提出建议。

② 作为监督任务的机器学习模型的输入。

③ 用于概念的可视化和类别之间的关系的可视化。

这意味着在图书项目中,使用神经网络嵌入,我们可以把维基百科上所有的37000篇图书文章,用一个具有50个数字的向量来表示每一篇文章。此外,由于嵌入式是学习的,在我们的学习问题上下文中更相似的书籍在嵌入式空间中更接近。

神经网络嵌入克服了用独热编码表示分类变量的两个局限性:

独热编码的局限性

独热编码类别变量的操作实际上是一个简单的嵌入,其中每个类别都映射到一个不同的向量。这个过程采用离散实体,并将每个观察结果映射到一个只有一个1的向量中。

独热编码技术有两个主要缺点:

① 对于高基数变量—那些具有许多类别的变量—转换之后向量的维数变得太大了。

② 这种映射是完全没有监督的:“相似”的类别在嵌入空间中并没有彼此放置得更靠近。

第一个问题很好理解:对于每个额外的类别(称为实体),我们必须向一个热编码向量添加另一个数字。如果我们在Wikipedia上有37000本书,那么表示这些书需要为每本书提供37000维的向量,这使得针对这种表示的任何机器学习模型的训练都是不可行的。

第二个问题同样是有局限的:独热编码不会将相似的实体彼此靠近的放在向量空间中。如果我们使用余弦距离来度量向量之间的相似性,那么经过独热编码后,实体之间的相似性为0。

这意味着,《战争与和平》和《安娜•卡列尼娜》(这两本书都是列夫•托尔斯泰(Leo Tolstoy)的经典著作)这样的实体彼此之间的距离,并不比《战争与和平》与《银河系漫游指南》之间的距离更近。

  1. # One Hot Encoding Categoricals

  2. books = ["War and Peace", "Anna Karenina",

  3. "The Hitchhiker's Guide to the Galaxy"]

  4. books_encoded = [[1, 0, 0],

  5. [0, 1, 0],

  6. [0, 0, 1]]

  7. Similarity (dot product) between First and Second = 0

  8. Similarity (dot product) between Second and Third = 0

  9. Similarity (dot product) between First and Third = 0

考虑到这两个问题,表示类别变量的理想解决方案是需要更少的数字,而不是类别的数量,并且将类似的类别放在更靠近的位置。

  1. # Idealized Representation of Embedding

  2. books = ["War and Peace", "Anna Karenina",

  3. "The Hitchhiker's Guide to the Galaxy"]

  4. books_encoded_ideal = [[0.53, 0.85],

  5. [0.60, 0.80],

  6. [-0.78, -0.62]]

  7. Similarity (dot product) between First and Second = 0.99

  8. Similarity (dot product) between Second and Third = -0.94

  9. Similarity (dot product) between First and Third = -0.97

为了更好地表示类别实体,我们可以使用嵌入神经网络和监督任务来学习嵌入。

学习嵌入

使用one-hot编码的主要问题是转换不依赖于任何监督。我们可以通过在有监督的任务中使用神经网络来学习嵌入,从而大大改进嵌入。嵌入形成参数—网络的权重—经过调整以最小化任务上的损失。得到的嵌入向量表示类别,其中相似的类别(相对于任务)彼此更接近。

例如,如果我们有一个包含50,000个单词的电影评论集合,我们可以使用一个训练好的嵌入式神经网络来预测评论是的情感,从而为每个单词学习100维的嵌入。词汇表中与正面评价相关的单词,如“brilliant”或“excellent”,将在嵌入空间中出现得更近,因为网络已经了解到它们都与正面评价相关。

电影句子中的词嵌入

在上面给出的书的例子中,我们的监督任务可以是“确定一本书是否是列夫·托尔斯泰写的”,由此产生的嵌入将使托尔斯泰写的书彼此更接近。解决如何创建监督任务来生成相关表示的问题是嵌入过程中最困难的部分。

实现

在Wikipedia book项目中,监督学习任务被设置为预测一本书的文章中是否出现了指向Wikipedia页面的给定链接。我们提供成对的(书名、链接)训练示例,其中混合了正样本对和负样本对。这种设置基于这样的假设,即链接到类似Wikipedia页面的书籍彼此相似。因此,由此产生的嵌入应该将类似的书籍更紧密地放置在向量空间中。

我使用的网络有两个平行的嵌入层,分别映射书和wikilink,用来区分50维向量,还有一个点积层,将嵌入的内容组合成一个数字,用于预测。嵌入是网络的参数或权重,在训练过程中进行调整,以最小化监督任务的损失。

在Keras代码中,这看起来像这样(如果你不完全理解代码,不要担心,直接跳到图像):

  1. # Both inputs are 1-dimensional

  2. book = Input(name = 'book', shape = [1])

  3. link = Input(name = 'link', shape = [1])


  4. # Embedding the book (shape will be (None, 1, 50))

  5. book_embedding = Embedding(name = 'book_embedding',

  6. input_dim = len(book_index),

  7. output_dim = embedding_size)(book)


  8. # Embedding the link (shape will be (None, 1, 50))

  9. link_embedding = Embedding(name = 'link_embedding',

  10. input_dim = len(link_index),

  11. output_dim = embedding_size)(link)


  12. # Merge the layers with a dot product along the second axis (shape will be (None, 1, 1))

  13. merged = Dot(name = 'dot_product', normalize = True, axes = 2)([book_embedding, link_embedding])


  14. # Reshape to be a single number (shape will be (None, 1))

  15. merged = Reshape(target_shape = [1])(merged)


  16. # Output neuron

  17. out = Dense(1, activation = 'sigmoid')(merged)

  18. model = Model(inputs = [book, link], outputs = out)


  19. # Minimize binary cross entropy

  20. model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

虽然在有监督的机器学习任务中,目标通常是训练一个模型对新数据进行预测,但在这个嵌入模型中,预测只是达到目的的一种手段。我们想要的是嵌入权值,将书籍和链接表示为连续向量。

嵌入本身并不那么有趣,它们只是数字的向量:

来自书籍推荐嵌入模型的示例嵌入

然而,嵌入可以用于前面列出的3个目的,对于这个项目,我们主要感兴趣的是推荐基于最近邻的书籍。为了计算相似性,我们取一本书进行查询,找到它的向量与其他所有图书向量的点积。(如果我们的嵌入是标准化的,那么这个点积就是向量之间的cos距离,范围从-1(最不相似)到+1(最相似)。我们也可以用欧氏距离来度量相似性。

这是我建立的图书嵌入模型的输出:

  1. Books closest to War and Peace.

  2. Book: War and Peace Similarity: 1.0

  3. Book: Anna Karenina Similarity: 0.79

  4. Book: The Master and Margarita Similarity: 0.77

  5. Book: Doctor Zhivago (novel) Similarity: 0.76

  6. Book: Dead Souls Similarity: 0.75

(向量与自身的余弦相似度必须为1.0)。经过降维(见下图),可以得到如下图:

书的嵌入以及最近的邻居

我们可以清楚地看到学习嵌入的价值!现在,维基百科上每一本书都有一个50个数字的向量表示,相似的书彼此之间距离更近。

嵌入可视化

嵌入的最酷的部分之一是,它们可以用来可视化概念,例如“小说”或“非小说”之间的关系。这需要进一步的降维技术来将维度降为2或3。最常用的约简方法本身就是一种嵌入方法:t分布随机邻接嵌入(TSNE)。

我们可以把维基百科上所有书籍的37000个原始维度,用神经网络嵌入将它们映射到50个维度,然后用TSNE将它们映射到2个维度。结果如下:

在Wikipedia上的所有37000本书的嵌入

(TSNE是一种流形学习技术,这意味着它试图将高维数据映射到低维流形,创建一个试图维护数据内部局部结构的嵌入。它几乎只用于可视化,因为输出是随机的,不支持转换新数据。一个正在兴起的替代方案是统一流形近似和投影,UMAP,它更快,并且支持将新数据转换到嵌入空间中)。

这本身并不是很有用,但是一旦我们开始根据不同的书的特点给它上色,它就会变得很有洞察力。

用流派对嵌入上色

我们可以清楚地看到属于同一类型的书籍的分组。这并不完美,但仍然令人印象深刻的是,我们可以用两个数字来表示维基百科上的所有书籍,这两个数字仍然能够捕捉到不同类型之间的差异。

书的例子(即将发表的完整文章)展示了神经网络嵌入的价值:我们有一个类别对象的向量表示,它是低维的,并且在嵌入空间中将相似的实体彼此放置得更近。

交互式可视化

静态图的问题是,我们不能真正地研究数据并研究变量之间的分组或关系。为了解决这个问题,TensorFlow开发了projector,这是一个在线应用程序,可以让我们可视化并与嵌入进行交互。我将很快发布一篇关于如何使用这个工具的文章,但是现在,结果如下:

使用projector交互式探索书籍嵌入

结论

神经网络嵌入是学习离散数据作为连续向量的低维表示。这些嵌入克服了传统编码方法的限制,可以用于查找最近的邻居、输入到另一个模型和可视化。

虽然很多深度学习的概念都是在学术术语中讨论的,但是神经网络嵌入既直观又相对容易实现。我坚信任何人都可以学习深度学习并使用Keras这样的库构建深度学习解决方案。嵌入是处理离散变量的有效工具,是深度学习的一个有用应用。

英文原文:https://towardsdatascience.com/neural-network-embeddings-explained-4d028...
本文转自:微信号 - AI公园,原作者:Will Koehrsen,编译:ronghuaiyang,转载此文目的在于传递更多信息,版权归原作者所有。

最新文章