图解 Word2Vec
原题:The Illustrated Word2vec
原文:HTML
作者:Jay Alammar
文章目录
- Personality Embeddings: What are you like?
- Word Embeddings
- Analogies
- Language Modeling
- Language Model Training
- Look both ways
- Skipgram
- Revisiting the training process
- Negative Sampling
- Skipgram with Negative Sampling (SGNS)
- Word2vec Training Process
- Window Size and Number of Negative Samples
- Conclusion
- References & Further Readings
我发现嵌入(embeddings)是机器学习中最引人入胜的想法之一。如果你曾经使用Siri,Google Assistant,Alexa,Google Translate,甚至是智能手机键盘的单词预测功能,那么你可能已经从自然语言处理模型中受益。在过去的几十年中,在神经模型中使用嵌入有了很大的发展(最近的发展包括上下文化的词嵌入,开发出了诸如BERT和GPT2之类的尖端模型)。
Word2vec是一种有效创建单词嵌入的方法,自2013年以来一直存在。但是,除了其作为词嵌入方法的效用之外,它的某些概念甚至在商业性非语言任务中也被证明可以有效地创建推荐引擎并理解序列数据。像Airbnb,阿里巴巴,Spotify和Anghami这样的公司都受益于从NLP领域中这台出色的机器,并将其用于生产中,从而为新型推荐引擎提供支持。
在本文中,我们将介绍嵌入的概念以及使用word2vec生成嵌入的机制。但是,让我们从一个示例开始,以熟悉如何使用向量来表示事物。你是否知道五个数字(一个向量)可以代表你的个性?
Personality Embeddings: What are you like?
以0到100的比例,你的内向/外向程度如何(其中,0表示内向程度最高,100是外向程度最高)?你是否曾经参加过MBTI之类的性格测试,异或参加了 Big Five Personality Traits 测试?这些测试会询问一系列问题,然后对人具有的不同特征打分,其中内向/外向就是其中之一。
Big Five Personality Trait 测试结果的示例。它可以真正告诉很多有关你自己的信息,并显示出对学术,个人和专业成功的预测能力。这是查找结果的地方。
假如我的内向/外向得分为38/100。我们可以这样绘制:
将范围切换为[-1,1]:
人很复杂,所以只由一个特征来判断人的信息是很有限的。因此,添加另一个维度,测试中另一个特征的得分。
我们可以将这两个特征表示为二维坐标上的一个点,或者更好地表示为从原点到该点的向量。
我已经隐藏了我们要绘制的特征,以使你习惯于不知道每个维度代表什么,但是仍然可以从一个人的个性的向量代表中获得很多价值。
现在我们可以说这个向量部分地代表了我的个性。当打算将另外两个人与我进行比较时,这种表示法很有用。假设我被公共汽车撞了,我需要被一个性格相似的人代替。下图中的两个人哪个人与我更相似?
处理向量时,计算相似度得分的常用方法是 cosine_similarity:
【补】
1号人物的性格与我更相似。指向相同方向(长度也起作用)的向量具有较高的余弦相似度得分。
再者,两个维度还不足以捕获有关不同人的足够信息。几十年来的心理学研究表明有五个主要特征(以及许多次要特征)。因此,我们在比较中使用所有五个维度:
五个维度的问题在于,我们无法在二维中绘制小箭头。这是机器学习中的一个常见挑战,我们经常不得不在更高维度的空间中进行思考。好处是,cosine_similarity 仍然有效。它适用于任意数量的尺寸:
cosine_similarity 适用于任意数量的维度。这些分数要好得多,因为它们是基于对所比较事物的更高分辨率表示来计算的。
在本节的最后,我希望我们提出两个中心思想:
- 我们可以将人(和事物)表示为数字的向量(这对机器非常有用!)。
- 我们可以轻松地计算出彼此相似的向量。
Word Embeddings
有了这种理解,我们就可以着眼于训练有素的词向量(word-vector examples)示例,也称为词嵌入(word embeddings),并开始研究它们的一些有趣特性。
这是单词“king”的词嵌入(在Wikipedia上训练的GloVe矢量):
[0.50451 , 0.68607 , -0.59517 , -0.022801, 0.60046 , -0.13498 , -0.08813 , 0.47377 ,
-0.61798 , -0.31012 , -0.076666, 1.493 , -0.034189, -0.98173 , 0.68229 , 0.81722 ,
-0.51874 , -0.31503 , -0.55809 , 0.66421 , 0.1961 , -0.13495 , -0.11476 , -0.30344 ,
0.41177 , -2.223 , -1.0756 , -1.0783 , -0.34354 , 0.33505 , 1.9927 , -0.04234 ,
-0.64319 , 0.71125 , 0.49159 , 0.16754 , 0.34344 , -0.25663 , -0.8523 , 0.1661 ,
0.40102 , 1.1685 , -1.0137 , -0.21585 , -0.15155 , 0.78321 , -0.91241 , -1.6106 ,
-0.64426 , -0.51042]
它是包含50个数的列表。查看这些值并不好理解,可以对其进行可视化,以便将其与其他单词向量比较。将所有这些数字放在一行中:
根据它们的值对进行颜色编码(如果接近2,则为红色;如果接近0,则为白色;如果接近-2,则为蓝色):
我们将忽略数字,仅查看颜色以指示单元格的值。现在,将“king”与其他单词进行对比:
由上图可以看出,“Man”和“Woman”比二者与“king”更相似。这说明这些向量捕获了这些单词的相当一部分信息/含义/关联。
这是另一个示例列表(通过垂直扫描列以查找具有相似颜色的列进行比较):
需要指出的几点:
- 这些不同的词都有一个直的红色长条。表示它们在该维度上是相似的(但并不知道每个维度代表什么)。
- 可以看到“woman”和“girl”在很多地方是相似的。“man”和“boy”也是如此。
- “boy”和“girl”也有彼此相似的地方,但不同于“woman”和“man”。这些编码可能为模糊的青年概念。
- 除最后一个单词外,所有单词都是代表人的单词。我添加了一个对象(水)以显示类别之间的差异。
- 例如,可以看到蓝色的列一直向下,并在嵌入“水”之前停止。
- 很明显,“king” 和 “queen”彼此相似,但二者却截然不同。这些难道会成为模糊的王权概念的编码吗?
Analogies
对类别(离散变量)进行嵌入编码是显示嵌入令人难以置信的特性的著名示例。我们可以对词嵌入进行加减运算,然后得出有趣的结果。最著名的例子是公式:“国王”-“男人” +“女人”
:
使用python中的Gensim库,我们可以对词嵌入进行加减运算,它将找到与所得向量最相似的词。该图像显示了最相似的单词的列表,每个单词都有其余弦相似度。
我们可以像以前一样可视化:
现在,我们已经研究了训练有素的词嵌入,下面让我们详细了解其训练过程。但是在介绍word2vec之前,我们需要看一下词嵌入概念的来源:神经语言模型。
Language Modeling
如果要举一个NLP应用程序的例子,最好的例子之一就是智能手机键盘的下一词预测功能。这项功能每天都有数十亿人使用。
下一个单词预测是可以由语言模型解决的任务。语言模型可以获取一个单词列表(假设两个单词),并尝试预测其后的单词。
在上面的屏幕截图中,我们可以认为该模型是一个采用了这两个绿色单词(thou shalt)并返回建议列表的模型(“not”是概率最高的那个):
我们可以认为模型看起来像这个黑匣子:
但实际上,模型不会只输出一个单词。实际上,它会为它所知道的所有单词输出概率得分(该模型的词汇数量从几千到几百万个单词不等)。然后,键盘应用程序将得分最高的单词,并将其呈现给用户。
神经语言模型的输出是该模型知道的所有单词的概率得分。这里我们将概率表示为百分比,但实际上在输出向量中40%表示为0.4。
经过训练后,早期的神经语言模型(Bengio 2003)将通过三个步骤来计算预测:
讨论嵌入时,第一步对我们而言最相关。训练过程的结果之一是矩阵,其中包含我们词汇表中每个单词的嵌入。在预测期间,我们只需查找输入单词的嵌入,然后使用它们来计算预测:
现在,我们转到训练过程中,以了解有关如何开发此嵌入矩阵的更多信息。
Language Model Training
与大多数其他机器学习模型相比,语言模型具有巨大的优势。这样做的好处是,我们能够对正在运行的文本进行训练-我们拥有大量的文本。考虑一下我们所拥有的所有书籍,文章,Wikipedia内容和其他形式的文本数据。与许多其他需要手工制作的特征和专门收集的数据的机器学习模型形成对比。
单词是通过我们查看它们倾向于出现在旁边的其他单词来嵌入的。其机理是
- 我们获得了大量文本数据(例如,所有Wikipedia文章)。然后
- 我们有一个窗口(例如,三个单词),可以在所有文本上滑动。
- 滑动窗口为我们的模型生成训练样本。
当此窗口相对于文本滑动时,我们(实际上)生成了用于训练模型的数据集。为了确切地了解其完成方式,让我们看看滑动窗口如何处理此短语:
当我们开始时,窗口位于句子的前三个单词上:
我们将前两个词作为特征,并将第三个词作为标签:
现在,我们已经在数据集中生成了第一个样本,以后可以用来训练语言模型。
然后,我们将窗口滑动到下一个位置,并创建另一个示例:
现在生成第二个示例。
很快,我们有了一个更大的数据集,其中的单词倾向于出现在不同的单词对之后:
实际上,当我们滑动窗口时,往往会训练模型。但是我发现从逻辑上将“数据集生成”阶段与训练阶段逻辑上分开是很清楚的。除了基于神经网络的语言建模方法外,一种称为N-grams的技术通常用于训练语言模型(请参阅: Chapter 3 of Speech and Language Processing)。要了解从N-grams转换为神经模型并应用于现实产品,这是我最喜欢的Android键盘(Swiftkey在2015年的博客文章),介绍了他们的神经语言模型,并将其与以前的N-gram模型进行了比较。我喜欢这个示例,因为它展示了如何在营销演讲中描述嵌入的算法特性。
Look both ways
要知道从帖子的前面知道什么,请填写空白:
我在这里提供的上下文是空白单词之前的五个单词(以及前面提到的“bus”)。我敢肯定,大多数人都会猜到空白处的单词为“bus”。但是,如果我改变提供的信息(如下图),答案会改变吗?
这完全改变了空白处该填入的词。现在,red
一词最有可能成为空白。我们从中学到的是在特定单词之前和之后的单词都具有信息价值。事实证明,考虑到两个方向(我们正在猜测的单词的左侧和右侧的单词),可以更好地嵌入单词。 让我们看看我们如何调整训练模型的方式来解决这个问题。
Skipgram
除了查看目标词之前的两个词,我们还可以查看目标词之后的两个词。
如果这样做,我们实际上要构建和训练模型的数据集将如下所示:
这被称为单词连续袋(Continuous Bag of Words)架构,并且在one of the word2vec papers [pdf]中进行了描述。另一种倾向于表现出出色结果的结构有所不同。
与其根据上下文来猜测一个单词(之前和之后的单词),不如尝试使用当前单词来猜测相邻的单词。可以认为它在训练文本上滑动的窗口看起来像这样:
绿色插槽中的单词是输入单词,每个粉红色框是一个可能的输出。
粉色框具有不同的阴影,因为此滑动窗口实际上在训练数据集中创建了四个单独的样本:
该方法称为跳过图(skipgram)结构。可以通过执行以下操作来可视化滑动窗口:
这会将这四个样本添加到我们的训练数据集中:
然后,我们将窗口滑动到下一个位置:
生成下面的四个示例:
多次滑动之后以后,可以得到许多样本:
Revisiting the training process
现在,已经从现有的运行文本中提取了skipgram训练数据集,让我们看看如何使用它来训练预测相邻单词的基本神经语言模型。
我们从数据集中的第一个样本开始。我们抓取该特征并将其馈送到未经训练的模型,要求其预测合适的邻近词。
该模型执行这三个步骤,并输出预测向量(将概率分配给词汇中的每个词)。由于模型未经训练,因此在此阶段的预测肯定是错误的,但是没关系。我们知道它应该猜出什么单词——我们当前用于训练模型的行中的标签/输出单元格:
“目标向量”是目标单词的概率为1的单词,所有其他单词的概率为0的单词。
模型距离多远?我们减去两个向量,得出误差向量:
现在,可以使用此误差向量来更新模型,因此下次,当它输入为 not
时,模型更有可能预测为 thou
。
到此结束培训的第一步。我们继续对数据集中的下一个样本进行同样的处理,然后对下一个样本进行同样的处理,直到遍历完数据集中的所有样本,此时一个epoch结束。我们将重复训练多个epoch,然后得到训练好的模型,可以从中提取嵌入矩阵并将其用于其他任何应用程序。
尽管这扩展了我们对过程的理解,但仍然不是word2vec实际训练的方式。我们缺少几个关键思想。
Negative Sampling
回忆一下此神经语言模型如何计算其预测的三个步骤:
从计算的角度来看,第三步非常昂贵——要知道需要将对数据集中的每个训练样本执行一次(很容易就达到几千万次)。我们需要做一些改善性能的事情。
一种方法是将目标分为两个步骤:
- 生成高质量的单词嵌入(不用担心下一个单词的预测)。
- 使用这些高质量的嵌入来训练语言模型(进行下一个单词的预测)。
在这篇文章中,我们将重点放在步骤1。为了使用高性能模型生成高质量的嵌入,我们可以将模型的任务切换为预测相邻单词:
然后将其切换到采用输入和输出单词的模型,并输出一个分数,以表明它们是否为邻居(0表示“非邻居”,1表示“邻居”)。
这个简单的开关将我们需要的模型从神经网络更改为逻辑回归模型——因此它变得更简单,计算更快。
此切换要求我们切换数据集的结构-标签现在是值为0或1的新列。由于我们添加的所有单词都是邻居,因此它们均为1。
现在可以以惊人的速度进行计算——在几分钟内处理数百万个示例。但是,我们需要解决一个漏洞。如果我们所有的示例都是正例(target:1),那smartass模型可能始终返回1——达到100%的准确率,但是这样什么也不学并且会产生性能非常差的嵌入。
为了解决这个问题,我们需要向数据集中引入负样本——不是邻居的单词样本。对于这些样本,我们的模型需要返回0。现在这是模型必须努力解决的挑战,但仍要以惊人的速度进行。
对于数据集中的每个样本,我们添加负样本。它们具有相同的输入词和0标签。
这个想法是受Noise-contrastive estimation [pdf]启发,将实际信号(相邻单词的正例)与噪声(不是邻居的随机选择单词)进行对比。
Skipgram with Negative Sampling (SGNS)
现在,已经介绍了word2vec中的两个中心思想:合起来,它们被称为带有负采样的skipgram。
Word2vec Training Process
现在,我们已经建立了skipgram和负采样这两个中心思想,我们可以继续仔细研究实际的word2vec训练过程。
在训练开始之前,要对进行训练的文本进行预处理。在此步骤中,我们确定词汇量(将其称为vocab_size
,想像为10000),以及属于哪个单词。
在训练阶段的开始,我们创建两个矩阵:嵌入矩阵(Embedding matrix)和上下文矩阵(Context matrix)。这两个矩阵在我们的词汇表中都有一个嵌入词(因此vocab_size是它们的维度之一)。第二个维度是我们希望每个嵌入的持续时间(embedding_size=300是一个常见值,在本文中设置为50)。
在训练开始时,使用随机值初始化这些矩阵,然后开始训练。在每个训练步骤中,我们都采用一个正例及其相关的负例。让我们来看第一组:
现在我们有四个单词:输入单词 not
和 输出/上下文单词:thou
(实际的邻居),aaron
和 taco
(负例)。继续查找它们的嵌入——对于输入的单词,在嵌入矩阵中查找。对于上下文单词,查看上下文矩阵(即使两个矩阵都对词汇表中的每个单词都有嵌入)。
然后,我们计算输入嵌入与每个上下文嵌入的点积。在每种情况下,这都会产生一个数字,该数字表示输入和上下文嵌入的相似性。
现在,我们需要一种方法来将这些分数转换为看起来像概率的东西——它们都为正数且值在零到一之间,sigmoid logistic 函数很适合这个任务。
现在,我们可以将 sigmoid 的输出视为这些示例的模型输出。可以看到,在 sigmoid 前后,taco
的得分均为最高,而 aaron
的得分均为最低。
现在,未经训练的模型已经做出了预测,并且看起来好像有一个实际的目标标签可以进行比较,让我们计算模型的预测中有多少错误。为此,我们只需从目标标签中减去 sigmoid 得分即可。
这是机器学习的“学习”部分。现在,我们可以使用此错误分数来调整 not, thou, aaron, taco
的嵌入,以便下次进行此计算时,结果将更接近目标分数。
训练到此结束。可以看出,模型稍好地嵌入了此步骤中涉及的单词(not, thou, aaron, taco
)。现在,我们继续下一步(下一个正例及其相关的负例),并再次执行相同的过程。
当我们循环遍历整个数据集多次时,嵌入将继续得到改善。然后,可以停止训练,丢弃Context矩阵,并将Embeddings矩阵用作下一个任务的预训练嵌入。
Window Size and Number of Negative Samples
word2vec训练过程中的两个关键超参数是:窗口大小和负样本数目。
不同的窗口大小可以更好地完成不同的任务。一种启发式方法是,较小的窗口大小(2-15)会导致这样的嵌入:两个嵌入之间的相似度很高,这表示单词可以互换(注意,如果我们仅查看周围的单词,反义词通常可以互换——例如好与坏经常出现在类似的背景下。较大的窗口大小(15-50,甚至更大)会导致这样的嵌入:其相似性更能指示单词的相关性。 实际上,通常必须提供注释,以指导嵌入过程,从而为你的任务提供有用的相似感。 Gensim的默认窗口大小为5(除了输入单词本身之外,还包括输入单词之前的两个单词和输入单词之后的两个单词)。
负样本的数量是训练过程的另一个因素。 原始论文规定5-20的负样本数比较适合。它还指出,当数据集足够大时,2-5似乎已经足够。 Gensim的默认值为5个负样本。
Conclusion
我希望你现在对词嵌入和word2vec算法有所了解。 我还希望现在当阅读提及 skip gram with negative sampling(SGNS)的论文(如顶部的推荐系统论文)时,对这些概念有更好的理解。 一如既往,感谢所有反馈。@JayAlammar
References & Further Readings
- Distributed Representations of Words and Phrases and their Compositionality [pdf]
- Efficient Estimation of Word Representations in Vector Space [pdf]
- A Neural Probabilistic Language Model [pdf]
- Speech and Language Processing by Dan Jurafsky and James H. Martin is a leading resource for NLP. Word2vec is tackled in Chapter 6.
- Neural Network Methods in Natural Language Processing by Yoav Goldberg is a great read for neural NLP topics.
- Chris McCormick has written some great blog posts about Word2vec. He also just released The Inner Workings of word2vec, an E-book focused on the internals of word2vec.
- Want to read the code? Here are two options:
- Gensim’s python implementation of word2vec
- Mikolov’s original implementation in C – better yet, this version with detailed comments from Chris McCormick.
- Evaluating distributional models of compositional semantics
- On word embeddings, part 2
- Dune
图解 Word2Vec相关推荐
- 图解Word2vec,读这一篇就够了(通俗易懂)
大数据文摘出品 作者:Jay Alammar 编译:张秋玥.毅航.高延.龙心尘 嵌入(embedding)是机器学习中最迷人的想法之一. 如果你曾经使用Siri.Google Assistant.Al ...
- word2vec相似度计算_图解word2vec(原文翻译)
文章转载自公众号 机器学习初学者 , 作者 机器学习初学者 自2013年以来,word2vec一直是一种有效的词嵌入的方法,本文把word2vec用图解的方式进行,全篇没有数学公式,非常通俗易懂,推荐 ...
- 图解word2vec(原文翻译)
自2013年以来,word2vec一直是一种有效的词嵌入的方法,本文把word2vec用图解的方式进行,全篇没有数学公式,非常通俗易懂,推荐初学者阅读. (原文作者:jalammar,翻译:黄海广). ...
- 收藏 | 图解Word2vec,读这一篇就够了!
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:大数据文摘 ...
- NLP系列(10)_词向量之图解Word2vec
审校:龙心尘 作者:Jay Alammar 编译:张秋玥.毅航.高延 https://blog.csdn.net/longxinchen_ml/article/details/89077048 原文链 ...
- 图解Word2vec
作者: 龙心尘 时间:2019年4月 出处:https://blog.csdn.net/longxinchen_ml/article/details/89077048 审校:龙心尘 作者:Jay Al ...
- 图解Word2vec,读这一篇就够了!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:大数据文摘,推荐人:张帆 嵌入(embedding)是机器学习中最 ...
- 朴实无华!详细图解Word2vec
Datawhale干货 来源:大数据文摘,推荐人:张帆 嵌入(embedding)是机器学习中最迷人的想法之一.如果你曾经使用Siri.Google Assistant.Alexa.Google翻译, ...
- 【NLP】图解词嵌入和Word2vec
0.导语 词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称.概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量. ...
最新文章
- Laravel学习笔记之Decorator Pattern
- 什么叫大地高_续航8折不存在,北汽新能源EX5实力演绎什么叫高续航SUV!
- MYSQL数据库应用优化
- 为什么下了android 4.1 的SDK后在本地用浏览器看api说明文档时,浏览器打开api的html文件很慢?试了好几款浏览器都一样。为什么?...
- bootstrap 总结
- led投影仪能换大功率灯吗_LED大功率洗墙灯怎么防水
- 2020-08-09
- Azure KUDU工具
- 西门子Smart 200 PLC 封装运动控制向导生成指令(脉冲)
- 程序员996工作制,逼出了一批牛妈!为牛妈点赞!
- 给大家推荐一本书:你只是看起来很努力
- 【MYSQL】学习笔记
- 京东后台模板导入SKU报格式错误
- 2022年中国云计算面临的问题及发展前景预测分析
- java graphics dispose_java图形处理-Java Graphics2D
- 2021查询高考成绩提前批分数线,快看看!2021高考部分省市“预测分数线”出炉!两点需要注意...
- 宝塔设置A站点SSL,同服务器下其他未设SSL站点访问HTTPS默认会打开A站点
- 傅里叶变换性质----Leson Chap3_8-9
- 英语----非谓语的另类运用:独立主格
- windows7 vl版_与你分享 | Windows 7