主页 > Python结构 > 正文

依据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)在投影上的间隔很远

图1. 词向量的二维投影

  另一方面,咱们知道两个向量的余弦值在[−1,1][−1,1]的区间内:两个彻底相同的向量余弦值为1, 两个彼此笔直的向量之间余弦值为0,两个方向彻底相反的向量余弦值为-1,即相关性和余弦值巨细成正比。因而咱们还可以核算两个词向量的余弦类似度:

https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/2d_similarity.png?raw=true

  以上成果可以经过运转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个词的影响,则有:

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

  其间表明依据前史n-1个词得到当时词的条件概率,R(θ)表明参数正则项。

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

  图2展现了N-gram神经网络模型,从下往上看,该模型分为以下几个部分: - 关于每个样本,模型输入https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/nnlm.png?raw=true,输出语句第t个词在字典中|V|个词上的概率散布。每个输入词https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/nnlm.png?raw=true首要经过映射矩阵映射到词

  。

  • 然后一切词语的词向量拼接成一个大向量,并经过一个非线性映射得到前史词语的隐层表明

   其间,为一切词语的词向量拼接成的大向量,表明文本前史特征;θ、U、和W别离为词向量层到隐层衔接的参数。表明未经归一化的一切输出单词概率,表明未经归一化的字典中第个单词的输出概率。 • 依据softmax的界说,经过归一化, 生成方针词的概率为

  • 整个网络的丢失值(cost)为多类分类穿插熵,用公式表明为

  其间表明第个样本第类的实在标签(0或1),softmax()表明第个样本第类softmax输出的概率。

  Continuous Bag-of-Words model(CBOW)

  CBOW模型经过一个词的上下文(各N个词)猜测当时词。当N=2时,模型如下图所示:

图3. CBOW模型

  详细来说,不考虑上下文的词语输入次序,CBOW是用上下文词语的词向量的均值来猜测当时词。即:

https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/cbow.png?raw=true

  其间为第个词的词向量,分类分数(score)向量=∗context,终究的分类选用softmax,丢失函数选用多类分类穿插熵。

  Skip-gram model

  CBOW的优点是对上下文词语的散布在词向量进步行了滑润,去掉了噪声,因而在小数据集上很有用。而Skip-gram的办法中,用一个词猜测其上下文,得到了当时词上下文的许多样本,因而可用于更大的数据集。

图4. Skip-gram模型

  如上图所示,Skip-gram模型的详细做法是,将一个词的词向量映射到https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/skipgram.png?raw=true个词的词向量(https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/skipgram.png?raw=true表明当时输入词的前后各个词),然后别离经过softmax得到这https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/skipgram.png?raw=true个词的分类丢失值之和。

  数据预备

  数据介绍

  本教程运用Penn Treebank (PTB)(经Tomas Mikolov预处理过的版别)数据集。PTB数据集较小,练习速度快,运用于Mikolov的揭露言语模型练习东西[2]中。其核算状况如下:

  数据预处理

  本教程练习的是5-gram模型,表明在PaddlePaddle练习时,每条数据的前4个词用来猜测第5个词。PaddlePaddle供给了对应PTB数据集的python包paddle.dataset.imikolov,主动完结数据的下载与预处理,便利咱们运用。

  预处理会把数据会集的每一句话前后加上开端符号以及完毕符号。然后依据窗口巨细(本教程中为5),自始至终每次向右滑动窗口并生成一条数据。

  如"I have a dream that one day" 一句供给了5条数据:

  最终,每个输入会按其单词次在字典里的方位,转化成整数的索引序列,作为PaddlePaddle的输入。

  模型结构

  本装备的模型结构如下图所示:

图5. 模型装备中的N-gram神经网络模型

  首要咱们先加载所需的包

https://github.com/PaddlePaddle/book/blob/develop/04.word2vec/image/ngram.png?raw=true

  然后,界说参数

  更大的BATCH_SIZE将使得练习更快收敛,但也会耗费更多内存。因为词向量核算规划较大,假如环境答应,请敞开运用GPU进行练习,能更快得到成果。在新的Fluid版别里,咱们不用再手动核算词向量。PaddlePaddle供给了一个内置的办法fluid.layers.embedding,咱们就可以直接用它来结构 N-gram 神经网络。

  现在,咱们来界说咱们的 N-gram 神经网络结构。这个结构在练习和猜测中都会运用到。因为词向量比较稀少,咱们传入参数 is_sparse == True, 可以加快稀少矩阵的更新。

  依据以上的神经网络结构,咱们可以如下界说咱们的练习办法

  现在咱们可以开端练习啦。咱们有现成的练习和测验集:paddle.dataset.imikolov.train()和paddle.dataset.imikolov.test()。两者都会回来一个读取器。paddle.batch 会读入一个读取器,然后输出一个批次化了的读取器。咱们还可以在练习进程中输出每个进程,批次的练习状况。

  train_loop将会开端练习。期间打印练习进程的日志如下:

  猜测下一个词的装备

  咱们可以用咱们练习过的模型,在得知之前的 N-gram 后,猜测下一个词。

  因为词向量矩阵自身比较稀少,练习的进程假如要到达必定的精度耗时会比较长。为了能简略看到作用,教程只设置了经过很少的练习就完毕并得到如下的猜测。咱们的模型猜测 among a group of 的下一个词是the。这比较契合文法规则。假如咱们练习时刻更长,比方几个小时,那么咱们会得到的下一个猜测是 workers。猜测输出的格局如下所示:

  其间榜首行表明猜测词在词典上的概率散布,第二行表明概率最大的词对应的id,第三行表明概率最大的词。

  整个程序的进口很简略:

  总结

  在本教程中,咱们最开端先介绍了词向量、言语模型和词向量的联系、以及怎么经过练习神经网络模型取得词向量。在信息检索中,咱们可以依据向量间的余弦夹角,来判别query和文档关键词这二者间的相关性。在句法剖析和语义剖析中,练习好的词向量可以用来初始化模型,以得到更好的作用。在文档分类中,有了词向量之后,可以用聚类的办法将文档中近义词进行分组,也可以用 N-gram 来猜测下一个词。期望咱们在阅读完本教程可以自行运用词向量进行相关范畴的研讨。

  参考文献

  [1]Bengio Y, Ducharme R, Vincent P, et al. A neural probabilistic language model[J]. journal of machine learning research, 2003, 3(Feb): 1137-1155.

  [2]Mikolov T, Kombrink S, Deoras A, et al. Rnnlm-recurrent neural network language modeling toolkit[C]//Proc. of the 2011 ASRU Workshop. 2011: 196-201.

  [3]Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprint arXiv:1301.3781, 2013.

  [4]Maaten L, Hinton G. Visualizing data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(Nov): 2579-2605.


上一篇:依据PaddlePaddle的图片分类实战 | 深度学习根底使命教程系列
下一篇:PaddlePaddle晋级解读|十余行代码完结搬迁学习 PaddleHub实战篇

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854