word2vec

Google 于 2013 年开源推出的一个用于获取 word vector 的工具包(word2vec),
其中的两个训练模型(Skip-gram,CBOW)
两种加速的方法(Hierarchical Softmax,Negative Sampling)

  1. 作用:
    将所有词语投影到K维的向量空间,每个词语都可以用一个K维向量表示。
    由于它简洁,高效的特点,引起了人们的广泛关注,并应用在很多NLP任务中,用于训练相应的词向量
  2. 传统的词表示 — one-hot representation

向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词

  1. Distributed representation — word embedding
  • word2vec通过这种方法将词表示为向量,

即通过训练将词表示为限定维度K的实数向量,这种非稀疏表示的向量很容易求它们之间的距离(欧式、余弦等),从而判断词与词语义上的相似性,
解决了one-hot方法表示两个词之间的相互独立的问题

  • Distributed representation并不是word2vec诞生才有的, word2vec之所以会产生这么大的影响,是因为它采用了简化的模型,使得训练速度大为提升,让word embedding这项技术(也就是词的distributed representation)变得实用,能够应用在很多的任务上
  1. Skip-Gram model and CBOW model图
    在这里插入图片描述

CBOW和Skip-Gram的结构图能够看出,两个模型都包含三层结构,分别是输入层,投影层,输出层;
CBOW模型是在已知当前词上下文context的前提下预测当前词w(t),类似阅读理解中的完形填空;
而Skip-Gram模型恰恰相反,是在已知当前词w(t)的前提下,预测上下文context
对于CBOW和Skip-Gram两个模型,word2vec给出了两套框架,用于训练快而好的词向量,他们分别是Hierarchical Softmax 和 Negative Sampling

  1. Negative Sampling
    它是噪声对比损失函数NCE(Noise Contrastive Estimation)的简化版本,用于提高训练速度和提升词向量质量

假如训练样本中心词是w,它周围上下文共有2c个词,记为context(w)。
由于这个中心词w,和context(w)相关存在,因此它是一个真实的正例。
通过Negative Sampling进行负采样,得到neg(负采样的个数)个和w不同的中心词wi,i=1,2,…neg,这样context(w)和wi就组成了neg个并不真实存在的负例。
利用这一个正例和neg个负例,进行二元逻辑回归(可以理解成一个二分类问题),得到负采样对应每个词wi对应的模型参数以及每个词的词向量

  1. 如何进行负采样,得到neg个负例?
    word2vec采样的方法并不复杂,如果词汇表的大小为V,那么我们就将一段长度为1的线段分成V份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短(根据词频采样,出现的次数越多,负采样的概率越大)。每个词w的线段长度由下式决定:
    在这里插入图片描述
    在采样前,我们将这段长度为1的线段划分成M等份,这里M»V,保证每个词对应的线段都会划分成对应的小块,而M份中每一份都会落在某一个词对应的线段上(如下图),采样的时候,我们只需要随机生成neg个数,对应的位置就是采样的负例词。
    在这里插入图片描述
  2. Hierarchical Softmax
    如下图所示:网络结构很简单,仅包含三层网络结构,输入层,投影层,输出层。
    在这里插入图片描述

输入层到投影层是把输入层的所有向量进行加和给投影层,比如,输入的是三个4维词向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我们word2vec映射后的词向量就是(5,6,7,8),对CBOW模型来说,就是把上下文词向量加和,然而,对于Skip-Gram模型来说就是简单的传值。

最后的输出是构建一颗哈夫曼树,哈夫曼树的所有叶子节点是词表中的所有词,权值是每个词在词表中出现的次数,也就是词频。

一般得到哈夫曼树后我们会对叶子节点进行哈夫曼编码,
由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,
这样我们的高权重节点编码值较短,而低权重值编码值较长。
这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词(词频越高的词)拥有更短的编码,
一般的编码规则是左0右1,但是这都是人为规定的,
word2vec中正好采用了相反的编码规则,同时约定左子树的权重不小于右子树的权重。

如何“沿着哈夫曼树一步步完成”呢?

在word2vec中,采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(哈夫曼树编码1),沿着右子树走,那么就是正类(哈夫曼树编码0)。

使用哈夫曼树有什么好处呢?

首先,由于是二叉树,之前计算量为V,现在变成了log2V。

其次,由于使用哈夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值