William Koehrsen作者

神经网络词嵌入:如何将《战争与和平》表示成一个向量?

深度学习可以怎样将《战争与和平》表示成一个向量?借助神经网络嵌入就能实现。神经网络嵌入是很多机器学习语言处理应用的基础性技术之一,Feature Labs 的数据科学家 William Koehrsen 通过一个基于维基百科的书籍推荐项目对词嵌入进行了介绍。

项目地址:https://github.com/WillKoehrsen/wikipedia-data-science/blob/master/notebooks/Book%20Recommendation%20System.ipynb

最近几年,神经网络的应用范围已经从图像分割显著扩展到了自然语言处理以及时间序列预测领域。深度学习一大显著成功的用途是嵌入(embedding),这是一种可用于将离散变量表示成连续向量的方法。这项技术的实际应用包括用于机器翻译词嵌入和用于类别变量的实体嵌入。

在这篇文章中,我将解释神经网络嵌入的定义,我们使用它们的原因,以及它们的学习方式。我将在我正在研究的一个真实问题的背景中介绍这些概念:将维基百科上的所有书籍都表示成向量以创建一个书籍推荐系统

维基百科上所有书籍的神经网络嵌入

嵌入

嵌入是离散的(类别化的)变量向连续数值向量的映射。在神经网络语境中,嵌入是离散变量的低维度的学习得到的连续向量表示。神经网络嵌入很有用,因为它们可以降低类别化变量的维度以及能够在变换后的空间中有意义地表示类别。

神经网络嵌入有三个主要用途:

  1. 寻找嵌入空间中的最近邻。这可被用于基于用户兴趣或聚类类别来进行推荐;

  2. 可作为机器学习模型的输入来学习监督式任务;

  3. 可实现概念和类别之间的关系的可视化。

对于我们的书籍项目,这就意味着我们可以使用神经网络嵌入将维基百科上的 37000 篇书籍文章都各自表示成一个仅具有 50 个数字的向量。此外,因为嵌入是学习得到的,所以对于我们的学习问题而言,更相似的书籍在这个嵌入空间中具有更接近的位置。

神经网络嵌入能够克服常用的类别变量表示方法 one-hot 编码的两大局限。

one-hot 编码的局限

one-hot 编码的类别变量的操作实际上是一种简单的嵌入,其中每个类别都被映射成了不同的向量。其过程是将离散的实体的每个观察都映射成由一定数量的 0 和单个 1 构成的向量,这个 1 指示了特定的类别。

one-hot 编码技术具有两大主要缺陷:

  1. 对于高基数变量(即有很多特有类别的变量),变换得到的向量的维度将难以掌控。

  2. 这种映射方式信息完全不充分:「近似」的类别在嵌入空间中并不处于相近的位置。

第一个问题很容易理解:每增加一个类别(成为实体),我们都必须为 one-hot 编码的向量增加一个数。如果我们有维基百科上的 37000 本书,那么表示它们就将需要 37000 维的向量,基于这种表示方式训练任何机器学习模型都难以实现。

第二个问题具有同等的局限性:one-hot 编码并不会将相似的实体放在向量空间中相近的位置。如果使用余弦距离来衡量向量之间的相似性,那么在经过 one-hot 编码后,每一对比较的实体之间的相似度都是零。

这意味着,如果我们使用 one-hot 编码,《战争与和平》与《安娜·卡列尼娜》这样的实体(都是列夫·托尔斯泰的经典著作)不会比《战争与和平》与《银河系漫游指南》之间的距离更近。

# One Hot Encoding Categoricals
books = ["War and Peace", "Anna Karenina", 
          "The Hitchhiker's Guide to the Galaxy"]
books_encoded = [[1, 0, 0],
                 [0, 1, 0],
                 [0, 0, 1]]
Similarity (dot product) between First and Second = 0
Similarity (dot product) between Second and Third = 0
Similarity (dot product) between First and Third = 0

考虑到这两个问题,则表示类别变量的理想方案是数字量比特有类别的数量更少,而且相似的类别能具有更近的距离。

# Idealized Representation of Embedding
books = ["War and Peace", "Anna Karenina", 
          "The Hitchhiker's Guide to the Galaxy"]
books_encoded_ideal = [[0.53,  0.85],
                       [0.60,  0.80],
                       [-0.78, -0.62]]
Similarity (dot product) between First and Second = 0.99
Similarity (dot product) between Second and Third = -0.94
Similarity (dot product) between First and Third = -0.97

为了构建一种更好的类别实体表征,我们可以使用嵌入神经网络和学习嵌入的监督式网络。

学习嵌入

one-hot 编码的主要问题是其变换并不依赖于任何监督。通过在一个监督任务上使用神经网络来学习它们,我们可以对嵌入实现极大的提升。这些嵌入会构成网络的参数权重),这些参数会得到调整以最小化在任务上的损失。所得到的嵌入向量是类别的表征,其中相似的任务(相对任务而言)的距离更近。

举个例子,如果我们有一个包含 50000 个词的电影评论汇集的词汇库,我们可以使用一个嵌入神经网络来为每个词学习 100 维的嵌入,训练目的是预测这些评论的情绪。(这个应用的详情请参阅:https://goo.gl/6rxG11)在这个词汇库中,「出色」和「很赞」这样积极的评论词会处于嵌入空间中更近的位置,因为网络已经学习到这些词都与积极评论相关。

电影情绪词嵌入

在上面提到的书籍案例中,我们的监督式任务会变成「识别一本书是否是列夫·托尔斯泰写的」,而由列夫·托尔斯泰写的书的嵌入会更近。找到如何创建监督式任务以得出相关表征的方法是嵌入设计中最困难的部分。

实现

在维基百科书籍项目中,监督学习任务的目标是预测给定维基百科页面的链接是否出现在了描述某本书的文章中。我们输入的数据是包含正例和负例的训练样本对(书籍题目,链接)。这种设置方式基于这样一个假设:链接到相似维基百科页面的书籍彼此更加相似。因此所得到的嵌入也应该在向量空间中将相似的数据放置在更相近的位置。

我使用的网络有两个并行的嵌入层,它们会将书籍和维基链接分别映射成 50 维的向量,另外还有一个点积层将这些嵌入结合成单个数值以供预测。这些嵌入是网络的参数,或者说权重,可以在训练过程中调整以最小化在该监督式任务上的损失。

用 Keras 代码表示就像是下面这样(看不懂代码也不要紧,可以直接跳过去看后面的图片):

# Both inputs are 1-dimensional
book = Input(name = 'book', shape = [1])
link = Input(name = 'link', shape = [1])

# Embedding the book (shape will be (None, 1, 50))
book_embedding = Embedding(name = 'book_embedding',
                           input_dim = len(book_index),
                           output_dim = embedding_size)(book)

# Embedding the link (shape will be (None, 1, 50))
link_embedding = Embedding(name = 'link_embedding',
                           input_dim = len(link_index),
                           output_dim = embedding_size)(link)

# Merge the layers with a dot product along the second axis (shape will be (None, 1, 1))
merged = Dot(name = 'dot_product', normalize = True, axes = 2)([book_embedding, link_embedding])

# Reshape to be a single number (shape will be (None, 1))
merged = Reshape(target_shape = [1])(merged)

# Output neuron
out = Dense(1, activation = 'sigmoid')(merged)
model = Model(inputs = [book, link], outputs = out)

# Minimize binary cross entropy
model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

尽管监督式机器学习任务的目标通常是训练一个模型来在新数据上进行预测,但在这个嵌入模型中,预测本身仅仅是实现最终目的的一种方式。我们想要的是嵌入权重,即作为连续向量的书籍和链接表示。

嵌入本身并不是那么有趣:它们都只是些数值的向量:

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

但是,这些嵌入也可被用于之前列出的三个目的;对于这个项目,我们主要感兴趣的是基于最近邻推荐书籍。为了计算相似度,我们取一个查询书籍,然后得出其向量与所有其它书籍的向量之间的点积。(如果我们的嵌入经过了归一化,那么这个点积就是向量之间的余弦距离,其范围从最不相似的 -1 到最相似的 +1。我们也可以使用欧几里德距离来衡量相似度。)

下面给出了我构建的书籍嵌入模型的输出结果:

Books closest to War and Peace.
Book: War and Peace              Similarity: 1.0
Book: Anna Karenina              Similarity: 0.79
Book: The Master and Margarita   Similarity: 0.77
Book: Doctor Zhivago (novel)     Similarity: 0.76
Book: Dead Souls                 Similarity: 0.75

(一个向量与其自身的余弦相似度肯定是 1.0)。经过一定的降维之后,我们可以得到下面的图像:

与最近邻一起的嵌入书籍

我们可以清楚地看到学习嵌入的价值!现在,对于维基百科上的每一本书,我们都有一个 50 数字的表示,其中更相似的书籍也彼此更接近。

嵌入可视化

嵌入最值得关注的一大优势是它们可被用于概念的可视化,比如小说与非小说之间的相对性。这需要进一步的降维技术将维度降至二或三维。最流行的降维技术本身也是一种嵌入方法:t-分布随机近邻嵌入(TSNE)。

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

维基百科上所有 37000 本书的嵌入

(TSNE 是一种流形学习技术,也就是说它会试图将高维数据映射成更低维度的流形,这个过程中会创建一个嵌入来维持数据中的局部结构。这基本上只在可视化时使用,因为其输出是随机的,不支持转换成新数据。另一种正在迅猛发展的新方法是统一流形近似和投影/UMAP,它的速度要快得多,而且也支持转换成嵌入空间中的新数据。)

这些可视化本身并不非常有用,但如果我们根据不同的书籍类型给它加上颜色,就能看出一些见解了。

根据书籍类型上色后的嵌入

可以清楚看到,书籍根据各自不同的类型聚集在了一起。这并不完美,但仍然让人印象深刻,毕竟我们仅用 2 个数字就表示了维基百科上的所有书籍,而且这种表示方法还能展现出不同类型之间的差异。

这个书籍项目示例表明了神经网络嵌入的价值:我们能得到分类目标的向量表示,这个向量表示是低维的,并且相似的实体在嵌入空间中处于相近的位置。

额外奖励:交互式可视化

静态图表的问题是我们不能真正地探索数据以及研究变量之间的分组和关系。为了解决这个问题,TensorFlow 开发了 projector:https://projector.tensorflow.org/,这是一个让我们可以可视化嵌入并与之交互的在线应用。我后面会写一篇文章介绍使用这一工具的方法,但这里我们看看结果就好:

使用 projector 实现对书籍嵌入的交互式探索

总结

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

尽管本文用一些学术术语谈到了很多深度学习概念,但神经网络嵌入很直观而且实现方法也相对简单。我确信任何人都可以学会深度学习,并且使用 Keras 这样的库来构建深度学习解决方案。嵌入是一种能有效处理离散变量的工具,是深度学习的一个很有价值的应用。

资源

  • 谷歌的嵌入教程:https://developers.google.com/machine-learning/crash-course/embeddings/video-lecture

  • TensorFlow 的嵌入指南:https://www.tensorflow.org/guide/embedding

  • 使用嵌入的书籍推荐系统:https://github.com/WillKoehrsen/wikipedia-data-science/blob/master/notebooks/Book%20Recommendation%20System.ipynb

  • Keras 词嵌入教程:https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/

原文链接:https://towardsdatascience.com/neural-network-embeddings-explained-4d028e6f0526

工程文本处理NLP可视化词嵌入神经网络
2
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

推荐系统技术

推荐系统(RS)主要是指应用协同智能(collaborative intelligence)做推荐的技术。推荐系统的两大主流类型是基于内容的推荐系统和协同过滤(Collaborative Filtering)。另外还有基于知识的推荐系统(包括基于本体和基于案例的推荐系统)是一类特殊的推荐系统,这类系统更加注重知识表征和推理。

机器翻译技术

机器翻译(MT)是利用机器的力量「自动将一种自然语言(源语言)的文本翻译成另一种语言(目标语言)」。机器翻译方法通常可分成三大类:基于规则的机器翻译(RBMT)、统计机器翻译(SMT)和神经机器翻译(NMT)。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

监督学习技术

监督式学习(Supervised learning),是机器学习中的一个方法,可以由标记好的训练集中学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。训练集是由一系列的训练范例组成,每个训练范例则由输入对象(通常是向量)和预期输出所组成。函数的输出可以是一个连续的值(称为回归分析),或是预测一个分类标签(称作分类)。

流形学习技术

流形学习(manifold learning)是机器学习、模式识别中的一种方法,在维数约简方面具有广泛的应用。它的主要思想是将高维的数据映射到低维,使该低维的数据能够反映原高维数据的某些本质结构特征。流形学习的前提是有一种假设,即某些高维数据,实际是一种低维的流形结构嵌入在高维空间中。流形学习的目的是将其映射回低维空间中,揭示其本质。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

暂无评论
暂无评论~