本文主要三个部分:

(1)DNN如何计算字词的语义特征表示

(2)word2vec如何计算字词的语义特征表示

(3)霍夫曼对于word2vec的意义


词嵌入,就是将文本的单词嵌入数学空间中。

不同于one_hot这种暴力映射,无法衡量字词的语义空间距离。Word2vec采用的是低纬稠密矩阵去表征字词的语义关系。

但是如何才能得到每个字/词的低维稠密矩阵呢?

在谈Word2vec的做法之前,先谈谈用一般的DNN模型如何得到。

一、DNN如何计算字词的语义特征表示

以上图为例,要得到learning的词向量,我们通过滑窗,得到learning前4个单词和后4个单词,并将其转换为one_hot编码作为输入,通过隐藏层输出层,最后softmax预测learning的词向量,预测的值与实际的learning的one_hot编码进行误差计算,从而得到优化函数,通过梯度下降,从而得到隐藏层的权重系数矩阵

要求的正是隐藏层的权重系数矩阵,权重系数正是文本中各个词的词向量

二、word2vec用于计算字词的语义特征表示

相比于DNN的做法,word2vec有很大的不同,甚至可以说面目全非。以CBOW模型为例。

首先,DNN有输入层(输入为one_hot编码)、隐藏层(参数正是要求得的词向量)、输出层(sotfmax)。

1) 输入层,word2vec采用累加求和取平均的方式,而输入也不再是one_hot,而是随机初始化的

2c代表当前词的上下文个数

2) 没有了隐藏层,取而代之的是投影层,也就是输入的累加求和的结果。这和DNN就已经有本质上的不同了,我们前面说了隐藏层的参数值正是最后要求得的词向量,那word2vec如何得到每个字词的词向量(或者说语义特征表示)呢?后面在梯度上升的时候会提到,累加求和的Xw会作为变量进行梯度优化,最后去更新每个输入的随机初始化的向量(也就是上面公式的Xi),更新到最后的向量就是最终要求得语义特征表示。

3) word2vec为了解决输出层高维的softmax概率分布(从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值),采用了最优二叉树——霍夫曼树。

下面详细介绍霍夫曼树是如何在word2vec中发挥作用的。

三、 霍夫曼对于word2vec的意义

本节参考:

深入学习二叉树(三) 霍夫曼树​www.jianshu.com

word2vec原理(二) 基于Hierarchical Softmax的模型​www.cnblogs.com

A,B,C,D为叶子节点,每个叶子节点均有权重,而霍夫曼树则是每次合并两个权重最小的节点,最终到达根节点。

而在word2vec中,为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射

正如上文所述,霍夫曼树之于word2vec最大的意义是降低softmax计算量,如何实现这一目的的呢?

Word2vec中的霍夫曼树叶子节点为词汇表中的词,权重为该词的词频,这样离根节点最近的就是词频最大的节点,而词频越大,softmax的概率最大的机率也就越大,也就是神经网络输出层softmax后概率最大的就越可能是词频最大的词,这样路径也就越短,计算量就越小(因为词频越大,越靠近根节点,路径自然就越短,连乘的次数就越少,计算量自然就越小),这是一种贪心策略。

简单来说,我们希望找到输入概率最大的输出,而现在隐藏层到输出层已经被构建成一棵霍夫曼二叉树,那么词频越高的词越有可能是这个输入的输出,计算量相比于词频低的词更小。

通过标注数据相当于我们已经知道叶子节点是哪个,在输入与输出都已知的情况下,我们只需要让这条路径发生的可能性最大就行了。

那么应该如何去度量某条路径发生的概率呢?

在word2vec中,要到达某个叶子节点到底是沿着左叉树还是右叉树是通过simoid函数来确定,并且约定左子树编码为1(负类-),右子树编码为0(正类+),同时约定左子树的权重不小于右子树的权重。

其中Xw是当前内部节点的词向量,而θ则是我们需要从训练样本求出的逻辑回归的模型参数。而负类的概率P(−)=1−P(+)。

那么上图W2的输出概率为:

到这里应该就很简单了,概率最大下的参数估计,用最大似然估计计算就好了。

更为一般化的公式:

接下来,就可以通过梯度上升法来更新我们的θ和Xw,从而更新Xi,得到最终的每个字词的词向量表示。

word2vec原理_深入理解Word2Vec底层原理相关推荐

  1. 理解mysql 底层原理

    理解mysql 底层原理 mysql 关系数据库的一种,开源免费,支持百万级的存储性能.性能稳定.社区活跃 鉴于 本人半路出家,对于一些原理的东西都不怎么了解,正好 无所事事的情况下,翻博客,吸取知识 ...

  2. 深入理解 Base64 底层原理

    Base64 是一种常见数据编码方式,常用于数据传输.对于移动开发者来讲,网络请求中会经常使用到.对 JSON 熟悉的同学都知道,JSON 的序列化工具都不支持将 byte 数组直接放入 JSON 数 ...

  3. 不同类的方法 事务问题_深入理解 Spring 事务原理

    Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...

  4. 深入理解Go底层原理剖析 (送书)

    互联网迅猛发展的数十年时间里,不断面领着各种新的场景与挑战,例如大数据.大规模集群计算.更复杂的网络环境.多核处理器引起对于高并发的需求,云计算,上千万行的服务器代码-- 那些成熟但上了年纪的语言没能 ...

  5. aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:FeelsChaotic juejin.im/post/5c57b2d5e51d45 ...

  6. redis单线程原理___Redis为何那么快-----底层原理浅析

    redis单线程原理 redis单线程问题 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程. 1. 为什么说redis能够快速执行 ...

  7. python 底层原理_Python字典的核心底层原理讲解

    字典对象的核心是散列表.散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket.每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用.所有 bucket 结构和 ...

  8. 分类计数原理与分步计数原理_《分类加法计数原理与分步乘法计数原理》教学设计...

    一.本节课教学内容的本质.地位.作用分析 分类加法计数原理与分步乘法计数原理是人类在大量的实践经验的基础上归纳出的基本规律,它们不仅是推导排列数.组合数计算公式的依据,而且其基本思想方法也贯穿在解决本 ...

  9. Spring 事务原理篇:@EnableTransactionManagement注解底层原理分析技巧,就算你看不懂源码,也要学会这个技巧!

    前言 学习了关于Spring AOP原理以及事务的基础知识后,今天咱们来聊聊Spring在底层是如何操作事务的.如果阅读到此文章,并且对Spring AOP原理不太了解的话,建议先阅读下本人的这篇文章 ...

最新文章

  1. 【转载】linux环境变量PS1的简介
  2. anaconda有什么用?pycharm有什么用?anaconda怎么与pycharm一起联合使用?
  3. cad模糊查询符号_万能模糊查询SQL
  4. centos6.2 64位LNMP(linux+nginx+mysql+php)实现
  5. [算法][LeetCode]Spiral Matrix
  6. P4300-[AHOI2006]上学路线【网络流,最短路】
  7. eclipse工程导入Android Studio
  8. Android 位置服务——BaiduLocation的使用
  9. android 距离感应器控制屏幕熄灭_书房大变身!有格调的屏幕挂灯,加了它桌面秒变神仙颜值...
  10. Java8 Stream 流使用场景和常用操作
  11. 概率论:集合、假设检验、分布、矩阵、估计
  12. 理解委托的两类必要方法
  13. mysql select 返回列_mySQL – 使用select返回多行来更新多个列
  14. 软件技术雷达Java
  15. SPSS——非参数检验——1-Sample K-S 单个样本(Kolmogorov-Smirnov)柯尔莫哥洛夫-斯米诺夫检验
  16. IIS优化,支持10万并发
  17. windows安装深度linux,最漂亮的国产Linux,windows下安装深度操作系统步骤
  18. MIT6.824_2021_学习总结 分布式常见知识点
  19. Windows 10 Enterprise LTSC 2021 简体中文版、英文版下载 -- 最后一代 Windows 10
  20. Quartz概念详解

热门文章

  1. springboot创建parent_Spring Boot 开篇:快速入门
  2. nginx 上传文件 405_今天教大家Nginx+tomcat负载均衡群集如何配置
  3. 电气论文实现:应用转移因子法求解大规模电力网络潮流
  4. Spring MVC开发RESTful风格的URI
  5. VTK:等参细胞演示用法实战
  6. VTK:提取可见细胞用法实战
  7. wxWidgets:wxStdInputStream类用法
  8. wxWidgets:wxDataViewModel类用法
  9. boost::spirit模块实现将由某个分隔符分隔的任意键/值对解析为 std::map的测试程序
  10. boost::thread相关的测试程序