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的理解的更多相关文章

  1. 词袋模型bow和词向量模型word2vec

    在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...

  2. 自然语言处理词向量模型-word2vec

    自然语言处理与深度学习: 语言模型: N-gram模型: N-Gram模型:在自然语言里有一个模型叫做n-gram,表示文字或语言中的n个连续的单词组成序列.在进行自然语言分析时,使用n-gram或者 ...

  3. NLP学习(1)---Glove模型---词向量模型

    一.简介: 1.概念:glove是一种无监督的Word representation方法. Count-based模型,如GloVe,本质上是对共现矩阵进行降维.首先,构建一个词汇的共现矩阵,每一行是 ...

  4. [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型

    深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...

  5. 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)概念介绍

    例句: Jane wants to go to Shenzhen. Bob  wants to go to Shanghai. 一.词袋模型 将所有词语装进一个袋子里,不考虑其词法和语序的问题,即每个 ...

  6. 关于Google词向量模型(googlenews-vectors-negative300.bin)的导入问题

    起因 项目中有如下代码: word2vec = KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', bi ...

  7. 词向量之word2vec实践

    首先感谢无私分享的各位大神,文中很多内容多有借鉴之处.本次将自己的实验过程记录,希望能帮助有需要的同学. 一.从下载数据开始 现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看. ...

  8. NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)

    自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...

  9. 机器学习入门-文本特征-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 ...

  10. 学习笔记TF018:词向量、维基百科语料库训练词向量模型

    词向量嵌入需要高效率处理大规模文本语料库.word2vec.简单方式,词送入独热编码(one-hot encoding)学习系统,长度为词汇表长度的向量,词语对应位置元素为1,其余元素为0.向量维数很 ...

随机推荐

  1. JavaScript 、三个点、 ...、点点点 是什么语法

    笔者在学习ts函数式的时候见到这样的写法,这个语法是es6的扩展运算符,可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开:还可以在构造字面量对象时, 将对象表达式按key-va ...

  2. EL&JSTL笔记 javaweb+jdbcTempl

    # 今日内容    1. JSP:        1. 指令        2. 注释        3. 内置对象    2. MVC开发模式    3. EL表达式    4. JSTL标签   ...

  3. 【RocketMQ】Dledger日志复制源码分析

    消息存储 在 [RocketMQ]消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerComm ...

  4. LeetCode-1669 合并两个链表

    来源:力扣(LeetCode)链接:https://leetcode.cn/problems/merge-in-between-linked-lists 题目描述 给你两个链表 list1 和 lis ...

  5. Reverse for 'blog_detail.html' not found.解决方法

    初学django遇到了以下问题: 查找解决方法的时候发现有以下几个原因: 1.字母打错 2.多加了空格 随后 我发现 报错的代码中多加了'.html'..删掉后就没问题了.

  6. 修复gitlab权限(docker方式搭建)

    docker exec -it gitlab update-permissions docker restart gitlab

  7. 野火FreeRTOS计数信号量实验意外处理

    编译的时候,一直说xSemaphoreCreateCounting这个函数没有定义. 最后发现,是FreeRTOSConfig.h文件中,没有将使能计数信号量的宏打开. 解决办法:在FreeRTOSC ...

  8. Mybatis-Plus学习

    mybatis-plus 学习 系统环境 jdk8+mysql5.7+springBoot+mybatis最新版本+系统编码UTF-8 文件配置 application.properties # 应用 ...

  9. C++ MFC学习 (五)

    Edit Control 当不设置多行时,敲击回车会关闭对话框 1 void CMFC_Demo4Dlg::OnBnClickedButton2() 2 { 3 // TODO: 在此添加控件通知处理 ...

  10. KMP 算法实现

    # coding=utf-8 def get_next_list(findding_str): # O(m) # 求一个字符串序列每个位置的最长相等前.后缀 j = 0 # 最长相等前缀的末位 nex ...