您好、欢迎来到现金彩票网!
当前位置:双彩网 > 向量 >

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

发布时间:2019-06-08 03:29 来源:未知 编辑:admin

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

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

  在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较,我们往往把词表示成计算机适合处理的方式。最自然的方式莫过于向量空间模型 (vector space model)。在这种方式里,每个词被表示成一个实数向量 (one-hot vector),其长度为字典大小,每个维度对应一个字典里的每个词,除了这个词对应维度上的值是 1,其他元素都是 0。One-hot vector 虽然自然,但是用处有限。比如,在互联网广告系统里,如果用户输入的 query 是「母亲节」,而有一个广告的关键词是「康乃馨」。按照常理,我们知道这两个词之间是有联系的——母亲节通常应该送给母亲一束康乃馨;但是这两个词对应的 one-hot vectors 之间的距离度量,无论是欧氏距离还是余弦相似度 (cosine similarity),由于其向量正交,都认为这两个词毫无相关性。得出这种与我们相悖的结论的根本原因是:每个词本身的信息量都太小。所以,仅仅给定两个词,不足以让我们准确判别它们是否相关。要想精确计算相关性,我们还需要更多的信息——从大量数据里通过机器学习方法归纳出来的知识。

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

  词向量模型可以是概率模型、共生矩阵 (co-occurrence matrix) 模型或神经元网络模型。在用神经网络模型求词向量之前,传统的做法是统计一个词语的共生矩阵 X,在对 X 做矩阵分解,得到了所有词的词向量。但是传统的方法有三大问题:1) 由于很多词没有出现,导致矩阵极其稀疏;2) 矩阵非常大,维度太高;3) 需要手动去掉停用词 (如 although, a,...),不然这些频繁出现的词也会影响矩阵分解的效果。但是基于神经网络的模型不需要计算和存储一个在全语料上统计产生的大表,而是通过学习语义信息得到词向量,因此能很好地解决以上问题。

  本教程旨在展示神经网络训练词向量的细节,以及如何用 PaddlePaddle 训练一个词向量模型。

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

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

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

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

  在计算语言学中,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 个词的概率和该句线 个词相关。可实际上越远的词语其实对该词的影响越小,那么如果考虑一个 n-gram, 每个词都只受其前面 n-1 个词的影响,则有:

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

  图 2 展示了 N-gram 神经网络模型,从下往上看,该模型分为以下几个部分: - 对于每个样本,模型输入

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

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

  具体来说,不考虑上下文的词语输入顺序,CBOW 是用上下文词语的词向量的均值来预测当前词。即:

  CBOW 的好处是对上下文词语的分布在词向量上进行了平滑,去掉了噪声,因此在小数据集上很有效。而 Skip-gram 的方法中,用一个词预测其上下文,得到了当前词上下文的很多样本,因此可用于更大的数据集。

  如上图所示,Skip-gram 模型的具体做法是,将一个词的词向量映射到

  预处理会把数据集中的每一句话前后加上开始符号以及结束符号。然后依据窗口大小 (本教程中为 5),从头到尾每次向右滑动窗口并生成一条数据。

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

  更大的 BATCH_SIZE 将使得训练更快收敛,但也会消耗更多内存。由于词向量计算规模较大,如果环境允许,请开启使用 GPU 进行训练,能更快得到结果。在新的 Fluid 版本里,我们不必再手动计算词向量。PaddlePaddle 提供了一个内置的方法ers.embedding,我们就可以直接用它来构造 N-gram 神经网络。

  现在,我们来定义我们的 N-gram 神经网络结构。这个结构在训练和预测中都会使用到。因为词向量比较稀疏,我们传入参数 is_sparse == True, 可以加速稀疏矩阵的更新。

  现在我们可以开始训练啦。我们有现成的训练和测试集:paddle.dataset.imikolov.train() 和 paddle.dataset.imikolov.test()。两者都会返回一个读取器。paddle.batch 会读入一个读取器,然后输出一个批次化了的读取器。我们还可以在训练过程中输出每个步骤,批次的训练情况。

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

  由于词向量矩阵本身比较稀疏,训练的过程如果要达到一定的精度耗时会比较长。为了能简单看到效果,教程只设置了经过很少的训练就结束并得到如下的预测。我们的模型预测 among a group of 的下一个词是 the。这比较符合文法规律。如果我们训练时间更长,比如几个小时,那么我们会得到的下一个预测是 workers。预测输出的格式如下所示:

  其中第一行表示预测词在词典上的概率分布,第二行表示概率最大的词对应的 id,第三行表示概率最大的词。

  在本教程中,我们最开始先介绍了词向量、语言模型和词向量的关系、以及如何通过训练神经网络模型获得词向量。在信息检索中,我们可以根据向量间的余弦夹角,来判断 query 和文档关键词这二者间的相关性。在句法分析和语义分析中,训练好的词向量可以用来初始化模型,以得到更好的效果。在文档分类中,有了词向量之后,可以用聚类的方法将文档中同义词进行分组,也可以用 N-gram 来预测下一个词。希望大家在阅读完本教程能够自行运用词向量进行相关领域的研究。

  公司地址:北京市朝阳区酒仙桥路4号751 D·Park正东集团院内 C8座105室 极客公园

http://chinoamobi.com/xiangliang/119.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有