文章转载自公众号
机器学习初学者 , 作者 机器学习初学者
自以来,word2vec一直是一种有效的词嵌入的方法,本文把word2vec用图解的方式进行,全篇没有数学公式,非常通俗易懂,推荐初学者阅读。
(原文作者:jalammar,翻译:黄海广)。
备注:这个是另一个版本的翻译,网上也有其它版本的翻译,都是独立完成的。
原文链接:
https://jalammar.github.io/illustrated-word2vec/
这篇文章的代码传到了本站的github:
/fengdu78/machine_learning_beginner/tree/master/word2vec
正文开始
我发现嵌入的概念是机器学习中最迷人的想法之一。如果您曾经使用Siri,Google智能助理,Alexa,谷歌翻译,甚至智能手机键盘进行下一词预测,那么您很有可能从这个已经成为自然语言处理模型核心的想法中受益。在过去的几十年中,使用嵌入技术进行神经模型已有相当大的发展(最近的发展包括BERT和GPT2 等尖端模型的语境化嵌入)。
自以来,Word2vec一直是一种有效创建单词嵌入的方法。除了词嵌入字的方法之外,它的一些概念已经被证明可以在非语言任务中有效地创建推荐引擎和理解顺序数据。比如Airbnb,阿里巴巴,Spotify和Anghami这样的公司都从NLP世界中创造出这一优秀的工具并将其用于生产中,从而为新型推荐引擎提供支持。
我们将讨论嵌入的概念,以及使用word2vec生成嵌入的机制。
让我们从一个例子开始,了解使用向量来表示事物。
您是否知道五个数字(向量)的列表可以代表您的个性?
个性嵌入:你的个性怎么样?
使用0到100的范围表示你的个性(其中0是最内向的,100是最外向的)。
五大人格特质测试,这些测试会问你一个问题列表,然后在很多方面给你打分,内向/外向就是其中之一。
图:测试结果示例。它可以真正告诉你很多关于你自己的事情,并且在学术、个人和职业成功方面都具有预测能力。
假设我的测试得分为38/100。我们可以用这种方式绘制:
让我们将范围切换到从-1到1:
了解一个人,一个维度的信息不够,所以让我们添加另一个维度 - 测试中另一个特征的得分。
你可能不知道每个维度代表什么,但仍然可以从一个人的个性的向量表示中获得了很多有用的信息。
我们现在可以说这个向量部分代表了我的个性。当你想要将另外两个人与我进行比较时,向量化表示的有用性就出现了。在下图中,两个人中哪一个更像我?
处理向量时,计算相似度得分的常用方法是余弦相似度:
一号人物与我的余弦相似度得分高,所以我们的性格比较相似。
然而,两个方面还不足以捕获有关不同人群的足够信息。几十年的心理学研究已经研究了五个主要特征(以及大量的子特征)。所以我们在比较中使用所有五个维度:
我们没法在二维上绘制出来五个维度,这是机器学习中的常见挑战,我们经常需要在更高维度的空间中思考。但好处是余弦相似度仍然有效。它适用于任意数量的维度:
嵌入的两个中心思想:
我们可以将人(事物)表示为数字的向量。我们可以很容易地计算出相似的向量彼此之间的关系。
词嵌入
我们导入在维基百科上训练的GloVe向量:
import gensimimport gensim.downloader as apimodel = api.load('glove-wiki-gigaword-50')
model["king"]#查看“king”最相似的单词
[('prince', 0.8236179351806641), ('queen', 0.7839042544364929), ('ii', 0.7746230363845825), ('emperor', 0.7736247181892395), ('son', 0.766719400882721), ('uncle', 0.7627150416374207), ('kingdom', 0.7542160749435425), ('throne', 0.7539913654327393), ('brother', 0.7492411136627197), ('ruler', 0.7434253096580505)]
这是一个包含50个数字的列表,我们无法说清楚里面的值代表什么。我们把所有这些数字放在一行,以便我们可以比较其他单词向量。让我们根据它们的值对单元格进行颜色编码(如果它们接近2则为红色,如果它们接近0则为白色,如果它们接近-2则为蓝色)
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as npplt.figure(figsize=(15, 1))sns.heatmap([model["king"]], xticklabels=False, yticklabels=False, cbar=False, vmin=-2, vmax=2, linewidths=0.7)plt.show()
我们将忽略数字并仅查看颜色以指示单元格的值,我们将“King”与其他词语进行对比:
plt.figure(figsize=(15, 4))sns.heatmap([ model["king"], model["man"], model["woman"], model["king"] - model["man"] + model["woman"], model["queen"],], cbar=True, xticklabels=False, yticklabels=False, linewidths=1)plt.show()
看看“man”和“woman”是如何彼此更相似的,他们中的任何一个都是“king”?这告诉你一些事情。这些向量表示捕获了这些单词的信息/含义/关联。
这是另一个示例列表(通过垂直扫描列来查找具有相似颜色的列):
有几点需要指出:
所有这些不同的单词都有一个直的红色列。它们在这个维度上是相似的(我们不知道每个维度代码是什么)你可以看到“woman”和“girl”在很多地方是如何相似的。与“man”和“boy”一样“boy”和“girl”也有彼此相似的地方,但与“woman”或“man”不同。这些是否可以编写一个模糊的青年概念?可能。除了最后一个字之外的所有字都代表着人。我添加了一个对象“water”来显示类别之间的差异。例如,您可以看到蓝色列一直向下并在嵌入“water”之前停止。有一个明显的地方,“king”和“queen”彼此相似,并与所有其他人不同。类比
我们可以添加和减去单词嵌入并获得有趣的结果,最有名的例子是公式:“king” - “man” + “woman”:
model.most_similar(positive=["king
如果觉得《word2vec相似度计算_图解word2vec(原文翻译)》对你有帮助,请点赞、收藏,并留下你的观点哦!