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

news2024/11/27 18:43:40

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

  在这些互联网服务里,我们经常要比较两个词或者两段文本之间的相关性。为了做这样的比较,我们往往把词表示成计算机适合处理的方式。最自然的方式莫过于向量空间模型(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,即相关性和余弦值大小成正比。因此我们还可以计算两个词向量的余弦相似度:

  以上结果可以通过运行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神经网络模型,从下往上看,该模型分为以下几个部分: - 对于每个样本,模型输入

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

  。

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

   其中,

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

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

  其中

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

  Continuous Bag-of-Words model(CBOW)

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

图3. CBOW模型

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

  其中

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

  Skip-gram model

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

图4. Skip-gram模型

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

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

  数据准备

  数据介绍

  本教程使用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神经网络模型

  首先我们先加载所需的包

  然后,定义参数

  更大的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。预测输出的格式如下所示:

  整个程序的入口很简单:

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw== 编辑

  总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CRM管理系统有哪些优势?在企业中有什么作用?

CRM管理系统有哪些优势?在企业中有什么作用? 其实,公司上crm管理系统不仅不会增加员工负担,还能提升员工满意度、赋能员工。当然,前提是一款优质的CRM管理系统。 那么,一款优质的CRM管理系统一般具备哪些…

45.Promise,async,await

目录 1 Promise 1.1 状态 1.2 then 1.3 任务的优先级 1.4 连续then 1.4.1 then()的返回值也是一个Promise对象 1.4.2 默认情况下,在第一个then之后,会执行第二个then的成功函数 1.4.3 then的value可以用返回值传递 1.4.4 通过then的返…

为什么老年人会经常性出现吃饭呛咳的情况 什么因素导致的

其实很多老年人在吃饭或是喝水的时候,都存在吞咽困难的问题,呛咳或者是忘了如何下咽。其实在老年人群体当中,这也是一种较为常见的现象,但是很多人都把这种现象当回事。 对于呛咳的现象是很好判断的,在家里老人喝水或是…

专注区块链底层技术突破,“复杂美”用技术开源推动产业未来

杭州复杂美科技有限公司(以下简称:复杂美)成立于2008年,是一家致力于高性能撮合技术研发的区块链底层技术提供商,专注于区块链撮合系统、区块链清算系统的应用与推广。 公司于2013年启动区块链、智能合约的研发应用&am…

PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类

“工欲善其事,必先利其器”。如果直接使用 Python 完成模型的构建、导出等工作,势必会耗费相当多的时间,而且大部分工作都是深度学习中共同拥有的部分,即重复工作。所以本案例为了快速实现效果,就直接使用将这些共有部…

36岁大龄程序员被裁,找了2个月工作,年包从100万降到50万,要不要接?

为了找到工作,你愿意接受降薪多少?一位36岁的杭州程序员问:36岁被裁,找了2个月工作,年包从100万降到50万,真心纠结,要不要接?网友们分成了旗帜鲜明的两派,一派人认为不要…

【数学模型】欧拉公式和证明

一、说明 在图型学中,欧拉公式很有用处,比如皮克定律也可以用欧拉公式证明。本篇介绍欧拉公式的定义和三个证明过程。 二、欧拉公式 在任何一个规则球面地图上,用 R记区域个 数 ,V记顶点个数 ,E记边界个数 &#xff0c…

BGP基础知识

今天海翎光电的小编主要介绍一下BGP的相关基础知识,文章浅显易懂,适合对BGP完全没有了解的同学。 BGP介绍 边界网关协议BGP(Border Gateway Protocol)是一种实现自治系统AS(Autonomous System)之间的路由可…

【cmake篇】选择编译器及设置编译参数

实际开发的过程中,可能有多个版本的编译器,不同功能可能需要设置不同的编译参数。 参考博客链接:选择编译器及设置编译器选项 目录 一、选择编译器 1、查看系统中已有的编译器 2、选择编译器的两种方式 二、设置编译参数 1、add_compi…

CSSOM和CSSOM View

CSSOM和CSSOM View这两个我都不是熟悉的领域。 1.描述样式表和规则等 CSS 的模型部分(CSSOM) cssom中document.styleSheets :获取文档中所有的样式(只读),这个不常见,不做过多的介绍 2.元素视图…

科普|汽车毫米波雷达的规定和标准 微功率短距离无线电发射SRRC认证

01 — 24-24.25 GHz 上一篇提到,在我国《微功率短距离无线电发射设备目录和技术要求》中,保留了24-24.25 GHz的频段作为H类设备,可以用于汽车雷达,它的发射功率限值是:20mW (e.i.r.p),近似为13dBm。除了…

【Open CASCADE -生成MFC和QT事例方式】

源代码目录 adm目录:包含编译OCCT的相关工程; adm/cmake目录:包含使用CMake构建OCCT的相关处理脚本; adm/msvc目录:包含window平台 Visual C 2010, 2012, 2013, 2015, 2017 and 2019等版本的32/64平台solutinon文件; data目录: 包…

ESP32驱动1.28寸GC9A01播放视频(二、程序说明和效果展示)

ESP32驱动1.28寸GC9A01播放视频(二、程序下载和效果展示)1.28寸GC9A01屏幕屏幕引脚定义程序说明程序更改1、Arduino_DataBus *bus和Arduino_GC9A01 *gfx要改成ESP32匹配的2、SPI库的SPI.cpp文件中的“SPIClass::begin”函数中,引脚定义需要跟…

分布式跟踪系统

分布式跟踪系统 背景 当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器&#xff0…

护眼灯真的可以保护眼睛吗?推荐五款达到护眼级别的灯

护眼灯是可以起到一定的保护视力的作用。 普通的台灯的出现是为了照明,它的功能只要照明。像眩光、频闪、蓝光等是普通台灯所存在的问题,而这些问题会造成我们的眼睛近视,所以在我国近年来青少年近视率越来越高的重要原因之一。 护眼灯就优化…

对比斐波那契和快排时间复杂度

斐波那契数列时间复杂度 ​ // 计算斐波那契递归Fib的时间复杂度&#xff1f; long long Fib(size_t N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); }Fib()递归高度是N&#xff0c;那它最后一层就是2^(N-1) 如果N50&#xff0c;最后一层是2^(49)一个恐怖的值 更恐怖…

手撕Udp套接字|实现群聊通信|实现Windows Linux通信交互

​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482UdpSockethttps://github.com/Yufccode/BitCode/tree/main/Linux/%E4%BB%A3%E7%A0%81/0215Udp%E5%A5%97%E6%8E%A5%E5%AD%97 README 本项目通过Linux套接字编程&…

AiDD AI+软件研发数字峰会开启编程新纪元

随着OpenAI 推出全新的对话式通用人工智能工具——ChatGPT火爆出圈后&#xff0c;人工智能再次受到了工业界、学术界的广泛关注&#xff0c;并被认为向通用人工智能迈出了坚实的一步&#xff0c;在众多行业、领域有着广泛的应用潜力&#xff0c;甚至会颠覆很多领域和行业&#…

go+vue——基于gin框架和gorm的web开发实战

govue——基于gin框架和gorm的web开发实战gin框架视频、资料、笔记安装Go环境&#xff0c; 添加环境变量&#xff08;可能自动添加好&#xff09;下载 Go环境变量goland 报错&#xff1a; GOROOT is not defined创建项目&#xff1a;Golang中的GoPath和GoModule什么是GoPath&am…

kafka安装

kafka安装前置将压缩包拷贝到虚拟机中解压改名更改server.properties启动先启动zookeeper非静默启动。会占用一个黑窗口再启动一个窗口&#xff0c;用jps查看静默启动 加一个-daemon另一种静默启动操作命令创建消息队列查看消息队列创建副本&#xff08;备份&#xff09;单机版…