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

简介: 基于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)在投影上的距离很远

4efd29e00b0c8c41838efbc147607bde.png


图1. 词向量的二维投影

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


7e928396b73dca000f36a6b137ad9e95.png

以上结果可以通过运行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个词的影响,则有:

1011ee2768dcec3818051396fd8dbb5b.png


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

738a3b043cb49196f2cf4ed025b4fbb1.png目标函数:


 其中

bec6e1a86bb38b1463d7a119cd591a58.png

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


95bd10ce3c85bcf6bd3d0e78b4e45eee.png

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


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




,输出句子第t个词在字典中|V|个词上的概率分布。每个输入词首先通过映射矩阵映射到词


 。


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


38d3621e48e673ce18dd63174abd0738.png


为所有词语的词向量拼接成的大向量,表示文本历史特征;θ、U、、和W分别为词向量层到隐层连接的参数。表示未经归一化的所有输出单词概率,表示未经归一化的字典中第个单词的输出概率。 • 根据softmax的定义,通过归一化, 生成目标词的概率为


68197a10d05020576b2b19b2d83e0810.png


整个网络的损失值(cost)为多类分类交叉熵,用公式表示为



873986dee6707634337515074f028945.png

表示第个样本第类的真实标签(0或1),softmax()表示第个样本第类softmax输出的概率。

  Continuous Bag-of-Words model(CBOW)

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


6621994b7aa2207e5c385e5b9adffdfc.png



图3. CBOW模型

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

eb6d15a8ca32a6e9c91679c239dff0f7.png


为第个词的词向量,分类分数(score)向量=∗context,最终的分类采用softmax,损失函数采用多类分类交叉熵。


 Skip-gram model


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



b58ba75dbeb6210fd68b021eb2f3b202.png



图4. Skip-gram模型


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




个词的词向量(表示当前输入词的前后各个词),然后分别通过softmax得到这个词的分类损失值之和。


 数据准备


 数据介绍


 本教程使用Penn Treebank (PTB)(经Tomas Mikolov预处理过的版本)数据集。PTB数据集较小,训练速度快,应用于Mikolov的公开语言模型训练工具[2]中。其统计情况如下:

8f2b35a55f63160949cfbae31ab33f2a.png


数据预处理


本教程训练的是5-gram模型,表示在PaddlePaddle训练时,每条数据的前4个词用来预测第5个词。PaddlePaddle提供了对应PTB数据集的python包paddle.dataset.imikolov,自动完成数据的下载与预处理,方便大家使用。


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


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



cc4bca55b8e214c067571dc238cf5817.png

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

  模型结构

  本配置的模型结构如下图所示:



2ea775a13358a1f2d7ae976bc584d574.png

图5. 模型配置中的N-gram神经网络模型

  首先我们先加载所需的包


683bd84bf82dec2a0d52579dea0fd37b.png

然后,定义参数


3c3dfca08ea28279c91a33e3fb1fb045.png

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


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


0dc145a5bbe08314107de467f2474d29.png

基于以上的神经网络结构,我们可以如下定义我们的训练方法

ca29f0aad8069dcbac8087375ed549d9.png

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





1d3ce5585a5074d943fa922fe624baff.png




f15f544bef573aa889d70eb9eeefb413.png



f8fec2b0d686a2574e77150f7e2aa729.png



d099aa0e49efa9147136d016f72db1bd.png


train_loop将会开始训练。期间打印训练过程的日志如下:

249d9f37c0723765faa09ac8c829b858.png


预测下一个词的配置

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


e842aa6c3b343b78008337002e56931d.png



aa11609e861e1cf7b91ee87ad2a51d9f.png

c379599e8d39b35ad46337b7c71efa49.png



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


736f67f9719a775f1606c1c21d01618c.png

b39c69c02c1e7a25b89f9a10eb2003a2.png

整个程序的入口很简单:


b39c69c02c1e7a25b89f9a10eb2003a2.png


 总结

  在本教程中,我们最开始先介绍了词向量、语言模型和词向量的关系、以及如何通过训练神经网络模型获得词向量。在信息检索中,我们可以根据向量间的余弦夹角,来判断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.




















相关文章
|
3月前
|
机器学习/深度学习 数据采集 人工智能
《零基础实践深度学习》基于线性回归实现波士顿房价预测任务1.3.3
这篇文章详细介绍了如何使用线性回归算法实现波士顿房价预测任务,包括数据读取、形状变换、集划分、归一化处理、模型设计、前向计算以及损失函数的计算等步骤,并提供了相应的Python代码实现。
 《零基础实践深度学习》基于线性回归实现波士顿房价预测任务1.3.3
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
46 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
23天前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
54 2
|
1月前
|
机器学习/深度学习 存储 自然语言处理
深度学习之任务序列中的快速适应
基于深度学习的任务序列中的快速适应是指模型在接连处理不同任务时,能够迅速调整和优化自身以适应新任务的能力。这种能力在动态环境和多任务学习中尤为重要,旨在减少训练时间和资源需求。
34 3
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深入浅出深度学习:从基础到实战
【9月更文挑战第19天】本文将带你走进深度学习的世界,从基础概念入手,逐步深入到实战应用。我们将通过简单易懂的语言和生动的比喻,让你轻松理解深度学习的原理和应用场景。同时,我们还为你准备了一些实用的代码示例,帮助你快速入门深度学习,开启你的AI之旅。
59 10
|
2月前
|
机器学习/深度学习 人工智能 算法
操作系统的未来:从多任务到深度学习的演变之路
本文将探讨操作系统如何从处理简单多任务发展到支持复杂的深度学习任务。我们将分析现代操作系统面临的新挑战,以及它们如何适应人工智能和大数据时代的要求。文章不仅回顾过去,也展望未来,思考操作系统在技术演进中的角色和方向。
57 3
|
3月前
|
机器学习/深度学习 算法 前端开发
《零基础实践深度学习》波士顿房价预测任务1.3.3.5 总结
使用Numpy实现梯度下降算法来构建和训练线性模型进行波士顿房价预测的过程,并提供了模型保存的方法,同时提出了几个关于梯度计算、参数更新和神经网络训练的作业题目。
 《零基础实践深度学习》波士顿房价预测任务1.3.3.5 总结
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习:从基础到实战
【9月更文挑战第23天】本文将带你走进深度学习的世界,从基本概念到实际应用,一步步揭示深度学习的神秘面纱。我们将通过实例和代码示例,帮助你理解和掌握深度学习的核心技术和方法。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起探索深度学习的奥秘吧!
39 0
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
58 0
|
3月前
|
机器学习/深度学习 算法 数据处理
《零基础实践深度学习》波士顿房价预测任务1.3.3.4训练过程
这篇文章详细阐述了如何使用线性回归对波士顿房价进行预测,包括构建神经网络模型、数据处理、模型设计、训练过程、梯度下降法以及随机梯度下降法(SGD)的应用,并提供了完整的Python代码实现。