word2vec是如何工作的?
如何有效的将文本向量化是自然语言处理(Natural Language Processing: NLP)领域非常重要的一个研究方向。传统的文本向量化可以用独热编码(one-hot encoding)、词袋模型(bag-of-words)和TF-IDF等方式,但是以上得到的文本向量可能维度都很好,在一些情况下可能并不适合进行NLP建模,如基于大量文本用独热编码的方式得到的向量维度是非常大的,这样子就不适合进行进一步分析及处理,并且丢失掉文本很多语意信息,无法高效地去发现文本中潜在的规律及模式。(好吧,废话有点多了!)所以13年的时候谷歌的研究员Tomas Mikolov(此人是大牛啊,12年在微软做实习生的时候就发现了词的语意是可以被更低维度的向量表示的,想想我那会还在迷茫人生,赶紧掩脸)通过训练一个浅层神经网络(如逻辑回归、线性判别分析模型等线性机器学习模型均可用)正式提出了Word2vec。
(好吧,我还是得继续多点废话,因为要先介绍下Word2Vec是怎么样一个算法)Word2Vec被提出来的时候就被划分为无监督学习,这个是因为被拿来做训练的文本是不需要有标记的,它是通过处理非常大量的文本数据来提取并学习文本中的语意的。利用word2vec算法,不需要告知算法腾讯的创始人是小马哥,也不需要知道阿里巴巴的创始人是Jack Ma,word2vec通过类比推断会自动去判别,如下面图所示(it is so powerful and magic, isn't it?),这是因为word2vec能从相似性的角度去做推断(这里的相似性不是说句型一样,而是语境语意类似,比如说北京天安门,众所周知这是一个景点,然后说广州小蛮腰,知道这也是一个景点,重点是语意理解上两个单词表达都是这么情况,跟上述腾讯和阿里巴巴创始人的例子类似)。说回标记的问题,这里其实很tricky,要说它是在没有标记的情况下进行训练的又不是很准确,因为其实它只是不需要人为对文本进行标记,但是算法本身是通过训练神经网络从句子中邻近的单词(surrounding words)来预测目标单词(target words),而之所以被归为无监督学习是因为标记本身就是来自文本数据。
但是预测结果并不是需要被担心和关注的点,这点需要被明确起来。接触过迁移学习(Transfer Learning)的人应该知道,我们一般会用一些已经训练好的模型来提取数据特征或者直接用于其他数据上(同等维度)得到想要的预测结果,这是因为神经网络经过训练之后,被保存下来的模型其实是一组参数矩阵,该参数矩阵代表了被预测值或者产生的特征,而word2vec在运用的过程中需要被关注的点也是在这里。
接下来看看Word2vec的表征是如何得到的?
主要可以用Skip-Gram和Continuous Bag-of-Words (CBOW)通过简单的神经网络训练得到word2vec嵌入(embedding)
1、Skip-gram
该方式主要是通过输入句子中特定的单词来预测该单词周边的其他单词。如下面图中的句子所示,假设分词得到如下的结果,句子前面是一共五个单词,Skip-gram的意思就是输入“喜欢”这个词,然后通过训练模型推断出“小马哥”、“非常”和“学习”、“自然语言处理”四个单词,当然这里是假设窗口大小为5。之所以叫Skip-gram是因为这是一个n-grams模型,但是不是固定长度的n-gram而是略过了中间的单词来进行建模的一个语言模型。回到上面的例子,更准确的讲法是通过“喜欢”来预测“小马哥”这个单词的时候,中间是略过了非常,以此类推下去。
word2vec的原作者是用soft-max来做为最后的分类器的,因为不是这篇的重点,所以就不讲soft-max是如何计算的了。模型都是跟数值直接打交道,所以我们需要对句子中的分词结果进行编码才能放入模型,而skip-gram的方式是直接用的独热编码的方式来对每个单词进行编码。具体的一个流程是对文本进行 分词 --> 统计词汇量 --> 基于词汇量对句子或者文本进行独热编码(向量wt表示的是该标识符在位置t的独热编码) --> 训练 --> 模型 --> 预测。网络结构可表述为下图所示,如果窗口大小为5,那么需要循环训练四次来得到目标单词周边的四个单词的预测结果:
就如上述说的迁移学习,当skip-gram的模型训练结束之后,模型训练得到的参数矩阵(weight matrix)就是被训练用来表征语意的。这里得益于独热编码的好处,训练得到的参数矩阵的每一行就是表征了文本中的每个单词。这里可以参看上图,输入层是一个1 x 5的向量,假设隐藏层有3个神经元,那么从输入层映射到隐藏层需要一个5 x 3的矩阵,在经过训练迭代之后得到这个5 x 3矩阵中的每一行就是表征了相对应的单词(具体的计算方式可以参看下图)。所以这里的参数矩阵就是最终需要的词嵌入,而参数矩阵跟独热编码得到输入向量的内积得到的就是词向量。不仅如此,在原作者的论文,他们还证明了语意上相近的单词会有类似的向量表征,这是因为这些单词最终是都有类似的周边单词。
通过上述向量和矩阵的相乘,并引入softmax作为激活函数得到最终的结果,而通过结果就可以理解原本的向量是5维的,现在得到的词向量的维度变小了。
2、Continuous Bag-of-Words (CBOW)
CBOW是通过目标单词周边的单词来预测目标单词,这点刚好跟skip-gram模型相反。
而作为网络的输入不再仅仅是独热编码方式得到的结果,此时的输入是目标单词周边的每个单词独热编码的和。还是回到小马哥的例子,该句子中分词之后一共有13个词语(忽略句号和逗号),现在要预测的目标词语是“喜欢”,那么“小马哥”、“非常”和“学习”、“自然语言处理”这四个单词对各自独热编码的结果的和就是网络的输入。具体执行可以参看下图的神经网络执行过程:
为了方便建立词语之间的联系,窗口是随着句子的方向滑动,并且选取中心词作为预测目标,目标词语的周边单词作为网络输入,而窗口中的五个词语的内容就是CBOW,如下图所示。
这就是如何通过skip-gram和CBOW训练得到词向量,也就是所谓的word2vec模型。论文的作者在论文中指出,skip-gram比较适合小型的文本集和文本中含有一些稀有词,而CBOW则比较适合文本中有高频出现的词语的文本集,这样子有助于提升训练的速度并且或者更高的准确性。
PS:基于的理解解析了该模型,如有任何问题,欢迎指出来一起讨论,非常感谢你读本博文。
word2vec是如何工作的?的更多相关文章
- 关于 word2vec 如何工作的问题
2019-09-07 22:36:21 问题描述:word2vec是如何工作的? 问题求解: 谷歌在2013年提出的word2vec是目前最常用的词嵌入模型之一.word2vec实际是一种浅层的神经网 ...
- 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)
转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...
- zz从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得.那为什么 ...
- NLP自然语言处理
转:https://blog.csdn.net/qq_17677907/article/details/86448214 1.有哪些文本表示模型,它们各有什么优缺点? 文本表示模型是研究如何表示文 ...
- FastText的内部机制
文章来源:https://towardsdatascience.com/fasttext-under-the-hood-11efc57b2b3 译者 | Revolver fasttext是一个被用于 ...
- 预训练语言模型的前世今生 - 从Word Embedding到BERT
预训练语言模型的前世今生 - 从Word Embedding到BERT 本篇文章共 24619 个词,一个字一个字手码的不容易,转载请标明出处:预训练语言模型的前世今生 - 从Word Embeddi ...
- word2vec 中的数学原理详解
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- 中英文维基百科语料上的Word2Vec实验
最近试了一下Word2Vec, GloVe 以及对应的python版本 gensim word2vec 和 python-glove,就有心在一个更大规模的语料上测试一下,自然而然维基百科的语料进入了 ...
随机推荐
- PL/SQL规范、块、过程、函数、包、触发器
1.pl/sql规范 标识符号的命名规范 1) 定义变量,用 v- 作为前缀 v-sal 2)定义常亮, 用 c- 作为前缀 c-rate 3) 定义游标,用 cursor作为后缀 emp_curso ...
- c语言描述的直接插入排序法
#include<stdio.h> #include<stdlib.h> #define SIZE 6 typedef int Type; //直接插入排序法 void Ins ...
- 如何关闭Eclipse智障的变量命名自动补全功能
找到了最最完美的解决方案,无需下载源码. 详见:https://zhidao.baidu.com/question/1451659429285222820.html
- ETO的公开赛T5《猎杀蓝色空间号》题解
这道题别看题面这么长,其实题意很简单 就是让你求从起点开始的最长合法区间 合法的要求有两个:兜圈子和直飞 且这两个条件相互独立 (也就是说兜圈子的末尾不会对下面可能出现的直飞造成影响) 举个例子: 1 ...
- [NOI2015]程序自动分析(并查集)
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...
- Flask中对MySQL的基本操作
在Flask-SQLAlchemy中,插入.修改.删除操作,均由数据库会话管理. 会话用 db.session 表示.在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提 ...
- 使用nginx对spring boot项目进行代理
摘要:使用nginx对spring boot项目进行反向代理,并且使用轮询均衡负载策略 均衡负载与集群 集群和均衡都涉及到多个机器提供的服务的问题 不同点是,集群是互相通信.协同的的多个服务,服务之前 ...
- javascript--淘宝页面的放大镜效果
放大镜效果需求: 鼠标放入原图中,会出现一个黄色的遮盖层和一个放大的图片,鼠标移动时候,遮盖层会跟着鼠标一起移动,同时放大的图片会跟着一起移动. 实现过程: 1.鼠标移入,遮盖层和大图片显示 2.鼠标 ...
- BGP映射和联盟
BGP映射和联盟 一:请看下面四张有关于BGP映射和联盟的拓扑图 BGP联盟 BGP映射实例 BGP单映射 BGP多映射 二:以图一为列,进行BGP联盟的配置测试: 首先进行理论分析,在拓扑图中共用两 ...
- WinForm webbrowser控件的使用
webbrowser是一个比较实用的工具,主要用于在winform窗体中嵌入浏览器,达到winform与webform互操作的目的. 先上一个demo,看一下能实现什么效果. private void ...