对词向量模型Word2Vec和GloVe的理解
Word2Vec
Word2Vec 是 google 在2013年提出的词向量模型,通过 Word2Vec 可以用数值向量表示单词,且在向量空间中可以很好地衡量两个单词的相似性。
简述
我们知道,在使用神经网络处理数据的时候,神经网络只能处理数字向量或者矩阵,他不可能理解文本、图像本身。那么,图像是用像素表示的,这个在最早显示图像的时候就已经和神经网络的使用不谋而合,但是文本是人类自然产生的,没有办法直接映射成数据。
当然了,也可以简单的映射,one-hot编码就可以了,这也是神经网络在处理数据时,遇到非数字信息的特征常用的方案,比如男女映射成0/1.但是简单的用one-hot编码肯定存在很大的问题,其一就是当词汇表的容量变得相当大时,词向量空间也会变得十分巨大;此外就是这样的映射数据本身之间没有联系。
比如,man,boy之间应该是很相似的,也就是说,在映射到的矩阵中的数值应该是十分相似的才行,这样就有了Word2Vec.

其实就是对神经网络的一个很简单的应用。我们首先对输入进行编码,即人为随机地给词汇表做一个映射矩阵,让每一个词汇对应一个向量,当然了,不一定像上图一样用one-hot,你可以使用任何策略,N维你也可以随意设置,一般是50-300维度。
他的重点在于,我在训练网络的时候,不仅仅更新我网络的权重矩阵,我还要更新输入的这个映射矩阵,目的就是为了让我的映射矩阵逐渐地变成计算机能够理解的那个分布,举个例子:

训练完后,可以看到man和boy之间是有很多区域分布相同或者相似的,因此man和boy这两个词在词向量空间中的距离其实是比较近的;相反的,二者与water之间几乎看不到什么联系,也就是说二者与water之间的距离是非常遥远的。
数据集构建与训练策略
首先就是数据来源。但是我们做这个训练是不需要有标签的,是一个无监督的过程,因此任何文本都可以拿过来做数据集。具体怎么构建呢?举个例子:

拿到一句话,给定一个窗口,然后我们选择前两个词作为输入,第三个词作为输出,也就是正确结果,label。换句话说,就是我们要根据前两个词对第三个词做一个预测。随后,滑动这个窗口,滑动一次我们就又得到一条训练数据,以此类推,就可以得到一个就很大的数据集。
当然了,这个窗口大小也不一定是3个,可以是5个,7个,一般都是奇数(大概是实验结论),但好像用的比较多的是3个的窗口,可能因为一句话也就5个字甚至不足五个字的数据相对来说还是没那么少的,为了利用上这些数据,所以窗口不应该特别大。
而现在最常用的训练方案有两个:CBOW和Skip-gram

其实二者的区别一目了然,就是一组互逆的方案,CBOW是挖掉中心的一个词,叫模型根据上下文去预测中心词;反之,Skip-Gram是根据中心词去预测其上下文的词。
在实际使用中,选择两种方案没有本质区别,结果基本一样。
优化方法
为什么要讲优化方法呢?很简单,我们仔细再看一眼数据的输入和输出,我们输入了一组单词,输出了一个单词,注意,输出了一个单词,虽然我们的本质是预测,但其实就相当于“这组单词是属于输出的这个单词”的,也就是说,这完全就是一个分类问题,如果你的词汇表有5w个,那么这就是一个5w分类,这显然是一个很疯狂的事情,Softmax压力巨大。因此,我们需要简化这部分计算。
1、层级的Softmax

但是迪哥没有讲这个方案,大概是因为使用比较少?或者是很复杂?
2、负样本采样
这个的前提是,你的训练策略又要改变,因为他需要你把一个N分类问题转化为2分类问题,具体操作是:
我们输入这个单词和这个单词上下文的单词,具体点就是我们输入两个相邻的单词,然后判断其是否相邻就行了。
这样的话,问题就又来了——我们构建的数据集肯定全是相邻的单词对不对?那么我们的label肯定全是1,那么模型就会被学成一个只会蒙1的傻子,因此我们需要为其注入负样本。
具体操作也很简单,给定一个单词,然后随机为其配对几组其他的单词即可,当然了,配对之后的单词不应该存在于原来你构建好的正例样本中。
但是有一个点我其实蛮疑惑的,就是说这个负样本的数量应该是多少呢?直觉上,我们肯定是希望正负样本平衡1:1最好,但是迪哥说实验经验是,5个/词比较好。
总体来说,这个要比层级的Softmax更加简单一些。
总体说来,Word2Vec的模型更加简单,训练速度快,训练中也会考虑单词的上下文关系。
缺点是,上下文窗口较小,没有考虑全局单词共现的信息,而且每个单词的词向量都是固定的,对一词多义的现象没办法解决。【当然了,简单粗暴的one-hot在这些缺点之上,还有更多缺陷】
GloVe
简单理解一下这个和Word2Vec齐名的模型。Global Vectors for Word Representation
打开扫了一眼原始的论文,其实主要的亮点在于两个:
1、用两个词同时出现的条件概率的比值去衡量两个词的相关性,而不是直接用两个词的词向量或者其他的概率形式去比较词与词之间的关系。
打个比方:

我们计算一组条件概率的比值,原文是直接用词频(也就是词语在语料库中出现的次数)来统计的,用第一个条件概率举例子就是,分母是ice这个单词出现的所有次数;分子是在ice出现的时候,其上下文词语中有多少个k的次数,得到的就是在ice条件下出现k的概率。
那么,二者之比就是一个三个词语之间的关系,如果这个比值比较大,那么就说明k与分母的中心词更加相关(如ice就是solid);相反的,比值太小,就说明k与分子的中心词更加相关(比如steam就是gas);与此同时,比值接近于1,要么就是二者都比较相关,要么就是二者都不相关。
这样做的主要目的是,不同的单词出现的词频是不同的,因此计算出来的条件概率会跨越好几个数量级,就算直接用数量计算,几个数量级之间的数据也是很难有可比性的,因此作者认为这种比值更能反映词语之间的联系。
具体将这个方法应用到网络里,还需要进一步的推演,让他变成网络可以使用的公式才可以,具体内容看论文吧还是:https://aclanthology.org/D14-1162.pdf
2、对词频十分小的词,我们调整其对网络的影响。
看一眼损失函数:
前面这个f就是用来做这件事的:

即,我们规定一个需要被调整的最大词频,其实本质上就是一个阈值,对于出现频率比这个阈值高的词我们不做任何调整,权重就是1,;否则,让权重变小,词频越低,其对网络的影响能力越小。因为词频小的词往往都是生僻词,小的过分的,很有可能是训练数据中错误的词,因此作者认为这些词属于噪声需要被清理掉。
原文作者还把这个图画出来了,水了10行内容(笑哭):

参考资料:
迪哥的视频:https://www.bilibili.com/video/BV1MS4y147js?p=5&spm_id_from=pageDriver&vd_source=920f8a63e92d345556c1e229d6ce363f
知乎:https://www.bilibili.com/video/BV1MS4y147js?p=5&spm_id_from=pageDriver&vd_source=920f8a63e92d345556c1e229d6ce363f
GloVe:https://www.bilibili.com/video/BV1Nt4y137iS/?spm_id_from=333.337.search-card.all.click&vd_source=920f8a63e92d345556c1e229d6ce363f
对词向量模型Word2Vec和GloVe的理解的更多相关文章
- 词袋模型bow和词向量模型word2vec
在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...
- 自然语言处理词向量模型-word2vec
自然语言处理与深度学习: 语言模型: N-gram模型: N-Gram模型:在自然语言里有一个模型叫做n-gram,表示文字或语言中的n个连续的单词组成序列.在进行自然语言分析时,使用n-gram或者 ...
- NLP学习(1)---Glove模型---词向量模型
一.简介: 1.概念:glove是一种无监督的Word representation方法. Count-based模型,如GloVe,本质上是对共现矩阵进行降维.首先,构建一个词汇的共现矩阵,每一行是 ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍
例句: Jane wants to go to Shenzhen. Bob wants to go to Shanghai. 一.词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个 ...
- 关于Google词向量模型(googlenews-vectors-negative300.bin)的导入问题
起因 项目中有如下代码: word2vec = KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', bi ...
- 词向量之word2vec实践
首先感谢无私分享的各位大神,文中很多内容多有借鉴之处.本次将自己的实验过程记录,希望能帮助有需要的同学. 一.从下载数据开始 现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看. ...
- NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)
自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...
- 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)
函数说明: 1. from gensim.model import word2vec 构建模型 word2vec(corpus_token, size=feature_size, min_count ...
- 学习笔记TF018:词向量、维基百科语料库训练词向量模型
词向量嵌入需要高效率处理大规模文本语料库.word2vec.简单方式,词送入独热编码(one-hot encoding)学习系统,长度为词汇表长度的向量,词语对应位置元素为1,其余元素为0.向量维数很 ...
随机推荐
- LeetCode_单周赛_332
6354. 找出数组的串联值 题意 将数组首尾元素接在一起,就是串联值. 串联之后删除,如果只剩下一个元素,加上这个元素即可 双指针,从首和尾向中间移动即可 code 注意:用 long 没看题目用了 ...
- Git03 自建代码托管平台-GitLab
1 GitLab 简介 GitLab 是由 GitLabInc.开发,使用 MIT 许可证的基于网络的 Git 仓库管理工具,且具有wiki 和 issue 跟踪功能.使用 Git 作为代码管理工具, ...
- jquery(二:jquery的DOM操作)
jquery的Dom操作 查找元素(选择器已实现):创建节点对象:访问和设置节点对象的值,以及属性:添加节点:删除节点:删除.添加.修改.设置节点的css样式等. 操作元素的属性: 方法 说明 举例 ...
- 【TS】函数和函数类型
在使用函数的时候,通常会给函数传值,或者给函数一个返回值调用,这个时候就会涉及到函数类型. 函数类型分为两个方面: 1.函数参数 2.函数返回值 语法: function 函数名( 参数 : 参数类型 ...
- Android 分区和内存监控
Android 分区和内存监控 Andorid之所以是分区,是因为各自有对应的功能和用途的考量,可以进行单独读写和格式化. Android 设备包含两类分区: 一类是启动分区,对启动过程至关重要. 一 ...
- 题解 CF17201 A~D2
A 先约分,显然答案必然是 0 或 1 或 2 相等为 0,主要考虑 1 或 2 的情况. 假设 \(a>b\),令 \(c = a/b\),如果 \(c\) 为整数答案为 \(1\),否则为 ...
- CCRD_TOC_2007_EULAR专辑_2
中信国健临床通讯 EULAR 2007专辑II 目录 类风湿关节炎 1 Etanercept联合MTX治疗RA导致炎症与骨破坏进展之间的失关联也见于单关节水平:来自TEMPO的研究数据 Landewe ...
- Mybatis连接数据库
从零开始Mybatis连接数据库 创建Maven文件 File-->new-->project-->maven,点击next 配置 在出现的pom.xml文件中<project ...
- 一次k8s docker下.net程序的异常行为dump诊断
背景 昨天,一位朋友找到我寻求帮助.他的项目需要调用一个第三方项目的webAPI.这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从 ...
- 带你认识3个J.U.C组件扩展
摘要:本文主要为大家讲解3种J.U.C组件扩展. 本文分享自华为云社区<[高并发]J.U.C组件扩展>,作者: 冰 河. 1.FutureTask FutureTask是J.U.C(jav ...