NLP之词向量
1.对词用独热编码进行表示的缺点
向量的维度会随着句子中词的类型的增大而增大,最后可能会造成维度灾难2、任意两个词之间都是孤立的,仅仅将词符号化,不包含任何语义信息,根本无法表示出在语义层面上词与词之间的相关信息,而这一点是致命的。
2.用向量代表词的好处
3.词嵌入的由来
在上文中提过,one-hot 表示法具有维度过大的缺点,那么现在将 vector 做一些改进:
1、将 vector 每一个元素由整形改为浮点型,变为整个实数范围的表示;
2、将原来稀疏的巨大维度压缩嵌入到一个更小维度的空间。这也是词向量又名词嵌入的缘由了。
4.传统的Embedding技术
最早的分布式词向量是作为副产物产出的。在https://www.cnblogs.com/dyl222/p/11005948.html中的神经网络语言模型中有详细的介绍。
5.Word2vec
为了克服传统的Embedding技术中参数过多的问题,大名鼎鼎的Word2vec对神经网络语言模型进行了改进。
Word2vec有两种训练模式CBOW以及skip-gram,有两种优化方法,层次化的softmax以及负采样。其中速度最快的组合是CBOW+负采样,在下文的Word2vec的详细解析中会介绍为什么,同时这也是通过gensim包中的Word2vec训练词向量的默认方法。
优点:
通过Word2vec获得的词向量是在低维空间的分布式表示(何为分布式表示:分布式表示(distributed representation)描述的是把信息分布式地存储在向量的各个维度中),其中包含丰富的语法和语义信息。
缺点:
1)词向量的解释性太差。
2)对于CBOW模型,在训练阶段中心词的词向量是把窗口大小内上下文的词向量相加作为输入,显然这忽略了文本的序列信息。
3)无法获得文本的情感信息,例如好,坏这两个词其使用的语境基本相同,训练出的这两个词向量会十分相似,但是其表示的情感意思却完全的相反。要获得情感信息需要大量标注好的语料。需要包含词不同情感得分的句子作为训练语料以获得这个词的词向量,需要大量的相关语料。
4)其最主要的问题是无法获得语境信息从而无法解决一词多义的问题,因为通过Word2vec所训练出的词向量是静态的,对于一个词无论其所处的语言环境如何最终都用相同的词向量表示。
Word2vec的详细解析(参考https://www.cnblogs.com/pinard/category/894695.html,个人从他的博客中学到了很多知识)
1)CBOW+层次化的softmax
整体结构图如下:
该结构所创建的语言模型是根据中心词汇窗口大小内的词预测该词。具体过程如下:
随机初始化所有词的词向量,根据训练样本结合词频建立霍夫曼树,设定一个滑动窗口,每次以一个窗口内的文本作为训练样本,树的叶子节点代表一个个词,训练样本中有多少不同的词就有多少个叶子节点。每次训练树的树根是训练样本中心词其窗口大小内上下文词其词向量的均值,从树根往下每次都是一个通过Logistic进行二分类的过程,正类的霍夫曼编码为0,负类的霍夫曼编码为1,每个训练样本的学习策略是使得从树根到中心词这个叶子节点的概率值最大,具体为使得一次次Logistic回归其值的乘积最大,以对数似然函数作为损失函数,通过梯度下降法对每次Logistic回归中的参数进行更新,同时以路径上所有梯度之和对窗口大小内的上下文词向量进行更新(注意并不是对中心词的值进行更新),非叶子节点代表的是参数,对于相同的训练样本参数是相同的。
2)Skip_gram+层次softmax
它和CBOW+层次softmax非常相似,都是对中心词窗口大小内的词向量进行更新,只不过这里的输入(根节点)是中心词的词向量,目标节点是上下文窗口大小内的词,因此相对于CBOW+层次softmax它多了一个外层的循环,循环的把上下文窗口大小内的词其词向量作为目标节点。它和CBOW都是对上下文窗口大小内的词向量进行更新,所以说CBOW是对输入进行更新,它是对输出进行更新。
由于多个外层循环使得skip-gram的速度慢于CBOW。
注意:由于层次softmax优化方法是根据词频建立霍夫曼树,词频小的词离根节点更远,而由于稀疏性的原因(训练语料词袋中的词往往大部分出现词频较低),使得训练时到大部分中心词所经历的路径会过长,解决这一问题可以通过负采样。
先介绍一下使用负采样选取neg个负例词的方法
假定训练样本中共有I个词,把长度为1的线段分成I份,这里并不是等分的,词频越高的词其所占长度相对越大。然后再把该线段等分为M份,注意M远大于V,从M中随机的选取neg个,这neg个M所对应的词作为负例词。
3)CBOW+负采样
每一次以一个中心词作为正例(其词向量是上下文窗口大小内的词其词向量的均值),随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,通过梯度上升算法进行优化。最后也是对上下文窗口大小内的词的词向量进行更新。
4)Skip_gram+负采样
每次循环的以上下文窗口大小内的某一个词作为正例,随机选取neg个中心词作为负例,以和logistic相同的思想最大化条件概率为学习策略,以对数似然函数做为损失函数,通过梯度上升算法进行优化。最后对该词的词向量进行更新。
6.FastText
具体可参考:https://blog.csdn.net/qq_16633405/article/details/80578431
FastText在用于类别种类数比较多且训练语料比较大的文本分类中效果很好,但是通过这种方法也能获得词向量。
fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。
FastText每次以文本的所有词词向量的均值以及字符级文本的ngram作为输入,使得其相比于Word2vec能够获得语序信息。所预测的是类别标签。
FastText词向量与word2vec对比:
1)模型的输出层:word2vec的输出层,对应的是每一个token,计算某token的概率最大;而fasttext的输出层对应的是分类的label。
2)模型的输入层:word2vec的输入层,是窗口大小内上下文词向量的均值;而fasttext 对应的是整个具体的内容,包括词,也包括 n-gram的内容; 两者本质的不同,体现在 h-softmax的使用。Word2vec的目的是得到词向量,该词向量 最终是在输入层得到,输出层对应的 h-softmax 也会生成一系列的向量,fasttext则充分利用了h-softmax的分类功能,遍历分类树的所有叶节点,找到概率最大的label(一个或者N个)。
7.Glove
和word2vector不同,GloVe更倾向于对前后语境之间的共现关系进行分析,通过共现关系抽象出词向量,相比于word2vector它能获得语料中的统计信息。该论文明确指出它是充分利用统计信息使用词共现矩阵中频率非零的元素来训练模型。
详细解析:
https://blog.csdn.net/u014665013/article/details/79642083
论文和源码的详细解析
https://blog.csdn.net/Mr_tyting/article/details/80180780
8.Doc2vec
Doc2Vec(dm默认为1是PV-DM类似于Word2vec中的CBOW,选择0则使用的为PV-DBOW,类似于Word2vec中的skip-gram,也有hs默认0为负采样)和Word2vec类似,它是每次从一句话中滑动采样固定长度的词,取其中一个词作预测词,其他的作输入词。输入词对应的词向量word vector和本句话对应的句子向量Paragraph vector作为输入层的输入,将本句话的向量和本次采样的词向量相加求平均或者累加构成一个新的向量X,进而使用这个向量X预测此次窗口内的预测词。
Doc2vec相对于word2vec不同之处在于,在输入层,增添了一个新句子向量Paragraph vector,Paragraph vector可以被看作是另一个词向量,它扮演了一个记忆,词袋模型中,因为每次训练只会截取句子中一小部分词训练,而忽略了除了本次训练词以外该句子中的其他词,这样仅仅训练出来每个词的向量表达,句子只是每个词的向量累加在一起表达的。正如上文所说的词袋模型的缺点,忽略了文本的词序问题。而Doc2vec中的Paragraph vector则弥补了这方面的不足,它每次训练也是滑动截取句子中一小部分词来训练,Paragraph Vector在同一个句子的若干次训练中是共享的,所以同一句话会有多次训练,每次训练中输入都包含Paragraph vector。它可以被看作是句子的主旨,有了它,该句子的主旨每次都会被放入作为输入的一部分来训练。这样每次训练过程中,不光是训练了词,得到了词向量。同时随着一句话每次滑动取若干词训练的过程中,作为每次训练的输入层一部分的共享Paragraph vector,该向量表达的主旨会越来越准确。Doc2vec中PV-DM模型具体的训练过程和word2vec中的CBOW模型训练方式相同,训练完了以后,就会得到训练样本中所有的词向量和每句话对应的句子向量。
9.ELMO
相比于前面几种方法所获得的词向量通过ELMO所获得的词向量能够富含语境信息,也就是能够一定程度上解决一词多义问题。
ELMO属于一种预训练方法,采用了典型的两阶段过程,第一阶段是预训练一个语言模型(它所创建的为自回归类的语言模型,具体而言既有通过上文来预测当前词也有通过下文来预测当前词,网络结构一般采用双层双向的LSTM);第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding进行线性组合作为新特征补充到下游任务中(也可直接作为下游任务的输入)。
具体流程
先用训练语料通过多层双向的LSTM网络(论文中使用的是两层)来训练一个语言模型,属于预训练阶段。关于BI-LSTM的双向输入问题,语言模型训练的任务目标是根据单词的上下文去正确预测单词,它之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after(也就是说这里并不是输入的整个句子)。
在解决下游的具体任务时,把当前任务的训练语料输入到网络模型中,此时参数都是训练好的,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。这三层的向量可以结合下游具体任务的训练语料学习得到相应的权重,根据各自权重进行线性求和,将三个Embedding整合成一个从而得到ELMO向量。这个ELMO向量富含语境信息。对于下游的NLP任务,在词向量的基础上拼接上ELMO向量,其总体作为新的词向量进行训练,这样的词向量不仅富含语法和语义信息也富含语境信息,正因为拼接的ELMO向量的不同,所以说词向量是不断改变的,从而解决了Word2vec最大的缺陷,无法处理多义词的问题。
10、词向量的评估
词向量评估分为内在评估和外在评估
外在评估需要把词向量放到各种下游任务中去看实际效果,具体方法参考提出Text-CNN的那篇论文
内在评估
1)可以通过直观的语义类别问题评估
寻找x满足“a is to b,as x is to y” 求(b-a+x)的向量和那个向量最近作为y
2)可以直接就简单的通过词向量进行聚类观察效果
NLP之词向量的更多相关文章
- NLP︱高级词向量表达(三)——WordRank(简述)
如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错. 其是通过Robust Ranking来进行词向量定义. 相关p ...
- NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...
- NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)
有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...
- NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)
自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...
- 深度学习之NLP获取词向量
1.代码 def clean_text(text, remove_stopwords=False): """ 数据清洗 """ text = ...
- NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)
R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题. 笔者认为还存在的问题有: 1.如何在R语言环境下,大规模语料提高运 ...
- 词向量1.md
词向量 我们以句子分类为例,我们使用深度学习模型对句子进行分类,本质上这个模型的接受的舒服需要是数值型.因为文字是人们抽象出来的一个概念,这个 东西是不能被计算机直接理解的,我们需要人为的将这个文字转 ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- Deep Learning In NLP 神经网络与词向量
0. 词向量是什么 自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化. NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representati ...
随机推荐
- JeeSite | 数据权限应用
中午吃饭时看了一下陆毅版的<三国>,刚好看的是蜀军缺粮,诸葛亮让王平去劫司马懿的粮.司马懿看蜀军用木牛流马运量很方便,就抢了蜀军的木牛流马仿制了一批,结果司马懿用它运粮时,被王平冒充司马懿 ...
- ‘Maximum call stack size exceeded’错误的解决方法
今天打开vue项目,页面空白报了一个错误,错误如下: “Maximum call stack size exceeded” 错误的字面意思是:超出最大调用堆栈大小. 然后就是各种百度,找错误原因.百度 ...
- WinForm 程序在系统托盘显示
前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...
- Serverless 的喧哗与骚动(一)附Serverless行业发展回顾
作者 | 阿里中间件高级技术专家 许晓斌 <Maven实战>作者,曾负责 AliExpress 微服务架构演进,现在负责阿里集团 Serverless 技术研发落地. 导读:从 2016 ...
- 如何当上Leader和六千个bug的系统
在昨天的读书会上我分享了我是如何当上leader以及当上leader之后的体会.然后今天Sophie总结了我的发言,大家对此有些反馈.我根据大家的反馈写了这篇文章,主要针对几点: 大家如何当上lead ...
- java架构之路-(nginx使用详解)nginx的反向代理和优化配置
书接上回说,nginx我们学会了简单的配置.那么我今天来聊一下,我们ngxin的一些优化配置(我不是很懂,不敢谈高级配置).我先来看一下nginx的好处和正向代理. nginx的好处 1.可以高并发连 ...
- RabbitMQ、RPC、SaltStack "贡"具的使用
消息队列 使用队列的场景 在程序系统中,例如外卖系统,订单系统,库存系统,优先级较高 发红包,发邮件,发短信,app消息推送等任务优先级很低,很适合交给消息队列去处理,以便于程序系统更快的处理其他请求 ...
- reduce求和真方便
1.reduce的用法. reduce是JavaScript中的一个方法,常用于数组求和,接收两个参数,第一个参数为累加函数,第二个参数为初始值,这个初始值是前面那个累加函数的参数.如果不指定初始值, ...
- Hystrix核心熔断器
在深入研究熔断器之前,我们需要先看一下Hystrix的几个重要的默认配置,这几个配置在HystrixCommandProperties 中 //时间窗(ms) static final Integer ...
- IPv6地址类型和操作
IPv6地址的号段划分和前缀表示法: IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分 地址结构图 全局路由前缀 (48位) 子网ID (16位 ...