词向量

自然语言处理-词向量

引言

在计算机视觉中,作为输入的图片可以直接数值化。在语言识别中,作为输入的语音也可以直接数值化。而在自然语言处理中,我们无法将文字直接数值化,为了能够让计算机处理文字,我们需要将文字映射到一个数值空间。由于词是组成语义的基本单位,所以对词的表述就显得尤为重要,我们把词的数值(表征)表示为Word Representation,一般来说,词向量经常指Word Embedding,也称Distributed Word Representation

摘要

Word Representation的发展过程引入Word Embedding,先从简单的SVD介绍开始,再到NNLM,word2vec等词向量模型。

one-hot编码

one-hot编码也称独热编码,这是一种简单的词表征方式,每个词使用一个$R^{|V|}$的向量表示,$|V|$表示词表的大小。

使用one-hot编码的词向量之间是相互独立的,因为对于每个词$(w^{i})^{T}w^j = 0$,这种编码方式并没有编码不同词之间的语义相似性。

基于矩阵分解的词表征

词–文档矩阵(Word-Document Matrix)

如果我们有大量的文档,我们用一个矩阵来存储所有文档的词频信息。矩阵的行向量代表词,列向量代表文档,每个元素代表词在文档中出现的频数,比如我们现在有两篇文档:

$I quad love quad NLP \ I quad love quad deep quad learningI$

经过统计次数,我们可以得到以下矩阵:

如果两个文档有相似的主题,那么两个文档的列向量会趋于有相似类型的词数量。该模型主要用于衡量文档主题的相似性。

基于窗口的词共现矩阵(Window based Co-occurrence Matrix)

给定一个词,计算在一个限定大小的窗口中出现的其他词的次数。我们将这些计数放在一个矩阵中,矩阵的行表示词,列也是词。假如窗口大小为1,我们需要计算当前词左右两边的两个词。比如,我们两个句子:

$I quad love quad NLP \ I quad love quad deep quad learningI$

窗口长度为1,我们得到的矩阵为:

以看到矩阵是对称矩阵,可以行或者列作为词表征。这个矩阵的意义在于假如两个词有相似的context则偏向于有相似的意思,也就是说相似的词有相似的词表征。

SVD(Singular Value Decomposition)

SVD,奇异值矩阵分解。对于任意一个矩阵$X$都可以做奇异值分解:

其中$U$和$V$都是正交矩阵,$S$只有对角元素:

其中$sigma_1…sigma_r$是矩阵$X$的奇异值。

LSA(Latent Semantic Analysis)

上述描述的两种矩阵中,都存在一个明显的问题-当出现大量的文档和词的时候,我们得到的矩阵会十分庞大,而且会出现矩阵稀疏问题。后来,有人为了提高相似度的计算准确度,提出了对矩阵进行SVD分解,可以得到更好的词表征。这种方法称为LSA,潜在语义分析。LSA是为了研究词表征,另外还有类似的研究文档表征的方法叫LSI(Latent Semantic Index)。 我们通过计数统计得到了词-文档矩阵或者词共现矩阵$X$,然后对矩阵$X$使用SVD,取最大的$k$个奇异值,由于每个奇异值对应于$U$的列,因此得到$hat{boldsymbol{U}}_{ntimes k}$,每一行代表一个词表征,因此可以得到$k$维的词表征。

优点:降低矩阵稀疏度 减少噪声

缺点:有新词或新的语料出现,矩阵需要重新计算 矩阵维度高 

   矩阵过于稀疏,很多词无法共现 会出现过高或过低的词频

Word Embedding 出现解决了上述问题。

基于迭代的词表征(词向量)

迭代的词表征得到的是一个稠密的向量,与矩阵分解不同的是,词向量是通过迭代训练模型得到。

NNLM

这个模型是由Bengio大神于2003年发表,可以说是Neural Language Model的开山之作。本来作者的主要目的是建立语言模型,结果发现了词向量这种副产品,由此引发了后人对词向量的火热研究。

模型使用了一个简单的前向神经网络,如下图所示:

该模型通过上下文来预测下一个单词,图中所示的输入为上文的各个词$w_i$,然后将他们的词向量$C(w_i)$连接起来,输出是每个词的概率$P(w_t|content)$,虚线表示的是词向量层和输出层的直接连接。

Word2vec

Word2vec这个工具,是Tomas Mikolov在Google的时候开发的用来训练词向量的工具。Word2vec这个工具中有两个模型(CBOW、Skip-Gram),还有两种加速训练的trick(层次Softmax、负采样),下面分别一一讲述。

  • $w$表示词
  • $x$表示one-hot编码
  • $u$和$v$表示词向量
  • $x(w)$表示one-hot编码中对应词$w$位置的值,取值为0或1,只有一个位置上的值为1。
CBOW(Continuous Bag-of-word Model)

模型的网络结构如下:

说明:

模型中存在两套词向量。

一套称为Input词向量,用矩阵$V_{|V|times d}=(v_1,dots,v_{|V|})$表示,|V|指的是词表大小,d指词向量维度

一套称为Output词向量,用矩阵$U_{|V|times d}=(v_1,dots,v_{|V|})$表示

建模过程

  • 确定一个窗口大小m
  • 选定目标词位置t。得到该位置的上下文:
  • 得到上下文各个词的one-hot表示:
  • 使用矩阵$V$,计算$v = Vx$得到上下文的词向量(对于图中的INPUT层
  • 将上下文的词向量相加或者平均,得到。(对应图中的PROJECTION层)
  • 使用矩阵$U$,计算目的词的概率分布(对应图中的OUTPUT层):
  • 使用负对数似然(又称交叉熵)损失函数$J$:

训练过程

  • 选取batch的大小n
  • 使用SGD训练,对于每个训练样本的损失函数$J_i$,构造batch的损失函数:
  • 每一轮迭代更新$U$和$V$
Skip-Gram(Continuous Skip-gram Model)

既然可以用上下文来预测目标词,反过来也能用目标词来预测上下文,Skip-Gram因此应运而生。

与CBOW一样,模型中存在两套词向量$U$和$V$。

建模过程

  • 确定Context的窗口大小$m$。
  • 选取一个目标词$w^t$,然后在目标词的Context中的选择一个词$w^c$,组成训练样本:
  • 得到训练样本one-hot表示为:$(x^t,x^c)$
  • 使用矩阵$V$,得到目标词的词向量(对应图中INPUT层):$v^t = c^tV$
  • 由于只有一个词,所以不需要相加或者平均,直接复制到下一层(对应PROJECTION层): $hat{v} = v^t$
  • 使用矩阵$U$,计算上下文中的词的概率分布(对应图中的OUTPUT层)
  • 使用负对数似然(又称交叉熵)损失函数$J$:

训练过程

  • 选取batch的大小n
  • 使用SGD训练,对于每个训练样本的损失函数$J_i$,构造batch的损失函数:
  • 每一轮迭代更新$U$和$V$
加速技巧

Word2vec的训练是无监督的,我们只需要分好词,在训练的时候像有监督一样进行梯度下降。因此,在训练模型的时候,我们需要同时更新$U$和$V$。

从公式可以看出,每次迭代只需要更新矩阵中的少量向量(Skip-Gram中是一个)。然而如果我们使用简单的Softmax,我们就要每次都更新整个$U$,假如词表大小到达千万级以上,可想而知这是多么耗时。因此,我们需要一些Trick来加速训练。

原文:大专栏  词向量

原文地址:https://www.cnblogs.com/petewell/p/11601743.html

时间: 2024-08-27 16:02:11

词向量的相关文章

Windows下使用Word2vec继续词向量训练

word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning(深度学习)模型(实际上该模型层次较浅,严格上还不能算是深层模型,如果word2vec上层再套一层与具体应用相关的输出层,如Softmax,便更像是一个深层模型),它将词表征成实数值向量,采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型.具体原理,网上有很多. 本文是在window

word2vec词向量训练及中文文本相似度计算

本文是讲述如何使用word2vec的基础教程,文章比较基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python下载地址:http://radimrehurek.com/gensim/models/word2vec.html 1.简单介绍 参考:<Word2vec的核心架构及其应用 · 熊富林,邓怡豪,唐晓晟 · 北邮2015年> <Word2vec的工作原理及应用探究 · 周练 · 西安电子科技大学

词向量(WordVector)

Reference:http://licstar.net/archives/328 (比较综合的词向量研究现状分析) 起源:One-hot Representation.PCA 序:为什么NLP在模式识别里面比较难? Licstar的文章开头这么提到:语言(词.句子.篇章等)属于人类认知过程中产生的高层认知抽象实体,而语音和图像属于较为底层的原始输入信号. 语音.图像数据表达不需要特殊的编码,而且有天生的顺序性和关联性,近似的数字会被认为是近似特征.然而语言就麻烦了. 比如通俗的One-hot

词向量( Distributed Representation)工作原理是什么

原文:http://www.zhihu.com/question/21714667 4 个回答 83赞同反对,不会显示你的姓名 皮果提 刘鑫.莫教授要养猫.Starling Niohuru 等人赞同 要将自然语言交给机器学习中的算法来处理,通常需要首先将语言数学化,词向量就是用来将语言中的词进行数学化的一种方式. 一种最简单的词向量方式是 one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的大小,向量的分量只有一个 1,其他全为 0, 1 的位置对应

【paddle学习】词向量

本章我们介绍词的向量表征,也称为word embedding.词向量是自然语言处理中常见的一个操作,是搜索引擎.广告系统.推荐系统等互联网服务背后常见的基础技术. 在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性.为了做这样的比较,我们往往先要把词表示成计算机适合处理的方式.最自然的方式恐怕莫过于向量空间模型(vector space model). 在这种方式里,每个词被表示成一个实数向量(one-hot vector),其长度为字典大小,每个维度对应一个字典里的每个词,除了这

重磅︱R+NLP:text2vec包简介(GloVe词向量、LDA主题模型、各类距离计算等)

词向量的表示主流的有两种方式,一种当然是耳熟能详的google的word2vec,还有一类就是GloVe.那么前面一类有三个开源的包,后面这一类我倒是看到得不多,恰好是在我关注了许久的一个包里面有,它就是text2vec啦.该包提供了一个强大API接口,能够很好地处理文本信息. 本包是由C++写的,流处理器可以让内存得到更好的利用,一些地方是用RcppParallel包进行并行化加乘,同时兼容各个系统的服务器.如果没有并行的地方,大家也可以自己用foreach包来自己加速. ----------

95、自然语言处理svd词向量

import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like","enjoy","deep","learning","NLP","flying","."] X = np.array([[0,2,1,0,0,0,0,0], [2,0,0,1,0

theano学习指南--词向量的循环神经网络(翻译)

欢迎fork我的github:https://github.com/zhaoyu611/DeepLearningTutorialForChinese 最近在学习Git,所以正好趁这个机会,把学习到的知识实践一下~ 看完DeepLearning的原理,有了大体的了解,但是对于theano的代码,还是自己撸一遍印象更深 所以照着deeplearning.net上的代码,重新写了一遍,注释部分是原文翻译和自己的理解. 感兴趣的小伙伴可以一起完成这个工作哦~ 有问题欢迎联系我 Email: [email

词向量-LRWE模型

上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述目标,我们尝试基于CBOW模型,将知识库中抽取的知识融合共同训练,提出LRWE模型.模型的结构图如下: 下面详细介绍该模型的思想和求解方法. 1. LWE模型     在Word2vec的CBOW模型中,通过上下文的词预测目标词,目标是让目标词在其给定上下文出现的概率最大,所以词向量训练的结果是与其

如何产生好的词向量

如何产生好的词向量? 词向量.词嵌入(word vector,word embedding)也称分布式表示(distributed representation),想必任何一个做NLP的研究者都不陌生.如今词向量已经被广泛应用于各自NLP任务中,研究者们也提出了不少产生词向量的模型并开发成实用的工具供大家使用.在使用这些工具产生词向量时,不同的训练数据,参数,模型等都会对产生的词向量有所影响,那么如何产生好的词向量对于工程来说很重要.中科院自动化所的来斯惟博士对此进行了详细的研究.本篇博客也是我