学习word2vec 的一些积累

在看代码的时候想多一下Word2vec,感觉确实比较难,就记录一下,以免忘掉。

一、word2vec是什么东西,他能干什么

根据wrd2vec的定义,他是一种基于基于语言模型的一种词嵌入(word embending)技术,

词嵌入(word embending)又叫做词向量

词向量:用Distributed Representation表示词,通常也被称为(Word Representation)或(Word Embedding)。因为语言是不能被计算机所识别的,而计算机能识别的是二进制编码0,1的数字。因此,我们将单词转换为0,1的数字,那个具体怎么转化呢?

下面这张图是看的一篇文章的图示,感觉比较好,拿来一用

 

二、one-hot编码

例如构建一个词汇表:V = {Have, a, good, great, day},其中的 have表示为[1,0,0,0,0],a 表示为[0,1,0,0,0],...可以看到每一单词在对应位置上是1,其余位置均为0 ,这样的编码形式称为one-hot 编码

对于one-hot 编码其最大的缺点就是在过于耗资源尤其是在计算的时候,可以想象到,如果有1万的字符,那么one-hot编码的列向量就有1万列,而且这一万列就是有一个位置是有效字符,其余均是0,这样就造成了特征矩阵的稀疏,如何解决这一问题,在之后我们会讲到word2vec模型会将其转为词嵌入(word embending)

三、词嵌入   

几千万个这时候与余弦相似度为0,任何单词之间毫无任何关系(这个地方会稍后讲到),通常我们会通过Embedding使之降维到128维或者256维,降维后每个元素表示的是一个概率值,是连续的。

现在我们讲一下如果判断两个单词相似或者说两个单词语义相近。将字词转换成向量形式,可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。我们使用Word2vec计算余弦值 (cosine),距离范围为0–1之间,值越大代表两个词关联度越高。

我们的目标是使上下文相似的单词占据紧密的空间位置。在数学上,此类向量之间的角度的余弦值应接近1,即角度接近0。如下图所示:

preview

      这就是生成分布式表示的想法。直观地,我们引入了一个单词对其他单词的某种依赖性。在该词的上下文中的词将在这种依赖性中获得更大的比重one hot encoding representations中,所有的单词是独立彼此的如前面提到的。

四、Word2vec

说起word2vec,首先需要简单理解下基于神经网络的自编码模型,自编码,其实就是一种降维方法。基础自编码的网络结构如下:

因为word2vec是NLP里面应用的,是对词的一个编码,NLP里面一个很大的特点是什么呢?就是一段话中,一个词的表示是和上下文相关的。也就是说这是一个带有时间先后与相对顺序的表示。那么既要实现上面的降维,又要兼顾词的先后顺序关系,word2vec就是要解决这样的问题

怎么解决的?首先还是有一个基础的神经网络自编码模型:

 那么怎么考虑上下文的信息呢?很简单,输入的时候不光是一个词,而是上下文多个词一起当成输入:

        

下面在来看Word2vec,其核心思想是通过词的上下文得到词的向量化表示,有两种方法:

  • CBOW(拿一个词语的上下文作为输入,来预测这个词语本身
  • Skip-gram(用一个词语作为输入,来预测它周围的上下文)

 先来看CBOW

这是一种多对一的模型(CBOW),还有一种一对多(Skip-Gram)模型,我们先说这种多对一模型。CBOW的训练模型如左图所示

image

 这个网络结构就是最开始的自编码网络,只不过它的输入不是一次性输入的,而是好几批输入的,而隐含层的结果是好几批输入的加权平均值

详细的过程为:

1 输入层:上下文单词的One-Hot编码词向量,V为词汇表单词个数,C为上下文单词个数。“There is an apple on the table”作为训练数据,这里C=4,所以模型的输入是(is,an,on,the)4个单词的One-Hot编码词向量。

2 这些单词的onehot分别乘以共享的输入权重矩阵W.初始化一个权重矩阵Wv*n,然后用所有输入的One-Hot编码词向量左乘该矩阵,得到维数为N的向量w1,w2,w3,…wn,这里的N由自己根据任务需要设置。

3 所得的向量相加求平均作为隐藏层向量h. 

4 初始化另一个权重矩阵Wnm,用隐藏层向量h左乘 Wnv,再经激活函数处理得到V维的向量y,y的每一个元素代表相对应的每个单词的概率分布。

5。得到输出 y中概率最大的元素所指示的单词为预测出的中间词(target word)与true label的One-Hot编码词向量做比较,根据误差更新两个权重矩阵。

这样就可以训练网络了。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

相比于原始的自编码,word2vec最大的不同点在于输入上,要考虑先后关系的自编码,这一点值得好好理解下。

再来看Ski-gram:

在前面我们已经介绍过Skip-Gram是给定input word来预测上下文,其模型结构如下图所示。其模型是一对多的关系,

神经网络基于这些训练数据中每对单词出现的次数习得统计结果,并输出一个概率分布,这个概率分布代表着到我们词典中每个词有多大可能性跟input word同时出现。


Skip-gram做法是

将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。

通过在一个大的语料库训练,得到一个从输入层到隐含层的权重模型。“apple”的上下文词是(’there’,’is’,’an’,’on’,’the’,’table’).那么以apple的One-Hot词向量作为输入,输出则是(’there’,’is’,’an’,’on’,’the’,’table’)的One-Hot词向量。训练完成后,就得到了每个词到隐含层的每个维度的权重,就是每个词的向量(和CBOW中一样)。接下来具体介绍如何训练我们的神经网络。

首先我们选句子“There is an apple on the table”中间的一个词作为我们的输入词,例如我们选取“apple”作为input word;

有了input word以后,我们再定义一个叫做skip_window的参数,它代表着我们从当前input word的周围选取词的数量。如果我们设置skip_window=2,那么我们最终获得窗口中的词(包括input word在内)就是[‘is’,’an’,’apple’,’on’,’the’ ]。skip_window=2代表着选取左input word左侧2个词和右侧2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫num_skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们将会得到两组 (input word, output word) 形式的训练数据,即 (‘apple’, ‘an’),(‘apple’, ‘on’)。

举个例子,如果我们向神经网络模型中输入一个单词“中国“,那么最终模型的输出概率中,像“英国”, ”俄罗斯“这种相关词的概率将远高于像”苹果“,”蝈蝈“非相关词的概率。因为”英国“,”俄罗斯“在文本中更大可能在”中国“的窗口中出现。我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。

最后同CBOW那样通过梯度下降和反向传播更新矩阵W,W中的行向量即为每个单词的Word embedding表示

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值