基于PaddlePaddle的词向量实战 | 深度学习基础任务教程系列(二)

词向量是自然语言处理中常见的一个操作,是搜索引擎、广告系统、推荐系统等互联网服务背后常见的基础技术。

 

在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较,我们往往把词表示成计算机适合处理的方式。最自然的方式莫过于向量空间模型(vector space model)。在这种方式里,每个词被表示成一个实数向量(one-hot vector),其长度为字典大小,每个维度对应一个字典里的每个词,除了这个词对应维度上的值是1,其他元素都是0。One-hot vector虽然自然,但是用处有限。比如,在互联网广告系统里,如果用户输入的query是“母亲节”,而有一个广告的关键词是“康乃馨”。

 

按照常理,我们知道这两个词之间是有联系的——母亲节通常应该送给母亲一束康乃馨;但是这两个词对应的one-hot vectors之间的距离度量,无论是欧氏距离还是余弦相似度(cosine similarity),由于其向量正交,都认为这两个词毫无相关性。得出这种与我们相悖的结论的根本原因是:每个词本身的信息量都太小。所以,仅仅给定两个词,不足以让我们准确判别它们是否相关。要想精确计算相关性,我们还需要更多的信息——从大量数据里通过机器学习方法归纳出来的知识。

 

在机器学习领域,通过词向量模型(word embedding model)可将一个one-hot vector映射到一个维度更低的实数向量(embedding vector),如:

 

  •  
  •  
embedding(母亲节)=[0.3,4.2,−1.5,...];	
embedding(康乃馨)=[0.2,5.6,−2.3,...];

 

在这个映射到的实数向量表示中,两个语义(或用法)上相似的词对应的词向量“更像”,这样如“母亲节”和“康乃馨”的对应词向量的余弦相似度就不再为零了。

 

词向量模型可以是概率模型、共生矩阵(co-occurrence matrix)模型或神经元网络模型。在用神经网络模型求词向量之前,传统的做法是统计一个词语的共生矩阵X,在对X做矩阵分解,得到了所有词的词向量。

 

但是传统的方法有三大问题:1)由于很多词没有出现,导致矩阵极其稀疏;2)矩阵非常大,维度太高;3)需要手动去掉停用词(如although, a,...),不然这些频繁出现的词也会影响矩阵分解的效果。

 

而基于神经网络的模型不需要计算和存储一个在全语料上统计产生的大表,是通过学习语义信息得到词向量,因此能很好地解决以上问题。本教程旨在展示神经网络训练词向量的细节,以及如何用PaddlePaddle训练一个词向量模型。

 

项目地址:

http://paddlepaddle.org/documentation/docs/zh/1.3/beginners_guide/basics/word2vec/index.html

 

基于PaddlePaddle训练一个词向量模型操作详情请参照Github:

https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/README.cn.md

 

效果展示

当词向量训练好后,我们可以用数据可视化算法t-SNE[4]画出词语特征在二维上的投影(如下图所示)。从图中可以看出,语义相关的词语(如a, the, these; big, huge)在投影上距离很近,语意无关的词(如say, business; decision, japan)在投影上的距离很远

 

640?wx_fmt=png

图1. 词向量的二维投影

 

另一方面,我们知道两个向量的余弦值在[−1,1][−1,1]的区间内:两个完全相同的向量余弦值为1, 两个相互垂直的向量之间余弦值为0,两个方向完全相反的向量余弦值为-1,即相关性和余弦值大小成正比。因此我们还可以计算两个词向量的余弦相似度:

 

 
please input two words: big huge	
similarity: 0.899180685161	
	
please input two words: from company	
similarity: -0.0997506977351

以上结果可以通过运行calculate_dis.py加载字典里的单词和对应训练特征结果得到,我们将在模型应用中详细描述用法。

 

模型概览

在这里我们介绍三个训练词向量的模型:N-gram模型,CBOW模型和Skip-gram模型,它们的中心思想都是通过上下文得到一个词出现的概率。对于N-gram模型,我们会先介绍语言模型的概念,并在之后的训练模型中,带大家用PaddlePaddle实现它。而后两个模型,是近年来最有名的神经元词向量模型,由Tomas Mikolov 在Google 研发[3],虽然它们很浅很简单,但训练效果很好。

 

N-gram neural model

在计算语言学中,N-gram是一种重要的文本表示方法,表示一个文本中连续的n个项。基于具体的应用场景,每一项可以是一个字母、单词或者音节。N-gram模型也是统计语言模型中的一种重要方法,用N-gram训练语言模型时,一般用每个N-gram的历史n-1个词语组成的内容来预测第n个词。

 

Yoshua Bengio等科学家就于2003年在著名论文Neural Probabilistic Language Models [1]中介绍如何学习一个神经元网络表示的词向量模型。文中的神经概率语言模型(Neural Network Language Model,NNLM)通过一个线性映射和一个非线性隐层连接,同时学习了语言模型和词向量,即通过学习大量语料得到词语的向量表达,通过这些向量得到整个句子的概率。

 

因所有的词语都用一个低维向量来表示,用这种方法学习语言模型可以克服维度灾难(curse of dimensionality)。一句话中第t个词的概率和该句话的前t−1个词相关。可实际上越远的词语其实对该词的影响越小,那么如果考虑一个n-gram, 每个词都只受其前面n-1个词的影响,则有:

640?wx_fmt=png

给定一些真实语料,这些语料中都是有意义的句子,N-gram模型的优化目标则是最大化目标函数:

640?wx_fmt=png

其中f(Wt,Wt-1,...,Wt-n+1)表示根据历史n-1个词得到当前词Wt的条件概率,R(θ)表示参数正则项。

 

640?wx_fmt=png

图2. N-gram神经网络模型

 

图2展示了N-gram神经网络模型,从下往上看,该模型分为以下几个部分:-对于每个样本,模型输入Wt-n+1,...,Wt-1,输出句子第t个词在字典中|V|个词上的概率分布。每个输入词Wt-n+1,...,Wt-1首先通过映射矩阵映射到词C(Wt-n-1),...,C(Wt-1)。然后所有词语的词向量拼接成一个大向量,并经过一个非线性映射得到历史词语的隐层表示

640?wx_fmt=png

其中,x为所有词语的词向量拼接成的大向量,表示文本历史特征;θ、U、b1、b2和W分别为词向量层到隐层连接的参数。g表示未经归一化的所有输出单词概率,gi表示未经归一化的字典中第i个单词的输出概率。

 

根据softmax的定义,通过归一化gi, 生成目标词Wt的概率为

640?wx_fmt=png

 

整个网络的损失值(cost)为多类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值