最近在听Stanford放出来的Stanford CS224N NLP with Deep Learning这门课,弥补一下之前nlp这块基础知识的一些不清楚的地方,顺便巩固一下基础知识😁
关于word2vec:
1.为什么要把单词表示成向量
一开始人们造了一个类似于词典表的东西-wordnet:
但是这里面存在一些问题,大概有这么几个:
- 例如,“proficient”被列为“good”的同义词,但这只在某些情境下是正确的。
- WordNet在某些同义词组中列出了冒犯性的同义词,而没有涵盖单词的内涵或适用性。
- WordNet缺少对单词新含义的收录,例如"wicked"、“badass”、“nifty”、“wizard”、“genius”、“ninja”、"bombest"等。
- 难以保持最新
- 存在主观性的问题
- 需要耗费大量人力来创建和调整
- 不能用于准确计算单词相似度
再后来就有了one-hot编码:
但是嘞,用了一段时间以后人们发现这里还是存在一些问题,这里教授举了这样一个例子:
在网络搜索中的例子中,如果用户搜索“西雅图汽车旅馆”,我们希望匹配包含“西雅图酒店”的文档。
但是: 汽车旅馆 = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
酒店 = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0] 这两个向量是正交的。
对于独热向量来说,没有自然的相似度概念
提出的解决方案:学习将相似度编码在向量中。
更具体的说,从 context words 中去学习某个单词的意思,这也是word2vec思想的重要部分
所以归纳起来,把单词表示成我们想要的这种向量的好处可以概括为以下三个方面:
-
数值表示:计算机只能处理数值数据,而文本是一种非结构化的数据形式。把单词转化为向量,可以将文本转化为数值表示,使得计算机可以对其进行处理和分析。这样,我们可以利用数值计算的优势,如向量运算、相似度计算等。
-
特征表示:将单词转化为向量可以捕捉到单词之间的语义和语法关系。向量空间中的距离和角度可以表示单词之间的相似性和关联性。这样的向量表示可以作为特征输入到各种NLP任务中。通过将单词转化为向量,我们可以将文本转化为可计算的特征,从而进行更高级的文本分析和处理。如图,将单词转化为高维向量以后语义相近的单词挨得比较近。
-
维度降低:传统的文本表示方法,如独热编码,会将每个单词表示为一个高维稀疏向量,其中大部分元素为0。这种表示方法会导致高维度的特征空间,浪费存储空间和计算资源。通过将单词转化为低维稠密向量,可以实现维度的降低,减少存储和计算的开销,同时保留了单词之间的语义信息。
2.何为word2vec
课上给的定义:Word2vec (Mikolov et al. 2013) is a framework for learning word vectors
按照我的理解,Word2Vec是一种用于将单词表示为连续向量的算法,他的目标是通过学习单词之间的语义和语法关系,将单词嵌入到一个连续的向量空间中
3.具体实现步骤
-
构建训练样本:
Word2Vec模型的训练样本由目标单词和其上下文单词组成。在Skip-gram模型中,每个目标单词会与其周围的上下文单词配对;在CBOW模型中,每个上下文单词会与其对应的目标单词配对。这样可以为每个配对样本创建一对输入和输出。上课给出的例子是从头到尾滑动计算第 t + j t+j t+j个词和第 t t t个词(中心词)同时出现的概率,图示里把 i n t o into into当作中心词, t = 2 t=2 t=2,然后计算其他context word和中心词一起出现的概率
-
训练模型:
使用构建的训练样本和神经网络架构,开始训练Word2Vec模型。训练过程中,模型的目标是通过最大化或最小化特定的目标函数来优化模型的参数。课堂上举的例子是负对数似然函数。通过迭代优化过程,模型逐渐学习到单词的向量表示,以捕捉单词之间的语义和语法关系。
表示出目标函数:
然后训练
- 学习到的向量表示:
一旦模型训练完成,每个单词都会被表示为一个固定长度的向量。这些向量在向量空间中的距离和角度反映了单词之间的相似性和关联性。这些向量可以用于各种NLP任务,如计算单词相似度、文本分类、命名实体识别等。