word2vec如何得到词向量_QueenieK的博客-程序员宝宝

技术标签: 机器学习  word2vec  

前言

word2vec是如何得到词向量的?这个问题比较大。从头开始讲的话,首先有了文本语料库,你需要对语料库进行预处理,这个处理流程与你的语料库种类以及个人目的有关,比如,如果是英文语料库你可能需要大小写转换检查拼写错误等操作,如果是中文日语语料库你需要增加分词处理。这个过程其他的答案已经梳理过了不再赘述。得到你想要的processed corpus之后,将他们的one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)就ok了。不得不说word2vec是个很棒的工具,目前有两种训练模型(CBOW和Skip-gram),两种加速算法(Negative Sample与Hierarchical Softmax)。本答旨在阐述word2vec如何将corpus的one-hot向量(模型的输入)转换成低维词向量(模型的中间产物,更具体来说是输入权重矩阵),真真切切感受到向量的变化,不涉及加速算法。如果读者有要求有空再补上。

1 Word2Vec两种模型的大致印象

刚才也提到了,Word2Vec包含了两种词训练模型:CBOW模型和Skip-gram模型。

CBOW模型根据 中心词W(t)周围的词来预测中心词
Skip-gram模型则根据 中心词W(t)来预测周围词

抛开两个模型的优缺点不说,它们的结构仅仅是输入层和输出层不同。请看:

CBOW模型
Skip-gram模型

这两张结构图其实是被简化了的,读者只需要对两个模型的区别有个大致的判断和认知就ok了。接下来我们具体分析一下CBOW模型的构造,以及词向量是如何产生的。理解了CBOW模型,Skip-gram模型也就不在话下啦。

2 CBOW模型的理解

其实数学基础及英文好的同学可以参照斯坦福大学Deep Learning for NLP课堂笔记

当然,懒省事儿的童鞋们就跟随我的脚步慢慢来吧。

先来看着这个结构图,用自然语言描述一下CBOW模型的流程:

CBOW模型结构图

NOTE:花括号内{}为解释内容.

  1. 输入层:上下文单词的onehot. {假设单词向量空间dim为V,上下文单词个数为C}
  2. 所有onehot分别乘以共享的输入权重矩阵W. {V*N矩阵,N为自己设定的数,初始化权重矩阵W}
  3. 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1*N.
  4. 乘以输出权重矩阵W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维斗代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
  6. 与true label的onehot做比较,误差越小越好
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实聪明的你已经看出来了,其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

这回就能解释题主的疑问了!如果还是觉得我木有说明白,别着急!跟我来随着栗子走一趟CBOW模型的流程!

3 CBOW模型流程举例

假设我们现在的Corpus是这一个简单的只有四个单词的document:
{I drink coffee everyday}
我们选coffee作为中心词,window size设为2
也就是说,我们要根据单词”I”,”drink”和”everyday”来预测一个单词,并且我们希望这个单词是coffee。

假设我们此时得到的概率分布已经达到了设定的迭代次数,那么现在我们训练出来的look up table应该为矩阵W。即,任何一个单词的one-hot表示乘以这个矩阵都将得到自己的word embedding。

转自:https://www.zhihu.com/question/44832436

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yingfengfeixiang/article/details/80233804

智能推荐

浅析 RxJava 2.x 线程调度_weixin_34292287的博客-程序员宝宝

RxJava 的大名不需要多做介绍,我自己也在项目中使用RxJava也有一段时间了,抱着学习的心态,一直想更深入一点的去了解它的实现原理,当然RxJava东西还是蛮多的,不可能一篇文章就能说清楚,so,这肯定是一个系列,在这一篇,我先尝试从 RxJava的线程控制 来切入,管中窥豹吧,我尽力,看官们随意。最简单的使用从我们日常使用的代码入手,可能能更容易理解一点。Observable.c...

25G SFP28 SR多模和LR单模光模块的介绍及区别_易天ETU的博客-程序员宝宝

25G SFP28光模块简单来说就是传输速率为25Gbps的光模块,主要用于25G以太网和100G(4x25Gbps)以太网中,能够以最节能的方式来满足数据中心日益增长的需求。因此在40G、100G等光模块存在成本过高问题时,25G SFP28光模块成为了一种很好的解决方案。本期文章易天光通信(ETU-LINK)将为大家解析25G SFP28 SR和SFP28 LR光模块及其它们的区别。SFP28光模块具备功耗较低、端口密度较高以及节省网络部署成本等优点,能够通过25Gb/s的单通道物理层技术来实现10

计算机科学导论期末专题报告,计算机科学导论专题报告_腾讯《活着》栏目的博客-程序员宝宝

为计算机事业做出贡献的几位伟大的科学家几位中国计算机科学家王选与他的“激光照排”他的一项发明让中国的一个行业,一步就从落后的状况跨越到世界先进的行列。 激光照排技术让中国人感到骄傲。为了这项发明,王选几乎放弃了所有的节假日,更放弃了许多享受天伦之乐的机会。但是王选也得到了常人享受不到的快乐。因为他的发明,中国印刷业的发展历程缩短了将近半个世纪。到了今天,在全球华文报业出版印刷领域,有80%以上都在...

NLP领域的预训练_宁静致远King的博客-程序员宝宝

Word Embedding语言模型什么是语言模型?简单地说,语言模型就是用来计算一个句子的概率的模型,也就是判断一句话是否是人话的概率?为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数,核心函数P的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小。句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人...

weblogic mysql 测试连接表_Weblogic数据库连接池配置_weixin_39607710的博客-程序员宝宝

以建立oracle数据源为例(此处以weblogic12c为例)选择 域结构 >base_domain >服务>数据源 此处weblogic10版本选择 wl_server >Services>datasource Weblogic9与weblogic10相似,但是在新建或者修改时,应先解除锁定,进入编辑状态。 后面进行的新建数据源等操作基本一致,可参照例子。Step...

随便推点

ADC触摸屏编程测试笔记_韦东山老师_ 蓝色鲜橙多的博客-程序员宝宝

首先我们要先知道触摸屏,他是透明的薄膜,LCD和触摸屏是两个不同的设备。我们不能把它混为一谈,触摸屏是触摸屏LCD是LCD。从韦老师的博客我们知道或者说百度,实际上触摸屏是由两层膜组成,我的理解是这样子更加方便ADC测量,也就是去进行精准位置。在学习ADC触摸屏编程测试的时候遇到一个问题,那就是在点击A点的时候自动跳过了B点直接到达C点位置校准。经过韦老师的分析加上自己的理解也终于明白...

小孩编程积木玩具_techtitan的博客-程序员宝宝

*****编程玩具套机器人编程玩具套装机器人编程了解总结:1. Matatalab玛塔创想 Matatalab 编程机器人Lite版 steam教育早教玩具 男女孩小孩学生幼儿园教具生日礼物 购买链接:https://item.jd.com/66040384117.html?cu=true&utm_source=zhuanlan.zhihu.com&utm_medium=tuiguang&utm_campaign=t_1001542270_1001978395_0_...

数据结构-----栈的顺序储存_爱吃草莓蛋糕的猴的博客-程序员宝宝_栈保存数据是找保存再调整位置还是先调整位置再保存

01.栈的定义栈是一种后进先出的数据结构,也就是说他不像数组那样子,可以在中间插入,栈只能够在上一个存入数据的后面再存数据,而且只能取现进去的数据。栈简称LIFO结构。栈是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端叫栈顶,另一端叫栈底,不含任何元素的叫空栈。栈的插入操作,叫做进栈,也称作压栈,入栈。栈的删除操作,叫做出栈,也叫作弹栈。02.栈的结构栈里面有一个to...

SpringBoot自定义序列化的使用方式--WebMvcConfigurationSupport_一枝花算不算浪漫的博客-程序员宝宝

场景及需求: 项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:[ { "id": 1, "name": null }, { "id": 2, "name": "xiaohong" }]如上,格式化后的返回内容应该为:[ ...

Sentry_chouni8194的博客-程序员宝宝

1. Sentry介绍及使用 Sentryis a realtime event logging and aggregation platform. At its core it specializes in monitoring errors and extracting all...

树状数据库表查询2次以上(自连接、内连接、别名、邻接表)方法_q平面人的博客-程序员宝宝

https://blog.csdn.net/qq_15058425/article/details/78506193https://blog.csdn.net/qq_43998763/article/details/103528559https://blog.csdn.net/zhangt85/article/details/40544165对于树状结构的数据库表,如何在一个表中查询多次,开始走了不少弯路,比如想尝试用子查询,方向不对。其实就是join查询,改变数据表名称即可。//价值表带

推荐文章

热门文章

相关标签