word2Vec之Pytorch实现_理论部分

本文深入探讨了n-gram、神经网络语言模型(nnml)及其优化方法word2Vec。介绍了n-gram的马尔科夫假设以及数据稀疏性问题,然后详细阐述了nnml的结构和复杂度问题。接着,重点讲解了word2Vec的cbow和skip-gram模型,以及它们如何解决nnml的复杂度问题。此外,还讨论了负采样、重采样和层序softmax等训练技巧,以提高模型效率和性能。

目录

目录

1.n-gram

2.神经网络语言模型

3.word2Vec

4.训练技巧

4.1重采样

4.2负采样

4.3层序softmax


1.n-gram

一句话由许多词构成,例如:“I love NanJing University”。在语言模型里面,我们常常将某句话生成的看做是一个概率事件。我们脑海里常常构思的语言句子,那么其出现的频数也比较多,发生概率就大,胡言乱语的语句频数少,发生的概率也较小。但是从句子粒度上考虑是欠妥的,因为句子的表达式丰富多彩的:例如:“I like NanJing University”。不过可以发现,句子表达可能是无穷无尽的,但是表示句子的词语(单词)是有限的。这里我们暂且将词语认为就是构句子的原子(即最小粒度),若有所有词语的概率,然后用词语的联合分布去表示一句话,那么所有的句子就都可以为被我们表示。

因此,基于这个想法,我们可以将上面的那个例子:

 p("I love NanJing University")=p("l")p("love"|"I")p("NanJing"|"love","I")p("University"|"I","love","NanJing" ) 

这样,任何一段话的我们都可以用词的联合分布来表示。但是这样也存在一个问题,就是上式中的链式法则越往后越稀疏,如“I love NanJing”这样的句子在文章中几乎就可以理解为一句话了,这段话在文中中出现的概率几乎是0了,更不用说在其发生下的情况下再接着跟着一个“University”。这就不得不用到我们的马尔科夫假设了:

即当前事件的发生仅仅与前一时刻发生的事情有关,即

p("University"|"I","love","NanJing" )=p("University"|"NanJing")

这样,“NanJing University”同时出现的概率要比"I love NanJing University"大的多,这很大程度上缓解了数据稀疏性带来的影响,当然也有一些平滑的手段来缓解数据稀疏的问题,这里不去过多讨论。那么,刚才的例子,我们就可以表示为: 

 p("I love NanJing University")=p("l")p("love"|"I")p("NanJing"|"love")p("University"|"NanJing" )

这样与前面1个词有关的我们称为一阶马尔科夫假设(2-gram),若与前面2个词有关则为二阶马尔科夫假设(3-gram)。而具体的概率计算则为: 

 p("I")=\frac{count("I")}{\sum_{word \in V }count(word)}

其中count函数表示语料库中单词出现的次数,V表示为预料中所有的单词。而条件概率函数函数的计算如下: 

p("love"|"I")=\frac{count("I love")}{count("I")}


2.神经网络语言模型

不像图像,其本身输入到计算机中是矩阵,矩阵里的数字就隐含了其各种各样的特征,这些特征可以通过模型去学习和捕捉。而文本的输入,是字符串,这是计算机处理不了的,所以当初人们首先想到的就是独热编码,第一是这样就可以将文本转化为数字,计算机能进行处理;第二就是每个词都可以独一无二的被表示。但是这种表示丢失了词的一个很重要的特征,即语义。为了进行语义信息,联想到了分布式表示,分布式表示一个很重要的核心思想是:语义相近的词在高纬度上是相互接近的。这里用一个简单的例子来感受一下分布式表示的魅力:

比如,我们要表示三样东西“红色的正三角形”,“红色的圆正方形”,“绿色的正三角形”,如果用one-hot编码表示,则分别为[1,0,0],[0,1,0],[0,0,1]。可以发现若这样表示,三个向量在三维空间上彼此正交,其之间的潜在特征将会因为这样的表示而消失。若我们在3维空间上,第一个维度空间表示颜色(红色0绿色1),第二个维度空间上表示圆和正(正0圆1),第三个维度空间上表示形状(三角形0正方形1),那么此时这三个向量可以表示为[0,0,0],[0,1,1],[1,0,0],我们发现,这三个向量彼此之间就存在了联系,若在来一个“绿色的圆三角形”,我们也可以轻松的表示为 [1,1,0],而不是独热编码的所有向量由三维变成思维。这也是独热编码的另一个致命缺陷,数据过于稀疏。

下面一个重点问题就是,到底如何用分布式表示来表示词呢,也可以说是词表征问题。最原始的做法就是神经网络语言模型(Neural network language model,nnml),其一个精华部分在于:表面上模型用于预测下一个词,但其目的在于通过训练任务,使得训练后的语义接近的词向量在高纬空间上相互接近。nnml具体的构造如下:

 

还是以上面的例子“I love NanJing University”为例(假设我们的语料库也只有这一句话,4个单词),此时假设我们输入前面三个“I love NanJing”,来预测“University”。我们可以发现网络一共大致可以看做有四层,分别为输入层、投影层、隐藏层、以及输出层,左图也可以清晰的有四层,以下我们一层一层解析,并且分析每层的复杂度:

输入层:输入层输入的是词的one-hot编码,那么我们输入的三次词分别是: 

x_1=[1,0,0,0],x_2=[0,1,0,0],x_3=[0,0,1,0]

当然我们在真正计算的时候,肯定是以一个矩阵的形式,因此我们将输入合并写在一起则是: 

X_{input}=[x_1,x_2,x_3], X_{input} \in R^{3 \times vocab\_size}

为什么输入要进行one-hot编码呢?这是为了投影层所服务,投影层为细说这样的好处,现在我们就先简单知道输入层是每个词的one-hot编码,那么我们的输入。此层无参数,复杂度为0。

投影层:顾名思义,就是找出每个词向量在这一层的投影,投影层经历了一个线性变化:  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值