Word2Vec深入浅出

  • word2vec简介
    • one-hot编码
    • skip-gram模型
    • CBOW模型
    • Hierarchical SoftMax
    • Negative Sampling
    • skip-gram在神经网络上的训练流程
      • 模型细节
      • 以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2Vec词向量的理解,不对的地方还请指出。如何你觉得对你有帮助,请给我一个在看、点赞、关注+赞赏。转载请注明出处。

word2vec简介

word2vec是2013年Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。在这之前词都是通过数值型编码,不能很好的表示词和词之间的关系。word2vec提出的词向量的概念,解决了这一问题。word2vec工具包含两种模型,ship-gram(跳字模型)和CBOW(词袋模型),前者的思想是通过中心词target预测周围词context,后者的思想是周围context预测中心词target。词向量的本质是通过上下文描述对该词赋予新的向量表示,该词本身或在文本词向量空间上不具备上下文语义。只不过词向量表示的词在空间上更容易计算词之间的关系。

one-hot编码

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。通俗来讲,就是在一个词典里(大小为N),给所有的词按序号进行整数编码,然后用N维向量,对应位置为1其余位置全为0表示。
举个栗子
考虑一下的三个特征:

[“male”, “female”]

[“from Europe”, “from US”, “from Asia”]

[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]

将它换成独热编码后,应该是:

feature1=[01,10]

feature2=[001,010,100]

feature3=[0001,0010,0100,1000]

  1. 优点 ,一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。
  2. 缺点,首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的),任何一对词的one-hot 向量的余弦相似度都为0;最后,它得到的特征是离散稀疏的,只有一位为1,其余位为0,极大浪费存储空间。

skip-gram模型

从直观上理解,Skip-Gram是给定input word来预测上下文。

在神经网络模型中,输入层输入一个词,经过隐藏层,再到输出层输出context词,输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。
原理介绍:跳字模型需要在给定一个中心词最大化的生成周围词的概率。
其本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量Vc,Uc。(一个词在文中可作为中心词Vc也可以作为背景词Uc)

CBOW模型


同理,CBOW也是计算在给出周围词最大化生成中心词的概率,不同的是用周围词的词向量的平均值作为周围词的主体向量。

Vc和Uc为模型参数,通过不断迭代更新,当损失函数最小时输出的参数即文本词对应的词向量。
该模型由于时间复杂度和文本大小有关,当文本过大时,计算量太大。于是提出两种优化方法,层序softmax负采样

Hierarchical SoftMax

层次Softmax的方法最早由Bengio在05年引入到语言模型中。它的基本思想是将复杂的归一化概率分解为一系列条件概率乘积的形式:

其中,每一层条件概率对应一个二分类问题,可以通过一个简单的逻辑回归函数去拟合。这样,我们将对V个词的概率归一化问题,转化成了对logV个词的概率拟合问题。我们可以通过构造一颗分类二叉树来直观地理解这个过程。首先,我们将原始字典D划分为两个子集D1、D2,并假设在给定context下,target word属于子集D1的概率p(wt∈D1|context)p(wt∈D1|context)服从logistical function的形式:

其中,UDroot和Vwt是模型参数
接下来,我们可以对子集D1和D2进一步划分。重复这一过程,直到集合里只剩下一个word。这样,我们就将原始大小为V的字典D转换成了一颗深度为logV的二叉树。树的叶子节点与原始字典里的word一一对应;非叶节点则对应着某一类word的集合。显然,从根节点出发到任意一个叶子节点都只有一条唯一路径——这条路径也编码了这个叶子节点所属的类别。同时,从根节点出发到叶子节点也是一个随机游走的过程。因此,我们可以基于这颗二叉树对叶子节点出现的似然概率进行计算。例如,对于训练样本里的一个target word Wt,假设其对应的二叉树编码为{1,0,1,…,1}{1,0,1,…,1},则我们构造的似然函数为:

乘积中的每一项都是一个逻辑回归的函数。我们可以通过最大化这个似然函数来求解二叉树上的参数——非叶节点上的向量,用来计算游走到某一个子节点的概率。
层次Softmax是一个很巧妙的模型。它通过构造一颗二叉树,将目标概率的计算复杂度从最初的V降低到了logV 的量级。不过付出的代价是人为增强了词与词之间的耦合性。例如,一个word出现的条件概率的变化,会影响到其路径上所有非叶节点的概率变化,间接地对其他word出现的条件概率带来不同程度的影响。因此,构造一颗有意义的二叉树就显得十分重要。实践证明,在实际的应用中,基于Huffman编码的二叉树可以满足大部分应用场景的需求。

Negative Sampling

负采样的思想最初来源于一种叫做Noise-Contrastive Estimation的算法[6],原本是为了解决那些无法归一化的概率模型的参数预估问题。与改造模型输出概率的Hierarchical Softmax算法不同,NCE算法改造的是模型的似然函数。
以Skip-gram模型为例,其原始的似然函数对应着一个Multinomial的分布。在用最大似然法求解这个似然函数时,我们得到一个cross-entropy的损失函数:

式中的p(wt+j|wt)p(wt+j|wt)是一个在整个字典上归一化了的概率。
而在NCE算法中,我们构造了这样一个问题:对于一组训练样本,我们想知道,target word的出现,是来自于context的驱动,还是一个事先假定的背景噪声的驱动?显然,我们可以用一个逻辑回归的函数来回答这个问题:

这个式子给出了一个target word w来自于context驱动的概率。其中,k是一个先验参数,表明噪声的采样频率。p(w|context)p(w|context)是一个非归一化的概率分布,这里采用softmax归一化函数中的分子部分。Pn(w)Pn(w)则是背景噪声的词分布。通常采用word的unigram分布
而Mikolov在2013年的论文里提出的负采样算法, 是NCE的一个简化版本。在这个算法里,Mikolov抛弃了NCE似然函数中对噪声分布的依赖,直接用原始softmax函数里的分子定义了逻辑回归的函数,进一步简化了计算:


图中Wk为噪声词,即不在同一个窗口内的词,Wk根据噪声词分布Pw(k)–预先设定,随机生成。

skip-gram在神经网络上的训练流程

神经网络中embedding层的作用——本质就是word2vec,数据降维,同时可以很方便计算同义词(各个word之间的距离),底层实现是2-gram(词频)+神经网络。

如何将一段文章的单词通过词向量来表示呢?

  • 提取文章中所有的单词,把其按照出现的次数降序(这里取50000个不同的单词),比如单词“xx”出现次数最多,就编号ID为0,以此类推…
  • 每个编号ID都可以使用50000维的二进制(onehot)表示。
  • 最后会产生一个矩阵M,行大小为词的个数50000,列大小为词向量的维度(通常取128或300),比如矩阵第一行就是编号ID=0,“xx”对应的词向量。

在Skip-Gram模型中,会随机初始化它,然后使用神经网络来训练这个权重矩阵
输入数据和标签是什么呢?输入数据是中间蓝色的词所对应的one-hot编码,标签是它附近词的one-hot编码(windown_size=2,左右各取2个)

就上述的Word2Vec中的demo而言,它的单词表大小为1000,词向量维度为300,所以embedding的参数input_dim=10000,output_dim=300。

假如单词表的大小为1000,词向量维度为2,经单词频数统计后,tom对应的id=4,而Jerry对应的id=20,经过转换,可以得到一个矩阵,tom对应矩阵第4行,取出该行的数据就是词向量。嵌入层就是将正整数(下标)转换为具有固定大小的向量,比如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]

模型细节

神经网络只能接受数值输入,我们不可能把一个单词字符串作为输入。最常用的办法就是基于训练文档来构建我们自己的词汇表(vocabulary)再对单词进行one-hot编码。

“The dog barked at the mailman”,那么我们基于这个句子,可以构建一个大小为5的词汇表(忽略大小写和标点符号):(“the”, “dog”, “barked”, “at”, “mailman”),我们对这个词汇表的单词进行编号0-4。那么”dog“就可以被表示为一个5维向量[0, 1, 0, 0, 0]。
模型的输入如果是10000维的向量(词汇表有10000个单词),输出也是一个10000维的向量,包含了10000个概率,每一个概率代表着当前词是输入样本中output word的概率大小。

隐层没有使用任何激活函数,但是输出层使用了sotfmax。

我们基于成对的单词来对神经网络进行训练,训练样本是 ( input word, output word ) 这样的单词对,input word和output word都是one-hot编码的向量。最终模型的输出是一个概率分布。input word和output word都会被我们进行one-hot编码。输入被one-hot编码后大多数维度上都是0(实际上仅有一个位置为1),所以向量稀疏,如果我们将一个1 x 10000的向量和10000 x 300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,隐层权重矩阵看成了一个”查找表“(lookup table),进行矩阵计算时,直接去查输入向量中取值为1的维度下对应的那些权重值。隐层的输出就是每个输入单词的“嵌入词向量”(Embedding Vector)。

经过神经网络隐层的计算,词从一个1 x 10000的向量变成1 x 300的向量,再被输入到输出层。输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),这些所有输出层神经元结点的概率之和为1。

训练样本为 (input word: “ants”, output word: “car”) 的计算示意图

以上是个人经过多方查阅资料和咨询,通过自己的理解写了一些对Word2Vec词向量的理解,不对的地方还请指出。如何你觉得对你有帮助,请给我一个在看、点赞、关注+赞赏。转载请注明出处。

Word2Vec深入浅出相关推荐

  1. NLP | 深入浅出word2vec

    1.word2vec简介 Word2Vec 是一种流行的无监督深度学习方法,用于学习语料库中单词的向量表示(也称为单词嵌入).Word2Vec 的目标是将单词映射到高维空间,使语义相似的单词在该空间中 ...

  2. [NLP] 深入浅出 word2vec 词向量详解

    Word2vec 词向量 前置知识:需要理解基本的MLP 多层感知机(全连接神经网络) 和DL.数学相关基础知识 One-hot encoding 独热编码 刚开始,人们用one-hot编码来表示词, ...

  3. 从零实现深度学习框架——深入浅出Word2vec(下)

    引言 本着"凡我不能创造的,我就不能理解"的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导. 要深入理解深度学 ...

  4. 06_1.Pytorch中如何表示字符串、word embedding、One - hot、Embedding(Word2vec、BERT、Glove)【学习总结】

    1.6.1.如何表示字符串 1.6.1.1.word embedding 1.6.1.1.1.文本表示(Representation) 1.6.1.1.2.独热编码 | one-hot represe ...

  5. 详解word2vec

    1.嵌入是用向量表示一个物体 2.用数值表示标识符,在机器学习领域称为词嵌入,也称分布式表示 3.词嵌入通常有两种方法--基于平台的Embedding学习,基于预训练模型 4.word2vec是最开始 ...

  6. word2vec及其优化

    1.算法背景: (1)N-gram:n-1阶的Markov模型,认为一个词出现的概率只与前面n-1个词相关:统计预料中各种词串(实际应用中最多采用n=3的词串长度)的出现次数,并做平滑处理(应对cou ...

  7. 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习

    深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习 文章目录 深入浅出图神经网络|GNN原理解析☄学习笔记(四)表示学习 表示学习 表示学习的意义 离散表示与分布式表示 端到端学习 基于重构损 ...

  8. 深入浅出系列1:词向量

    深入浅出系列1:词向量 0.文章结构 词向量简介 one-hot编码 统计语言模型 分布式表征和SVD分解 神经网络语言模型 word2vec fastText(新增文章补充,敬请期待) GloVe( ...

  9. 学习笔记四:word2vec和fasttext

    FastText:快速的文本分类器 文章目录 一.word2vec 1.1 word2vec为什么 不用现成的DNN模型 1.2 word2vec两种模型:CBOW和Skip-gram 1.2 wor ...

最新文章

  1. 快速排序及优化(Java实现)
  2. opencv入门 - 显示图像学习总结
  3. ITK:读写矢量图像
  4. 【数据结构与算法】之深入解析“灯泡开关”的求解思路与算法示例
  5. elasticsearch使用more_like_this实现基于内容的推荐
  6. 【机器学习】支持向量机面试知识点小结
  7. 查找发布地图的 REST URL并查询相关信息
  8. springmvc框架下的国内地区级联效果(共享一下给学习的小伙伴)
  9. mysql 名次语法规则_基于sql语句的一些常用语法积累总结
  10. 私有网络解决方案Start9 Labs完成120万美元融资,以推动其硬件Embassy后续发展
  11. 中国双重增亮膜(DBEF)市场趋势报告、技术动态创新及市场预测
  12. 步骤1:mybatis工程的创建
  13. HDU 2087 剪花布条 KMP入门
  14. matlab在机器视觉的应用实例,十个基于机器视觉的实用案例介绍
  15. 计算机和信息系统安全保密管理规定,信息系统安全和保密管理制度
  16. php 相似文章,PHP TF-IDF与余弦相似性计算文章相似性
  17. 游戏产业链:客户端游戏/网页游戏
  18. 服务器网口显示感叹号,业务服务器或更新服务器连接失败(认证失败,黄色感叹号)怎么回事?...
  19. MongoDB系列之添加账号和密码
  20. Pr速成3小时学会视频剪辑[副业学习会]

热门文章

  1. 获取设备管理器的信息
  2. 稳定状态模型 (一): 微分方程稳定性理论简介
  3. 通过alist挂在阿里网盘的方法
  4. ABC198 E - Unique Color(dfs)
  5. ORACLE 千万条的数据优化
  6. 韦乐平在信息港论坛上谈电信技术发展趋势
  7. 怎么进入游戏开发领域?
  8. 蚂蚁集团2022年分红派息438亿 马云井贤栋暂时不拿钱
  9. 网页logo SEO优化的写法
  10. 【AD18】原理图页面大小设置