word2vec and glove

传统方法

  • 假设我们有一个足够大的语料库(其中包含各种各样的句子,比如维基百科词库就是很好的语料来源)

  • 那么最笨(但很管用)的办法莫过于将语料库里的所有句子扫描一遍,挨个数出每个单词周围出现其它单词的次数,做成下面这样的表格就可以了。词频表

  • 假设矩阵是5W*5W维,矩阵运算量巨大。假设矩阵的每个数字都用标准32位Int表示,需要10,000,000,000个byte,也就是10GB的内存(且随着词汇量增加程平方倍增长,汉语常用词汇大约有20万个)。

  • 传统方法对于大规模语料,时空上的开销的难以接受。

  • 可以通过SVD化简,SVD的几何意义实际上是通过线性变换来找到最能表达矩阵信息的一组正交基。

    • 优点
      1. 训练速度很快
      2. 能够实现word embedding
    • 缺点
      1. 因为仅关注cooccurence,word vector包含的词向量语义信息有限,仅仅能进行词语相似度计算等有限的任务。

word2vec

  • 所需要的基础知识

    1. Hierarchical Softmax是用输出值的霍夫曼编码代替原本的One-Hot向量,用霍夫曼树替代Softmax的计算过程。
    2. Negative Sampling(简称NEG)使用随机采用替代Softmax计算概率,它是另一种更严谨的抽样模型NCE的简化版本。
  • 顾名思义,Word2Vec就是把单词转换成向量。它本质上是一种单词聚类的方法,是实现单词语义推测、句子情感分析等目的一种手段。

  • Word2Vec 的基本思想是把自然语言中的每一个词,表示成一个统一意义统一维度的短向量。

  • word2vec适合的情况就是对于一个序列的数据,在序列局部数据间存在着很强的关联。典型的就是文本的序列了,邻近的词之间关联很强,甚至可以通过一个词的上下文大概预测出中间那个词是什么。

  • 选取训练后的单词向量的其中任意3个维度,放到坐标系中展示,会发现语义相似的词汇在空间坐标中的位置会十分接近,而语义无关的词之间则相距较远。这种性质可以用来对单词和句子进行更加泛化的分析。
    词向量的三维空间表示

  • 一些研究还发现,计算有相似关系的单词之间的位移向量也会十分相似,例如从“Man”到“Wonman”的向量,与从“King”到“Queen”之间的向量几乎相同。
    词向量的词义关联

  • 至于向量中的每个维度具体是什么意义,没人知道,也无需知道,也许对应于世界上的一些最基本的概念。

  • 训练 Word2Vec 的思想,是利用一个词和它在文本中的上下文的词,这样就省去了人工去标注。

    • CBOW用环境词预测中心词,得到逻辑回归网络可以用来预测类似“一句话中缺少了一个单词,这个单词最可能是什么”这样的问题。CBOW

      1. 首先预处理数据,把所有需要进行训练的词汇编上序号,比如1-50000
      2. 随机初始化一个维度为50000x50的矩阵,作为待训练的嵌入矩阵
      3. 每次取出一个中心词和它的其中一个环境词(环境词市中心词前后的若干n个词,n越大效果越好,但速度越慢)
      4. 以环境词编号作行数,从词向量矩阵里取出这一行数据(50维向量)
      5. 将这个50维向量作为逻辑回归网络的输入,训练目标是中心词编号相应的One-Hot向量
        在训练的反向传播时计算,不但更新逻辑回归网络的权重矩阵,还要往前多传递一级,把取出的50维向量的值也根据目标梯度进行更新
      6. 将更新过的50维向量重新更新到嵌入矩阵相应的行
      7. 重复以上过程,直到所有的中心词都已经被遍历一遍,此时嵌入矩阵值的计算就完成了
    • Skip-gram 训练方法,它的做法是,将一个词所在的上下文中的词作为输出,而那个词本身作为输入,也就是说,给出一个词,希望预测可能出现的上下文的词。skip-gram

    • skip-gram 方法应用更广泛(训练数据较大时候效果比CBOW更好一点)

  • 一个人读书时,如果遇到了生僻的词,一般能根据上下文大概猜出生僻词的意思,而 Word2Vec 正是很好的捕捉了这种人类的行为。

  • 缺点:context 很小,没有使用全局的cooccur,所以实际上对cooccur的利用很少


GloVe

  • 问题:词义相近的词对贡献次数多,词义差得比较远的词对共现次数比较少,但其实他们的区分度并不明显。能否用共现之间的比值来增大区分度?

  • Motivation:对word-pair cooccur进行建模,拟合不同word-pair的cooccur之间的差异。


区别

  • 两者最直观的区别在于,word2vec是“predictive”的模型,而GloVe是“count-based”的模型。具体是什么意思呢?

  • 不采用 negative sampling 的word2vec 速度非常快,但是准确率仅有57.4%。

    • 只告诉模型什么是有关的,却不告诉它什么是无关的,模型很难对无关的词进行惩罚从而提高自己的准确率
    • 在python的gensim这个包里,gensim.models.word2vec.Word2Vec默认是不开启negative sampling的,需要开启的话请设置negative参数,如何设置文档中有明确说明gensim: models.word2vec
    • 当使用了negative sampling之后,为了将准确率提高到68.3%,word2vec就需要花较长的时间了(8h38m
  • 相比于word2vec,因为golve更容易并行化,所以速度更快,达到67.1%的准确率,只需要花4h12m。

  • 由于GloVe算法本身使用了全局信息,自然内存费的也就多一些,相比之下,word2vec在这方面节省了很多资源


参考文献

白话Word2Vec——简书

CBOW训练过程例子

Word Embeddings

GloVe

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
预训练词嵌入是一种常见的自然语言处理技术,它将单词映射到向量空间中的点,使得单词在语义上相近的点在向量空间中也相近。 Word2vecGloVe是两种常用的预训练词嵌入模型,可以通过使用Python中的gensim包来实现。 首先,我们需要准备一个文本语料库,可以是任何文本数据集。然后,我们可以使用gensim包中的Word2VecGloVe类来训练词嵌入模型。下面是一个简单的代码示例: ``` from gensim.models import Word2Vec from gensim.scripts.glove2word2vec import glove2word2vec from gensim.models import KeyedVectors # 使用Word2vec训练词嵌入模型 sentences = [['this', 'is', 'the', 'first', 'sentence'], ['this', 'is', 'the', 'second', 'sentence'], ['yet', 'another', 'sentence'], ['one', 'more', 'sentence'], ['and', 'the', 'final', 'sentence']] model_w2v = Word2Vec(sentences, size=100, min_count=1) # 使用GloVe训练词嵌入模型 glove_input_file = 'glove.6B.100d.txt' word2vec_output_file = 'glove.6B.100d.txt.word2vec' glove2word2vec(glove_input_file, word2vec_output_file) model_glove = KeyedVectors.load_word2vec_format(word2vec_output_file, binary=False) # 使用训练好的模型进行单词相似度计算 similarity_w2v = model_w2v.wv.similarity('first', 'second') similarity_glove = model_glove.similarity('first', 'second') print('Word2vec similarity:', similarity_w2v) print('GloVe similarity:', similarity_glove) ``` 以上代码中,我们首先使用Word2vec训练了一个词嵌入模型,然后使用GloVe训练了另一个模型。我们还使用gensim包中的similarity函数计算了两个模型中单词“first”和“second”的相似度。 需要注意的是,GloVe模型在训练过程中需要使用预训练的GloVe向量文件作为输入,因此我们需要先将GloVe向量文件转换为Word2vec格式,然后再使用KeyedVectors类加载模型。 总的来说,Word2vecGloVe是两种非常有用的预训练词嵌入技术,可以帮助我们更好地理解和处理自然语言数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值